Homepage Demos Overview Downloads Tutorials Reference
Credits

SketchPool.h

Go to the documentation of this file.
00001 //-*-c++-*-
00002 #ifndef INCLUDED_SketchPool_h
00003 #define INCLUDED_SketchPool_h
00004 
00005 #include <vector>
00006 #include <iostream>
00007 #include <sstream> // for ostringstream
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 //! Manages a pool of SketchData<T> instances
00021 
00022 template<typename T>
00023 class SketchPool : public SketchPoolRoot {
00024 public:
00025   //! this is made public so VisualRoutinesBehavior can access
00026   std::vector<SketchData<T>*> elements;
00027   
00028   SketchPool<T>(SketchSpace *_space, int poolsize = 0); 
00029   
00030   ~SketchPool<T>();
00031   
00032   //! called by SketchPool to clear out non-static Viewable Sketch's
00033   void clear();
00034 
00035   SketchData<T>* get_free_element(void); 
00036   
00037   SketchData<T>* findSketchData(const std::string &name);
00038 
00039   //! Returns a list of the valid SketchData's in this pool.
00040   std::string getSketchListForGUI();
00041   
00042   //! Returns a copy of the sketch with specified ID, null if no such Sketch.
00043   SketchDataRoot* retrieveSketch(int id);
00044   
00045   void dumpPool() const;
00046 
00047  private:
00048   // typename for iteration over elements
00049   typedef typename std::vector<SketchData<T>*>::const_iterator CI;
00050 
00051   SketchPool(const SketchPool&); //<! never call this
00052   SketchPool& operator=(const SketchPool&); //!< never call this
00053 };
00054 
00055 // **************** Implementation ****************
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     cout << "clear " << (*it)->space->name << "  " << (*it)->id
00083    << " " << (*it)->name << " refcount=" << (*it)->refcount
00084    << " refreshTag=" << (*it)->refreshTag
00085    << " refCntr=" << getRefreshCounter()
00086    << " viewable=" << (*it)->viewable
00087    << " clrpend=" << (*it)->clearPending << endl;
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 } // namespace
00166 
00167 #endif

DualCoding 3.0beta
Generated Wed Oct 4 00:01:54 2006 by Doxygen 1.4.7