00001 #if !defined(ELEM_LIST_H) 00002 #define ELEM_LIST_H 00003 00004 #include <cklists.h> 00005 00006 extern double elemlistaccTime; 00007 00008 template <class T> 00009 class ElemList{ 00010 public: 00011 CkVec<T> *vec; 00012 ElemList(){ 00013 vec = new CkVec<T>(); 00014 } 00015 ~ElemList(){ 00016 delete vec; 00017 } 00018 ElemList(const ElemList &rhs){ 00019 vec = new CkVec<T>(); 00020 *this=rhs; 00021 } 00022 inline ElemList& operator=(const ElemList& rhs){ 00023 // vec = new CkVec<T>(); 00024 *vec = *(rhs.vec); 00025 return *this; 00026 } 00027 inline ElemList& operator+=(const ElemList& rhs){ 00028 /* 00029 add the new unique elements to the List 00030 */ 00031 double _start = CkWallTimer(); 00032 for(int i=0;i<rhs.vec->length();i++){ 00033 vec->push_back((*(rhs.vec))[i]); 00034 } 00035 // uniquify(); 00036 elemlistaccTime += (CkWallTimer() - _start); 00037 return *this; 00038 } 00039 ElemList(const T &val){ 00040 vec =new CkVec<T>(); 00041 vec->push_back(val); 00042 }; 00043 inline virtual void pup(PUP::er &p){ 00044 if(p.isUnpacking()){ 00045 vec = new CkVec<T>(); 00046 } 00047 pupCkVec(p,*vec); 00048 } 00049 }; 00050 00051 template <class T> 00052 class UniqElemList: public ElemList<T>{ 00053 public: 00054 UniqElemList(const T &val):ElemList<T>(val){}; 00055 UniqElemList():ElemList<T>(){}; 00056 inline void uniquify(){ 00057 CkVec<T> *lvec = this->vec; 00058 lvec->quickSort(8); 00059 if(lvec->length() != 0){ 00060 int count=0; 00061 for(int i=1;i<lvec->length();i++){ 00062 if((*lvec)[count] == (*lvec)[i]){ 00063 }else{ 00064 count++; 00065 if(i != count){ 00066 (*lvec)[count] = (*lvec)[i]; 00067 } 00068 } 00069 } 00070 lvec->resize(count+1); 00071 } 00072 } 00073 }; 00074 00075 00076 #endif