Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
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 "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 //! Manages a pool of SketchData<T> instances
00019 
00020 template<typename T>
00021 class SketchPool : public SketchPoolRoot {
00022 public:
00023   //! this is made public so VisualRoutinesBehavior can access
00024   std::vector<SketchData<T>*> elements;
00025   
00026   //! Constructor
00027   SketchPool<T>(SketchSpace *_space, const std::string& _name, int poolsize = 0); 
00028   
00029   //! Destructor
00030   ~SketchPool<T>();
00031   
00032   //! Delete all sketches in the pool; commplain if refcount nonzero.  Used by destructor and by SketchSpace::resize()
00033   void deleteElements();
00034 
00035   //!  Make all sketches non-viewable, hence reclaimable when refcount drops to zero
00036   void clear();
00037 
00038   SketchData<T>* getFreeElement(void); 
00039   
00040   SketchData<T>* findSketchData(const std::string &name);
00041 
00042   //! Returns a list of the valid SketchData's in this pool.
00043   std::string getSketchListForGUI();
00044   
00045   //! Returns a copy of the sketch with specified ID, null if no such Sketch.
00046   SketchDataRoot* retrieveSketch(int id);
00047   
00048   void dumpPool() const;
00049 
00050  private:
00051   // typename for iteration over elements
00052   typedef typename std::vector<SketchData<T>*>::const_iterator CI;
00053 
00054   SketchPool(const SketchPool&); //<! never call this
00055   SketchPool& operator=(const SketchPool&); //!< never call this
00056 };
00057 
00058 // **************** Implementation ****************
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     cout << "clear " << (*it)->space->name << "  " << (*it)->id
00091    << " " << (*it)->name << " refcount=" << (*it)->refcount
00092    << " refreshTag=" << (*it)->refreshTag
00093    << " refCntr=" << getRefreshCounter()
00094    << " viewable=" << (*it)->viewable
00095    << " clrpend=" << (*it)->clearPending << endl;
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 } // namespace
00177 
00178 #endif

DualCoding 4.0
Generated Thu Nov 22 00:52:36 2007 by Doxygen 1.5.4