lemon/bits/map_extender.h
author Akos Ladanyi <ladanyi@tmit.bme.hu>
Mon, 16 Jun 2008 14:57:02 +0100
changeset 175 4eb8900a865c
parent 57 c1acf0018c0a
child 209 765619b7cbb2
permissions -rw-r--r--
Reworked versioning.
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2008
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_BITS_MAP_EXTENDER_H
    20 #define LEMON_BITS_MAP_EXTENDER_H
    21 
    22 #include <iterator>
    23 
    24 #include <lemon/bits/traits.h>
    25 
    26 #include <lemon/concept_check.h>
    27 #include <lemon/concepts/maps.h>
    28 
    29 ///\file
    30 ///\brief Extenders for iterable maps.
    31 
    32 namespace lemon {
    33 
    34   /// \ingroup graphbits
    35   /// 
    36   /// \brief Extender for maps
    37   template <typename _Map>
    38   class MapExtender : public _Map {
    39   public:
    40 
    41     typedef _Map Parent;
    42     typedef MapExtender Map;
    43 
    44 
    45     typedef typename Parent::Graph Graph;
    46     typedef typename Parent::Key Item;
    47 
    48     typedef typename Parent::Key Key;
    49     typedef typename Parent::Value Value;
    50 
    51     class MapIt;
    52     class ConstMapIt;
    53 
    54     friend class MapIt;
    55     friend class ConstMapIt;
    56 
    57   public:
    58 
    59     MapExtender(const Graph& graph) 
    60       : Parent(graph) {}
    61 
    62     MapExtender(const Graph& graph, const Value& value) 
    63       : Parent(graph, value) {}
    64 
    65     MapExtender& operator=(const MapExtender& cmap) {
    66       return operator=<MapExtender>(cmap);
    67     }
    68 
    69     template <typename CMap>
    70     MapExtender& operator=(const CMap& cmap) {
    71       Parent::operator=(cmap);
    72       return *this;
    73     } 
    74 
    75     class MapIt : public Item {
    76     public:
    77       
    78       typedef Item Parent;
    79       typedef typename Map::Value Value;
    80       
    81       MapIt() {}
    82 
    83       MapIt(Invalid i) : Parent(i) { }
    84 
    85       explicit MapIt(Map& _map) : map(_map) {
    86         map.notifier()->first(*this);
    87       }
    88 
    89       MapIt(const Map& _map, const Item& item) 
    90 	: Parent(item), map(_map) {}
    91 
    92       MapIt& operator++() { 
    93 	map.notifier()->next(*this);
    94 	return *this; 
    95       }
    96       
    97       typename MapTraits<Map>::ConstReturnValue operator*() const {
    98 	return map[*this];
    99       }
   100 
   101       typename MapTraits<Map>::ReturnValue operator*() {
   102 	return map[*this];
   103       }
   104       
   105       void set(const Value& value) {
   106 	map.set(*this, value);
   107       }
   108       
   109     protected:
   110       Map& map;
   111       
   112     };
   113 
   114     class ConstMapIt : public Item {
   115     public:
   116 
   117       typedef Item Parent;
   118 
   119       typedef typename Map::Value Value;
   120       
   121       ConstMapIt() {}
   122 
   123       ConstMapIt(Invalid i) : Parent(i) { }
   124 
   125       explicit ConstMapIt(Map& _map) : map(_map) {
   126         map.notifier()->first(*this);
   127       }
   128 
   129       ConstMapIt(const Map& _map, const Item& item) 
   130 	: Parent(item), map(_map) {}
   131 
   132       ConstMapIt& operator++() { 
   133 	map.notifier()->next(*this);
   134 	return *this; 
   135       }
   136 
   137       typename MapTraits<Map>::ConstReturnValue operator*() const {
   138 	return map[*this];
   139       }
   140 
   141     protected:
   142       const Map& map;
   143     };
   144 
   145     class ItemIt : public Item {
   146     public:
   147       
   148       typedef Item Parent;
   149       
   150       ItemIt() {}
   151 
   152       ItemIt(Invalid i) : Parent(i) { }
   153 
   154       explicit ItemIt(Map& _map) : map(_map) {
   155         map.notifier()->first(*this);
   156       }
   157 
   158       ItemIt(const Map& _map, const Item& item) 
   159 	: Parent(item), map(_map) {}
   160 
   161       ItemIt& operator++() { 
   162 	map.notifier()->next(*this);
   163 	return *this; 
   164       }
   165 
   166     protected:
   167       const Map& map;
   168       
   169     };
   170   };
   171 
   172   /// \ingroup graphbits
   173   /// 
   174   /// \brief Extender for maps which use a subset of the items.
   175   template <typename _Graph, typename _Map>
   176   class SubMapExtender : public _Map {
   177   public:
   178 
   179     typedef _Map Parent;
   180     typedef SubMapExtender Map;
   181 
   182     typedef _Graph Graph;
   183 
   184     typedef typename Parent::Key Item;
   185 
   186     typedef typename Parent::Key Key;
   187     typedef typename Parent::Value Value;
   188 
   189     class MapIt;
   190     class ConstMapIt;
   191 
   192     friend class MapIt;
   193     friend class ConstMapIt;
   194 
   195   public:
   196 
   197     SubMapExtender(const Graph& _graph) 
   198       : Parent(_graph), graph(_graph) {}
   199 
   200     SubMapExtender(const Graph& _graph, const Value& _value) 
   201       : Parent(_graph, _value), graph(_graph) {}
   202 
   203     SubMapExtender& operator=(const SubMapExtender& cmap) {
   204       return operator=<MapExtender>(cmap);
   205     }
   206 
   207     template <typename CMap>
   208     SubMapExtender& operator=(const CMap& cmap) {
   209       checkConcept<concepts::ReadMap<Key, Value>, CMap>();
   210       Item it;
   211       for (graph.first(it); it != INVALID; graph.next(it)) {
   212         Parent::set(it, cmap[it]);
   213       }
   214       return *this;
   215     } 
   216 
   217     class MapIt : public Item {
   218     public:
   219       
   220       typedef Item Parent;
   221       typedef typename Map::Value Value;
   222       
   223       MapIt() {}
   224 
   225       MapIt(Invalid i) : Parent(i) { }
   226 
   227       explicit MapIt(Map& _map) : map(_map) {
   228         map.graph.first(*this);
   229       }
   230 
   231       MapIt(const Map& _map, const Item& item) 
   232 	: Parent(item), map(_map) {}
   233 
   234       MapIt& operator++() { 
   235 	map.graph.next(*this);
   236 	return *this; 
   237       }
   238       
   239       typename MapTraits<Map>::ConstReturnValue operator*() const {
   240 	return map[*this];
   241       }
   242 
   243       typename MapTraits<Map>::ReturnValue operator*() {
   244 	return map[*this];
   245       }
   246       
   247       void set(const Value& value) {
   248 	map.set(*this, value);
   249       }
   250       
   251     protected:
   252       Map& map;
   253       
   254     };
   255 
   256     class ConstMapIt : public Item {
   257     public:
   258 
   259       typedef Item Parent;
   260 
   261       typedef typename Map::Value Value;
   262       
   263       ConstMapIt() {}
   264 
   265       ConstMapIt(Invalid i) : Parent(i) { }
   266 
   267       explicit ConstMapIt(Map& _map) : map(_map) {
   268         map.graph.first(*this);
   269       }
   270 
   271       ConstMapIt(const Map& _map, const Item& item) 
   272 	: Parent(item), map(_map) {}
   273 
   274       ConstMapIt& operator++() { 
   275 	map.graph.next(*this);
   276 	return *this; 
   277       }
   278 
   279       typename MapTraits<Map>::ConstReturnValue operator*() const {
   280 	return map[*this];
   281       }
   282 
   283     protected:
   284       const Map& map;
   285     };
   286 
   287     class ItemIt : public Item {
   288     public:
   289       
   290       typedef Item Parent;
   291       
   292       ItemIt() {}
   293 
   294       ItemIt(Invalid i) : Parent(i) { }
   295 
   296       explicit ItemIt(Map& _map) : map(_map) {
   297         map.graph.first(*this);
   298       }
   299 
   300       ItemIt(const Map& _map, const Item& item) 
   301 	: Parent(item), map(_map) {}
   302 
   303       ItemIt& operator++() { 
   304 	map.graph.next(*this);
   305 	return *this; 
   306       }
   307 
   308     protected:
   309       const Map& map;
   310       
   311     };
   312     
   313   private:
   314 
   315     const Graph& graph;
   316     
   317   };
   318 
   319 }
   320 
   321 #endif