contrib/gel/gmvl/gmvl_node_cache.cxx
Go to the documentation of this file.
00001 // This is gel/gmvl/gmvl_node_cache.cxx
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005 //:
00006 // \file
00007 // \author crossge@crd.ge.com
00008 
00009 #include "gmvl_node_cache.h"
00010 #include <vcl_iostream.h>
00011 
00012 // constructors and destructors
00013 gmvl_node_cache::gmvl_node_cache()
00014 {
00015 }
00016 
00017 gmvl_node_cache::~gmvl_node_cache()
00018 {
00019 }
00020 
00021 // trivial accessors
00022 void gmvl_node_cache::add( const gmvl_node_sptr node)
00023 {
00024   node->ref_= nodes_.size();
00025   nodes_.push_back( node);
00026 
00027   // add to cache
00028   bool found= false;
00029 
00030   for (unsigned int j=0; j< typecache_.size() && !found; ++j)
00031   {
00032     if (typecache_[j].first== node->type_)
00033     {
00034       typecache_[j].second.push_back( node);
00035       found= true;
00036     }
00037   }
00038 
00039   if (!found)
00040   {
00041     vcl_pair<vcl_string,vcl_vector<gmvl_node_sptr> > pair;
00042 
00043     pair.first= node->type_;
00044     pair.second.push_back( node);
00045 
00046     typecache_.push_back( pair);
00047   }
00048 }
00049 
00050 void gmvl_node_cache::remove( const gmvl_node_sptr node)
00051 {
00052   vcl_vector<gmvl_node_sptr> newnodes;
00053 
00054   for (unsigned int i=0; i< nodes_.size(); ++i)
00055   {
00056     if (nodes_[i].ptr()!= node.ptr())
00057     {
00058       nodes_[i]->ref_= newnodes.size();
00059       newnodes.push_back( nodes_[i]);
00060     }
00061   }
00062 
00063   nodes_= newnodes;
00064 
00065   rebuild();
00066 }
00067 
00068 bool gmvl_node_cache::cached( const gmvl_node_sptr node) const
00069 {
00070   return node->ref_!= -1;
00071 }
00072 
00073 // clever accessors
00074 
00075 vcl_vector<gmvl_node_sptr> gmvl_node_cache::get( const vcl_string type) const
00076 {
00077   vcl_vector<gmvl_node_sptr> empty;
00078 
00079   for (unsigned int i=0; i< typecache_.size(); ++i)
00080   {
00081     if (typecache_[i].first== type)
00082     {
00083       return typecache_[i].second;
00084     }
00085   }
00086 
00087   return empty;
00088 }
00089 
00090 void gmvl_node_cache::rebuild()
00091 {
00092   typecache_.clear();
00093 
00094   for (unsigned int i=0; i< nodes_.size(); ++i)
00095   {
00096     bool found= false;
00097 
00098     for (unsigned int j=0; j< typecache_.size() && !found; ++j)
00099     {
00100       if (typecache_[j].first== nodes_[i]->type_)
00101       {
00102         typecache_[j].second.push_back( nodes_[i]);
00103         found= true;
00104       }
00105     }
00106 
00107     if (!found)
00108     {
00109       vcl_pair<vcl_string,vcl_vector<gmvl_node_sptr> > pair;
00110 
00111       pair.first= nodes_[i]->type_;
00112       pair.second.push_back( nodes_[i]);
00113 
00114       typecache_.push_back( pair);
00115     }
00116   }
00117 }
00118 
00119 // input and output
00120 vcl_ostream &operator<<( vcl_ostream &os, const gmvl_node_cache &c)
00121 {
00122   for (unsigned int i=0; i< c.nodes_.size(); ++i)
00123     os << *c.nodes_[i] << ' ';
00124 
00125   return os;
00126 }