deba@782: // -*- c++ -*- deba@782: #ifndef SYM_MAP_FACTORY_H deba@782: #define SYM_MAP_FACTORY_H deba@782: deba@782: namespace hugo { deba@782: deba@782: template deba@782: class SymEdgeIt : public EdgeIt { deba@782: public: deba@782: deba@782: SymEdgeIt() deba@782: : EdgeIt() {} deba@782: deba@782: SymEdgeIt(const Graph& graph) deba@798: : EdgeIt(graph) { deba@798: while ( n != -1 && (n & 1)) { deba@798: EdgeIt::operator++(); deba@798: } deba@798: } deba@782: deba@782: SymEdgeIt(Invalid invalid) deba@782: : EdgeIt(invalid) {} deba@782: deba@782: SymEdgeIt(const Graph& graph, Edge edge) deba@782: : EdgeIt(graph, edge) {} deba@782: deba@782: SymEdgeIt& operator++() { deba@782: EdgeIt::operator++(); deba@782: while ( n != -1 && (n & 1)) { deba@782: EdgeIt::operator++(); deba@782: } deba@782: return *this; deba@782: } deba@782: }; deba@782: deba@782: template class MapFactory> deba@782: class SymMapFactory { deba@782: deba@782: public: deba@782: deba@782: typedef typename MapRegistry::Graph Graph; alpar@786: typedef typename MapRegistry::KeyType KeyType; deba@782: typedef typename MapRegistry::KeyIt KeyIt; deba@782: deba@782: typedef typename MapRegistry::MapBase MapBase; deba@782: deba@782: template deba@782: class Map : public MapFactory::template Map { deba@782: deba@782: typedef typename MapFactory::template Map MapImpl; deba@782: public: deba@782: deba@782: typedef V Value; deba@782: deba@782: Map() : MapImpl() {} deba@782: deba@782: Map(const Graph& g, MapRegistry& r) : MapImpl(g, r) {} deba@782: deba@798: Map(const Graph& g, MapRegistry& r, const Value& v) deba@798: : MapImpl(g, r, v) {} deba@782: deba@782: Map(const Map& copy) : MapImpl(static_cast(copy)) {} deba@782: deba@782: template Map(const CMap& copy) : MapImpl(copy) {} deba@782: deba@782: Map& operator=(const Map& copy) { deba@782: MapImpl::operator=(static_cast(copy)); deba@782: return *this; deba@782: } deba@782: deba@782: template Map& operator=(const CMap& copy) { deba@782: MapImpl::operator=(copy); deba@782: return *this; deba@782: } deba@782: alpar@786: Value& operator[](const KeyType& key) { deba@782: int id = MapBase::getGraph()->id(key); deba@782: return MapImpl::operator[](id >> 1); deba@782: } deba@782: alpar@786: const Value& operator[](const KeyType& key) const { deba@782: int id = MapBase::getGraph()->id(key); deba@782: return MapImpl::operator[](id >> 1); deba@782: } deba@782: alpar@786: const Value& get(const KeyType& key) const { deba@782: int id = MapBase::getGraph()->id(key); deba@782: return MapImpl::operator[](id >> 1); deba@782: } deba@782: alpar@786: void set(const KeyType& key, const Value& val) { deba@782: int id = MapBase::getGraph()->id(key); deba@782: MapImpl::operator[](id >> 1) = val; deba@782: } deba@782: alpar@786: void add(const KeyType& key) { deba@782: int id = MapBase::getGraph()->id(key); deba@782: if (id & 1) return; deba@782: MapImpl::add(key); deba@782: } deba@782: alpar@786: void erase(const KeyType& key) { deba@782: int id = MapBase::getGraph()->id(key); deba@782: if (id & 1) return; deba@782: MapImpl::add(key); deba@782: } deba@782: deba@782: deba@782: }; deba@782: }; deba@782: } deba@782: #endif