deba@1810: /* -*- C++ -*- deba@1810: * lemon/map_extender.h - Part of LEMON, a generic C++ optimization library deba@1810: * alpar@1875: * Copyright (C) 2006 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport deba@1810: * (Egervary Research Group on Combinatorial Optimization, EGRES). deba@1810: * deba@1810: * Permission to use, modify and distribute this software is granted deba@1810: * provided that this copyright notice appears in all copies. For deba@1810: * precise terms see the accompanying LICENSE file. deba@1810: * deba@1810: * This software is provided "AS IS" with no warranty of any kind, deba@1810: * express or implied, and with no claim as to its suitability for any deba@1810: * purpose. deba@1810: * deba@1810: */ deba@1810: deba@1810: #ifndef LEMON_BITS_MAP_EXTENDER_H deba@1810: #define LEMON_BITS_MAP_EXTENDER_H deba@1810: deba@1810: #include deba@1810: deba@1810: #include deba@1810: deba@1810: ///\file deba@1810: ///\brief Extenders for iterable maps. deba@1810: deba@1810: namespace lemon { deba@1810: deba@1810: template deba@1810: class IterableMapExtender : public _Map { deba@1810: public: deba@1810: deba@1810: typedef _Map Parent; deba@1810: typedef IterableMapExtender Map; deba@1810: deba@1810: alpar@1854: typedef typename Parent::Graph Graph; alpar@1854: typedef typename Parent::Key Item; deba@1810: alpar@1854: typedef typename Parent::Key Key; alpar@1854: typedef typename Parent::Value Value; deba@1810: deba@1810: class MapIt; deba@1810: class ConstMapIt; deba@1810: deba@1810: friend class MapIt; deba@1810: friend class ConstMapIt; deba@1810: deba@1810: protected: deba@1810: deba@1810: using Parent::getGraph; deba@1810: deba@1810: public: deba@1810: deba@1810: IterableMapExtender(const Graph& graph) : Parent(graph) {} deba@1810: deba@1810: IterableMapExtender(const Graph& graph, const Value& value) deba@1810: : Parent(graph, value) {} deba@1810: deba@1810: deba@1810: class MapIt : public ItemSetTraits::ItemIt { deba@1810: public: deba@1810: deba@1810: typedef typename ItemSetTraits::ItemIt Parent; deba@1810: deba@1810: typedef typename Map::Value Value; deba@1810: deba@1810: MapIt(Map& _map) : Parent(*_map.getGraph()), map(_map) {} deba@1810: deba@1810: typename MapTraits::ConstReturnValue operator*() const { deba@1810: return map[*this]; deba@1810: } deba@1810: deba@1810: typename MapTraits::ReturnValue operator*() { deba@1810: return map[*this]; deba@1810: } deba@1810: deba@1810: void set(const Value& value) { deba@1810: map.set(*this, value); deba@1810: } deba@1810: deba@1810: protected: deba@1810: Map& map; deba@1810: deba@1810: }; deba@1810: deba@1810: class ConstMapIt : public ItemSetTraits::ItemIt { deba@1810: public: deba@1810: deba@1810: typedef typename ItemSetTraits::ItemIt Parent; deba@1810: deba@1810: typedef typename Map::Value Value; deba@1810: deba@1810: ConstMapIt(const Map& _map) : Parent(*_map.getGraph()), map(_map) {} deba@1810: deba@1810: typename MapTraits::ConstReturnValue operator*() const { deba@1810: return map[*this]; deba@1810: } deba@1810: protected: deba@1810: const Map& map; deba@1810: }; deba@1810: deba@1810: class ItemIt : public ItemSetTraits::ItemIt { deba@1810: public: deba@1810: deba@1810: typedef typename ItemSetTraits::ItemIt Parent; deba@1810: deba@1810: ItemIt(Map& _map) : Parent(*_map.getGraph()) {} deba@1810: deba@1810: }; deba@1810: }; deba@1810: deba@1810: } deba@1810: deba@1810: #endif