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