#pragma once
#include "base.h"
#include <map>
#include <vector>
using namespace std;
namespace mycell{
template<typename v>
class CellVectorMapEventsImpl
{
public:
typedef v val_t;
protected:
vector<map<col_t,v>*> vecrow_;
public:
~CellVectorMapEventsImpl()
{
for(vector<map<col_t,v>*>::iterator it=vecrow_.begin();it!=vecrow_.end();++it)
{
delete *it;
}
}
bool GetValue(size_t row,col_t col,val_t& val)const
{
//_ASSERT(row<vecrow_.size());
if(row<vecrow_.size()){
map<col_t,val_t>* prec=vecrow_[row];
if(prec){
map<col_t,v>::const_iterator it=prec->find(col);
if(it!=prec->end()){
val=it->second;
return true;
}
}
}
return false;
}
void SetValue(size_t row,col_t col,val_t const& val)
{
//_ASSERT(row<vecrow_.size());
if(row>=vecrow_.size())
vecrow_.resize(row+1);
map<col_t,val_t>* prec=vecrow_[row];
if(!prec){
prec=new map<col_t,val_t>;
prec->insert(make_pair(col,val));
}else{
(*prec)[col]=val;
}
vecrow_[row]=prec;
}
void ClearCellStyle(int row,int col)
{
if(row<vecrow_.size()){
map<col_t,val_t>* prec=vecrow_[row];
if(prec){
map<col_t,val_t>::iterator it=prec->find(col);
if(it!=prec->end()){
prec->erase(it);
}
if(prec->empty()){
delete prec;
vecrow_[row]=NULL;
}
}
}
}
public:
void OnRowDelete(int beg,int end)
{
}
void OnRowInsertFront(int row,int nCount)
{
}
void OnColDelete(int beg,int end)
{
}
void OnColInsertFront(int col,int nCount)
{
}
};
template</*typename row_t,typename col_t,*/typename v>
class Cell2MapEventsImpl
{
public:
//typedef row_t key1_t;
//typedef col_t key2_t;
typedef v val_t;
protected:
map<row_t,map<col_t,v>*> maps_;
public:
~Cell2MapEventsImpl()
{
for(map<row_t,map<col_t,v>*>::iterator it=maps_.begin();it!=maps_.end();++it)
{
delete it->second;
}
}
public:
bool GetValue(row_t row,col_t col,val_t& val)const
{
map<row_t,map<col_t,val_t>*>::const_iterator i=maps_.find(row);
if(i!=maps_.end()){
map<col_t,val_t>& mi=*i->second;
map<col_t,val_t>::const_iterator j=mi.find((col_t)col);
if(j!=mi.end()){
val = j->second;
return true;
}
}
return false;
}
void SetValue(row_t row,col_t col,val_t const& val)
{
map<row_t,map<col_t,val_t>*>::iterator row_iter=maps_.find(row);
if(row_iter==maps_.end()){
map<col_t,val_t>* pColMap=new map<col_t,val_t>;
pColMap->insert(make_pair((col_t)col,val));
maps_.insert(make_pair(row,pColMap));
}else{
map<col_t,val_t>* mi=row_iter->second;
(*mi)[(col_t)col]=val;
}
}
void ClearCellStyle(int row,int col)
{
map<row_t,map<col_t,val_t>*>::iterator row_iter=maps_.find(row);
if(row_iter!=maps_.end()){
map<col_t,val_t>* mi=row_iter->second;
map<col_t,val_t>::iterator col_iter=mi->find((col_t)col);
if(col_iter!=mi->end()){
mi->erase(col_iter);
if(mi->empty()){
delete mi;
maps_.erase(row_iter);
}
}
}
}
public:
void OnRowDelete(int beg,int end);
void OnRowInsertFront(int row,int nCount);
void OnColDelete(int beg,int end);
void OnColInsertFront(int col,int nCount);
};
template<typename v>
void Cell2MapEventsImpl<v>::OnRowDelete(int beg,int end)
{
_ASSERT(end>=beg);
//map<row_t,map<col_t,v>*> maps_;
typedef map<col_t,v>* second_t;
vector<pair<row_t,second_t> > vec;
int const cnt=end-beg+1;
for(map<row_t,second_t>::iterator it=maps_.begin();it!=maps_.end();)
{
if(it->first>=beg && it->first<=end){
maps_.erase(it);
it=maps_.begin();
continue;
}else if(it->first>end){
vec.push_back(make_pair(it->first-cnt,it->second));
maps_.erase(it);
it=maps_.begin();
continue;
}
++it;
}
for(vector<pair<row_t,second_t> >::const_iterator it=vec.begin();it!=vec.end();++it)
{
maps_.insert(*it);
}
}
template<typename v>
void Cell2MapEventsImpl<v>::OnRowInsertFront(int row,int nCount)
{
//map<row_t,map<col_t,v>*> maps_;
typedef map<col_t,v>* second_t;
vector<pair<row_t,second_t> > vecNew;
vector<pair<row_t,second_t> > vec;
for(map<row_t,second_t>::iterator it=maps_.begin();it!=maps_.end();)
{
row_t const _row=it->first;
if(_row>=row){
if(_row<row+nCount){//test
map<col_t,v>* pNew=new map<col_t,v>;
pNew->insert(it->second->begin(),it->second->end());
vecNew.push_back(make_pair(_row,pNew));
}
vec.push_back(make_pair(_row+nCount,it->second));
it=maps_.erase(it);
continue;
}
++it;
}
for(vector<pair<row_t,second_t> >::const_iterator _i=vec.begin();_i!=vec.end();++_i)
{
maps_.insert(*_i);
}
for(vector<pair<row_t,second_t> >::const_iterator _i=vecNew.begin();_i!=vecNew.end();++_i)
{
maps_.insert(*_i);
}
}
template<typename v>
void Cell2MapEventsImpl<v>::OnColDelete(int beg,int end)
{
_ASSERT(end>=beg);
int const cnt=end-beg+1;
typedef v second_t;
vector<pair<col_t,second_t> > vec;
for(map<row_t,map<col_t,second_t>*>::iterator it=maps_.begin();it!=maps_.end();++it)
{
for(map<col_t,second_t>::iterator i=it->second->begin();i!=it->second->end();)
{
if(i->first>=beg && i->first<=end){
i=it->second->erase(i);
continue;
}else if(i->first>end){
vec.push_back(make_pair(i->first-cnt,i->second));
i=it->second->erase(i);
continue;
}
++i;
}
for(vector<pair<col_t,second_t> >::const_iterator _i=vec.begin();_i!=vec.end();++_i)
{
it->second->insert(*_i);
}
vec.clear();
}
}
template<typename v>
void Cell2MapEventsImpl<v>::OnColInsertFront(int col,int nCount)
{
typedef v second_t;
vector<pair<col_t,second_t> > vec;
for(map<row_t,map<col_t,second_t>*>::iterator it=maps_.begin();it!=maps_.end();++it)
{
for(map<col_t,second_t>::iterator i=it->second->begin();i!=it->second->end();)
{
int const _col=i->first;
if(_col>=col){
if(_col<col+nCount)
vec.push_back(make_pair(_col,i->second));
vec.push_back(make_pair(_col+nCount,i->second));
i=it->second->erase(i);
continue;
}
++i;
}
for(vector<pair<col_t,second_t> >::const_iterator _i=vec.begin();_i!=vec.end();++_i)
{
it->second->insert(*_i);
}
vec.clear();
}
}
}//namespace mycell