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