00001
00002 #ifndef INCLUDED_SketchPool_h
00003 #define INCLUDED_SketchPool_h
00004
00005 #include <vector>
00006 #include <iostream>
00007 #include <sstream>
00008
00009 #include "SketchPoolRoot.h"
00010 #include "Macrodefs.h"
00011
00012 namespace DualCoding {
00013
00014 class SketchSpace;
00015 class SketchDataRoot;
00016 template<class T> class SketchData;
00017
00018
00019
00020 template<typename T>
00021 class SketchPool : public SketchPoolRoot {
00022 public:
00023
00024 std::vector<SketchData<T>*> elements;
00025
00026
00027 SketchPool<T>(SketchSpace *_space, const std::string& _name, int poolsize = 0);
00028
00029
00030 ~SketchPool<T>();
00031
00032
00033 void deleteElements();
00034
00035
00036 void clear();
00037
00038 SketchData<T>* getFreeElement(void);
00039
00040 SketchData<T>* findSketchData(const std::string &name);
00041
00042
00043 std::string getSketchListForGUI();
00044
00045
00046 SketchDataRoot* retrieveSketch(int id);
00047
00048 void dumpPool() const;
00049
00050 private:
00051
00052 typedef typename std::vector<SketchData<T>*>::const_iterator CI;
00053
00054 SketchPool(const SketchPool&);
00055 SketchPool& operator=(const SketchPool&);
00056 };
00057
00058
00059
00060 template <class T>
00061 SketchPool<T>::SketchPool(SketchSpace *_space, const std::string& _name, int poolsize) :
00062 SketchPoolRoot(_space,_name),
00063 elements(std::vector<SketchData<T>*>(poolsize))
00064 {
00065 for (int i=0; i<poolsize; i++) {
00066 elements[i] = new SketchData<T>(space);
00067 };
00068 }
00069
00070 template <class T>
00071 SketchPool<T>::~SketchPool() {
00072 deleteElements();
00073 }
00074
00075 template <class T>
00076 void SketchPool<T>::deleteElements() {
00077 for (unsigned int i = 0; i < elements.size(); i++)
00078 if(elements[i]->refcount > 0)
00079 printf("ERROR in ~SketchPool<T>: Element %d [%p] has ref_count == %d != 0\n",
00080 i,elements[i],elements[i]->refcount);
00081 else
00082 delete elements[i];
00083 elements.clear();
00084 }
00085
00086 template <class T>
00087 void SketchPool<T>::clear() {
00088 for (CI it = elements.begin(); it != elements.end(); it++ ) {
00089
00090
00091
00092
00093
00094
00095
00096
00097 (*it)->setViewable(false);
00098 if ( (*it)->refreshTag < getRefreshCounter() )
00099 (*it)->clearPending = false;
00100 else
00101 (*it)->clearPending = true;
00102 }
00103 }
00104
00105 template <class T>
00106 SketchData<T>* SketchPool<T>::getFreeElement(void)
00107 {
00108 for (CI it = elements.begin(); it != elements.end(); it++ ) {
00109 if ( (*it)->refcount == 0 && (*it)->viewable == false && (*it)->clearPending == false )
00110 return *it;
00111 else if ( (*it)->refcount < 0 )
00112 std::cerr << "PROBLEM: negative refcount" << std::endl;
00113 };
00114 SketchData<T>* res = new SketchData<T>(space);
00115 elements.push_back(res);
00116 return res;
00117 }
00118
00119 template<class T>
00120 SketchData<T>* SketchPool<T>::findSketchData(const std::string &sketchname) {
00121 for (CI it = elements.begin(); it != elements.end(); it++ )
00122 if ( (*it)->refcount > 0 && (*it)->name == sketchname )
00123 return *it;
00124 return NULL;
00125 }
00126
00127
00128 template<class T>
00129 std::string SketchPool<T>::getSketchListForGUI()
00130 {
00131 std::ostringstream liststream;
00132 for ( unsigned int i = 0; i < elements.size(); i++ ) {
00133 if ( elements[i]->clearPending ) {
00134 elements[i]->setViewable(false);
00135 elements[i]->clearPending = false;
00136 }
00137 else if ( elements[i]->isViewable() ) {
00138 elements[i]->refreshTag = getRefreshCounter();
00139 liststream << "sketch" << std::endl;
00140 liststream << "id:" << (elements[i])->id << std::endl;
00141 liststream << "parentId:" << (elements[i])->parentId << std::endl;
00142 liststream << "name:" << (elements[i])->name << std::endl;
00143 liststream << "sketchtype:" << elements[i]->getType() << std::endl;
00144 liststream << "color:" << toString(elements[i]->color) << std::endl;
00145 liststream << "colormap:" << elements[i]->colormap << std::endl;
00146 }
00147 }
00148 return liststream.str();
00149 }
00150
00151 template <class T>
00152 SketchDataRoot* SketchPool<T>::retrieveSketch(int id)
00153 {
00154 for(unsigned int i = 0; i < elements.size(); i++)
00155 if(elements[i]->id == id)
00156 return elements[i];
00157 return NULL;
00158 }
00159
00160 template <class T>
00161 void SketchPool<T>::dumpPool() const {
00162 printf("%4s %2s %4s %5s %3s %2s (%s)\n",
00163 "num", "rf", "id", "pid","vis","cp",
00164 (getSpaceName()+"."+getName()).c_str());
00165 for(unsigned int i = 0; i < elements.size(); i++)
00166 printf("%4d %2d %4d %5d %1c %1c %s\n",
00167 i,
00168 (elements[i])->refcount,
00169 (elements[i])->id,
00170 (elements[i])->parentId,
00171 (elements[i])->viewable ? 'y' : 'n',
00172 (elements[i])->clearPending ? 'y' : 'n',
00173 (elements[i])->name.c_str());
00174 }
00175
00176 }
00177
00178 #endif