deba@822: // -*- c++ -*- deba@822: #ifndef DEFAULT_MAP_H deba@822: #define DEFAULT_MAP_H deba@822: deba@822: deba@822: #include deba@822: #include deba@822: deba@822: ///\ingroup graphmaps deba@822: ///\file deba@822: ///\brief Graph maps that construates and destruates deba@822: ///their elements dynamically. deba@822: deba@822: namespace hugo { deba@822: deba@822: /// \addtogroup graphmaps deba@822: /// @{ deba@822: deba@822: /** The ArrayMap template class is graph map structure what deba@822: * automatically updates the map when a key is added to or erased from deba@822: * the map. This map uses the VectorMap if the ValueType is a primitive deba@822: * type and the ArrayMap for the other cases. deba@822: * deba@822: * The template parameter is the MapRegistry that the maps deba@822: * will belong to and the ValueType. deba@822: */ deba@822: deba@822: deba@822: /** Macro to implement the DefaultMap. deba@822: */ deba@822: #define DEFAULT_MAP_BODY(DynMap, Value) \ deba@822: { \ deba@822: typedef DynMap MapImpl; \ deba@822: \ deba@822: public: \ deba@822: \ deba@822: typedef typename MapRegistry::Graph Graph; \ deba@822: \ deba@822: DefaultMap() : MapImpl() {} \ deba@822: \ deba@822: DefaultMap(const Graph& g, MapRegistry& r) : MapImpl(g, r) {} \ deba@822: \ deba@822: DefaultMap(const Graph& g, MapRegistry& r, const Value& v) \ deba@822: : MapImpl(g, r, v) {} \ deba@822: \ deba@822: DefaultMap(const DefaultMap& copy) \ deba@822: : MapImpl(static_cast(copy)) {} \ deba@822: \ deba@822: template DefaultMap(const CMap& copy) : MapImpl(copy) {} \ deba@822: \ deba@822: DefaultMap& operator=(const DefaultMap& copy) { \ deba@822: MapImpl::operator=(static_cast(copy)); \ deba@822: return *this; \ deba@822: } \ deba@822: \ deba@822: template DefaultMap& operator=(const CMap& copy) { \ deba@822: MapImpl::operator=(copy); \ deba@822: return *this; \ deba@822: } \ deba@822: \ deba@822: }; deba@822: deba@822: deba@822: template deba@822: class DefaultMap : public ArrayMap deba@822: DEFAULT_MAP_BODY(ArrayMap, Type); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, bool); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, char); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, int); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, short); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, long); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, float); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, double); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, long double); deba@822: deba@822: template deba@822: class DefaultMap deba@822: : public VectorMap deba@822: DEFAULT_MAP_BODY(VectorMap, Type*); deba@822: deba@822: } deba@822: deba@822: #endif