00001 #ifndef MapRepr_HPP
00002 #define MapRepr_HPP
00003
00004 #include "common.hpp"
00005 #include "common/Edge.hpp"
00006 #include <vector>
00007 #include <iterator>
00008
00009
00010 namespace Bodon
00011 {
00017 class MapRepr : public std::map<item_t,void*>
00018 {
00019 public:
00020
00021 MapRepr():std::map<item_t,void*>(){}
00022
00023 std::map<item_t,void*>::iterator erase(
00024 std::map<item_t,void*>::iterator pos)
00025 {
00026 std::map<item_t,void*>::iterator return_it(pos);
00027 ++return_it;
00028 std::map<item_t,void*>::erase(pos);
00029 return return_it;
00030 }
00031 void* find(item_t label) const
00032 {
00033 std::map<item_t,void*>::const_iterator it(std::map<item_t,void*>::find(label));
00034 if(it == end() )
00035 return NULL;
00036 else
00037 return (*it).second;
00038
00039 }
00040
00041 void*& findOrCreate(item_t label)
00042 {
00043 return operator[](label);
00044 }
00045 bool lookup(item_t label, void*& subtrie) const;
00046 void insert(const std::vector<Edge>& new_edges);
00047
00048 static bool isLookupPreferred()
00049 {
00050 return true;
00051 }
00052 };
00053 inline bool MapRepr::lookup(item_t label, void*& subtrie) const
00054 {
00055 if( (*--end()).first < label)
00056 return false;
00057 else
00058 {
00059 std::map<item_t,void*>::const_iterator it(std::map<item_t,void*>::find(label));
00060 if( it == end() )
00061 subtrie = NULL;
00062 else
00063 subtrie = (*it).second;
00064 return true;
00065 }
00066 }
00067
00068 inline void MapRepr::insert(const std::vector<Edge>& new_edges)
00069 {
00070 for(std::vector<Edge>::const_iterator it = new_edges.begin();
00071 it != new_edges.end(); ++it)
00072 std::map<item_t,void*>::insert( end(), std::map<item_t,void*>::
00073 value_type((*it).first, (*it).second));
00074 }
00075 }
00076
00077 #endif