Go to the documentation of this file.00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008
00009 #include "gmvl_node_cache.h"
00010 #include <vcl_iostream.h>
00011
00012
00013 gmvl_node_cache::gmvl_node_cache()
00014 {
00015 }
00016
00017 gmvl_node_cache::~gmvl_node_cache()
00018 {
00019 }
00020
00021
00022 void gmvl_node_cache::add( const gmvl_node_sptr node)
00023 {
00024 node->ref_= nodes_.size();
00025 nodes_.push_back( node);
00026
00027
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
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
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 }