COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/work/deba/map_utils.h @ 1032:9e903d3a1ef6

Last change on this file since 1032:9e903d3a1ef6 was 1032:9e903d3a1ef6, checked in by Balazs Dezso, 16 years ago

GraphReader? under construction
InversableMap?

File size: 2.3 KB
Line 
1/* -*- C++ -*-
2 * src/lemon/map_utils.h - Part of LEMON, a generic C++ optimization library
3 *
4 * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
5 * (Egervary Combinatorial Optimization Research Group, EGRES).
6 *
7 * Permission to use, modify and distribute this software is granted
8 * provided that this copyright notice appears in all copies. For
9 * precise terms see the accompanying LICENSE file.
10 *
11 * This software is provided "AS IS" with no warranty of any kind,
12 * express or implied, and with no claim as to its suitability for any
13 * purpose.
14 *
15 */
16
17///\ingroup gutils
18///\file
19///\brief Map utilities.
20
21#include <map>
22
23
24namespace lemon {
25
26  /// \addtogroup gutils
27  /// @{
28
29
30  /// \brief General inversable map type.
31
32  /// This type provides simple inversable map functions.
33  /// The InversableMap wraps an arbitrary ReadWriteMap
34  /// and if a key is setted to a new value then store it
35  /// in the inverse map.
36  template <
37    typename _Graph,
38    typename _Map,
39    template <typename, typename> class _InvMap = std::Map
40  >
41  class InversableMap : protected _Map {
42
43  public:
44
45    typename _Map Map;
46    typename _InvMap<Map::Value, Map::Key> InverseMap;
47   
48    typename _Map::Key Key;
49    typename _Map::Value Value;
50    typename _Map::ConstReference ConstReference;
51
52    /// Constructor.
53
54    /// Construct a new InversableMap for the graph.
55    ///
56    InversableMap(const Graph& graph) : Map(graph) {}
57   
58    /// The setter function of the map.
59
60    /// It sets the map and the inverse map
61    void set(const Key& key, const Value& val) {
62      Value oldval = Map::operator[](key);
63      InverseMap::iterator it = invMap.find(oldval);
64      if (it != invMap.end() && it->second == key) {
65        invMap.erase(it);
66      }     
67      invMap.insert(make_pair(val, key));
68      Map::set(key, val);
69    }
70
71    ConstReference operator[](const Key&) const {
72      return Map::operator[](key);
73    }
74
75    virtual void add(const Key&) {
76      Map::add(key);
77    }
78
79    virtual void erase(const Key&) {
80      Value val = Map::operator[](key);
81      InverseMap::iterator it = invMap.find(val);
82      if (it != invMap.end() && it->second == key) {
83        invMap.erase(it);
84      }
85      Map::erase(key);
86    }
87
88    const InverseMap& inverse() const {
89      return invMap;
90    }
91
92
93  private:
94    InverseMap invMap;   
95  };
96
97}
98
Note: See TracBrowser for help on using the repository browser.