deba@1810: /* -*- C++ -*-
deba@1810:  * lemon/map_extender.h - Part of LEMON, a generic C++ optimization library
deba@1810:  *
deba@1810:  * Copyright (C) 2005 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 <iterator>
deba@1810: 
deba@1810: #include <lemon/traits.h>
deba@1810: 
deba@1810: ///\file
deba@1810: ///\brief Extenders for iterable maps.
deba@1810: 
deba@1810: namespace lemon {
deba@1810: 
deba@1810:   template <typename _Map>
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: 
deba@1810:     typedef typename Map::Graph Graph;
deba@1810:     typedef typename Map::Key Item;
deba@1810: 
deba@1810:     typedef typename Map::Key Key;
deba@1810:     typedef typename Map::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<Graph, Item>::ItemIt {
deba@1810:     public:
deba@1810:       
deba@1810:       typedef typename ItemSetTraits<Graph, Item>::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<Map>::ConstReturnValue operator*() const {
deba@1810: 	return map[*this];
deba@1810:       }
deba@1810: 
deba@1810:       typename MapTraits<Map>::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<Graph, Key>::ItemIt {
deba@1810:     public:
deba@1810: 
deba@1810:       typedef typename ItemSetTraits<Graph, Key>::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<Map>::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<Graph, Key>::ItemIt {
deba@1810:     public:
deba@1810:       
deba@1810:       typedef typename ItemSetTraits<Graph, Key>::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