deba@798: // -*- c++ -*- deba@798: #ifndef DEFAULT_MAP_FACTORY_H deba@798: #define DEFAULT_MAP_FACTORY_H deba@798: deba@798: deba@798: #include deba@798: #include deba@798: deba@799: ///\ingroup graphmapfactory deba@799: ///\file deba@799: ///\brief Graph maps that construates and destruates deba@799: ///their elements dynamically. deba@799: deba@798: namespace hugo { deba@798: deba@799: /// \addtogroup graphmapfactory deba@799: /// @{ deba@799: deba@798: #define DEFAULT_MAP_BODY(Factory, Val) \ deba@798: { \ deba@798: typedef typename Factory::template Map MapImpl; \ deba@798: \ deba@798: public: \ deba@798: \ deba@798: typedef typename MapRegistry::Graph Graph; \ deba@799: typedef typename MapRegistry::KeyType KeyType; \ deba@798: typedef typename MapRegistry::KeyIt KeyIt; \ deba@798: typedef Val Value; \ deba@798: \ deba@798: typedef typename MapRegistry::MapBase MapBase; \ deba@798: \ deba@798: DefaultMap() : MapImpl() {} \ deba@798: \ deba@798: DefaultMap(const Graph& g, MapRegistry& r) : MapImpl(g, r) {} \ deba@798: \ deba@798: DefaultMap(const Graph& g, MapRegistry& r, const Value& v) \ deba@798: : MapImpl(g, r, v) {} \ deba@798: \ deba@798: DefaultMap(const DefaultMap& copy) \ deba@798: : MapImpl(static_cast(copy)) {} \ deba@798: \ deba@798: template DefaultMap(const CMap& copy) : MapImpl(copy) {} \ deba@798: \ deba@798: DefaultMap& operator=(const DefaultMap& copy) { \ deba@798: MapImpl::operator=(static_cast(copy)); \ deba@798: return *this; \ deba@798: } \ deba@798: \ deba@798: template DefaultMap& operator=(const CMap& copy) { \ deba@798: MapImpl::operator=(copy); \ deba@798: return *this; \ deba@798: } \ deba@798: \ deba@798: }; deba@798: deba@798: deba@798: template deba@798: class DefaultMap : public ArrayMapFactory::template Map deba@798: DEFAULT_MAP_BODY(ArrayMapFactory, Type); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, bool); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, char); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, int); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, short); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, long); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, float); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, double); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, long double); deba@798: deba@798: template deba@798: class DefaultMap deba@798: : public VectorMapFactory::template Map deba@798: DEFAULT_MAP_BODY(VectorMapFactory, Type*); deba@798: deba@799: deba@799: /** The DefaultMapFactory template class is a factory class deba@799: * to create maps for the edge and nodes. This map factory deba@799: * uses the VectorMapFactory if the ValueType is a primitive deba@799: * type and the ArrayMapFactory for the other cases. deba@799: * deba@799: * The template parameter is the MapRegistry that the maps deba@799: * will belong to. deba@799: */ deba@799: deba@798: template deba@798: class DefaultMapFactory { deba@798: deba@798: public: deba@799: /// The graph type of the maps. deba@798: typedef typename MapRegistry::Graph Graph; deba@799: /// The key type of the maps. deba@799: typedef typename MapRegistry::KeyType KeyType; deba@799: /// The iterator to iterate on the keys. deba@798: typedef typename MapRegistry::KeyIt KeyIt; deba@798: deba@799: /// The MapBase of the Map which imlements the core regisitry function. deba@798: typedef typename MapRegistry::MapBase MapBase; deba@799: deba@798: deba@799: /** The template Map type. deba@799: */ deba@798: template deba@798: class Map : public DefaultMap { deba@798: deba@798: typedef DefaultMap MapImpl; deba@798: deba@798: public: deba@798: deba@798: typedef V Value; deba@798: deba@799: /** Default constructor for the map. deba@799: */ deba@798: Map() : MapImpl() {} deba@798: deba@799: /** Graph and Registry initialized map constructor. deba@799: */ deba@798: Map(const Graph& g, MapRegistry& r) : MapImpl(g, r) {} deba@798: deba@799: /** Constructor to use default value to initialize the map. deba@799: */ deba@798: Map(const Graph& g, MapRegistry& r, const Value& v) : MapImpl(g, r, v) {} deba@798: deba@799: /** Constructor to copy a map of the same map type. deba@799: */ deba@798: Map(const Map& copy) : MapImpl(static_cast(copy)) {} deba@798: deba@799: /** Constructor to copy a map of an other map type. deba@799: */ deba@798: template Map(const CMap& copy) : MapImpl(copy) {} deba@798: deba@799: /** Assign operator to copy a map of the same map type. deba@799: */ deba@798: Map& operator=(const Map& copy) { deba@798: MapImpl::operator=(static_cast(copy)); deba@798: return *this; deba@798: } deba@798: deba@799: /** Assign operator to copy a map an other map type. deba@799: */ deba@798: template Map& operator=(const CMap& copy) { deba@798: MapImpl::operator=(copy); deba@798: return *this; deba@798: } deba@798: deba@798: }; deba@798: deba@798: }; deba@798: } deba@798: deba@798: #endif