lemon/bits/vector_map.h
author deba
Wed, 01 Mar 2006 10:25:30 +0000
changeset 1991 d7442141d9ef
parent 1946 17eb3eaad9f8
child 1993 2115143eceea
permissions -rw-r--r--
The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.

The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.

The ResGraphAdaptor is based on this composition.
alpar@906
     1
/* -*- C++ -*-
alpar@906
     2
 *
alpar@1956
     3
 * This file is a part of LEMON, a generic C++ optimization library
alpar@1956
     4
 *
alpar@1956
     5
 * Copyright (C) 2003-2006
alpar@1956
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@1956
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
alpar@906
     8
 *
alpar@906
     9
 * Permission to use, modify and distribute this software is granted
alpar@906
    10
 * provided that this copyright notice appears in all copies. For
alpar@906
    11
 * precise terms see the accompanying LICENSE file.
alpar@906
    12
 *
alpar@906
    13
 * This software is provided "AS IS" with no warranty of any kind,
alpar@906
    14
 * express or implied, and with no claim as to its suitability for any
alpar@906
    15
 * purpose.
alpar@906
    16
 *
alpar@906
    17
 */
alpar@906
    18
alpar@921
    19
#ifndef LEMON_VECTOR_MAP_H
alpar@921
    20
#define LEMON_VECTOR_MAP_H
deba@822
    21
deba@822
    22
#include <vector>
klao@946
    23
#include <algorithm>
deba@822
    24
deba@1267
    25
#include <lemon/utility.h>
deba@1810
    26
#include <lemon/bits/map_extender.h>
deba@1307
    27
#include <lemon/bits/alteration_notifier.h>
deba@1669
    28
#include <lemon/concept_check.h>
deba@1669
    29
#include <lemon/concept/maps.h>
deba@822
    30
alpar@1946
    31
/// \ingroup graphmapfactory
deba@1669
    32
///
deba@822
    33
///\file
deba@822
    34
///\brief Vector based graph maps.
deba@822
    35
alpar@921
    36
namespace lemon {
deba@1669
    37
alpar@1946
    38
  /// \ingroup graphmapfactory
deba@1669
    39
  ///
deba@1669
    40
  /// \brief Graph map based on the std::vector storage.
deba@1669
    41
  ///
klao@946
    42
  /// The VectorMap template class is graph map structure what
deba@1910
    43
  /// automatically indates the map when a key is added to or erased from
klao@946
    44
  /// the map. This map factory uses the allocators to implement 
klao@946
    45
  /// the container functionality. This map factory
klao@946
    46
  /// uses the std::vector to implement the container function.
klao@946
    47
  ///
deba@1039
    48
  /// \param Registry The AlterationNotifier that will notify this map.
deba@1703
    49
  /// \param Item The item type of the graph items.
klao@946
    50
  /// \param Value The value type of the map.
klao@946
    51
  /// 
klao@946
    52
  /// \author Balazs Dezso
klao@946
    53
  	
deba@1267
    54
  template <
deba@1267
    55
    typename _Graph, 
deba@1267
    56
    typename _Item,    
deba@1267
    57
    typename _Value
deba@1267
    58
    >
deba@1039
    59
  class VectorMap : public AlterationNotifier<_Item>::ObserverBase {
deba@1719
    60
  private:
deba@1719
    61
		
deba@1719
    62
    /// The container type of the map.
deba@1719
    63
    typedef std::vector<_Value> Container;	
deba@1719
    64
deba@822
    65
  public:
deba@1703
    66
klao@946
    67
    /// The graph type of the map. 
klao@946
    68
    typedef _Graph Graph;
deba@1719
    69
    /// The reference map tag.
deba@1719
    70
    typedef True ReferenceMapTag;
deba@1719
    71
klao@946
    72
    /// The key type of the map.
alpar@987
    73
    typedef _Item Key;
klao@946
    74
    /// The value type of the map.
klao@946
    75
    typedef _Value Value;
deba@1719
    76
deba@1719
    77
    typedef AlterationNotifier<_Item> Registry;
deba@822
    78
deba@822
    79
    /// The map type.
deba@822
    80
    typedef VectorMap Map;
klao@946
    81
    /// The base class of the map.
klao@946
    82
    typedef typename Registry::ObserverBase Parent;
deba@822
    83
deba@822
    84
    /// The reference type of the map;
alpar@987
    85
    typedef typename Container::reference Reference;
deba@822
    86
    /// The pointer type of the map;
alpar@987
    87
    typedef typename Container::pointer Pointer;
deba@822
    88
deba@822
    89
    /// The const value type of the map.
alpar@987
    90
    typedef const Value ConstValue;
deba@822
    91
    /// The const reference type of the map;
alpar@987
    92
    typedef typename Container::const_reference ConstReference;
deba@822
    93
    /// The pointer type of the map;
alpar@987
    94
    typedef typename Container::const_pointer ConstPointer;
deba@822
    95
deba@1267
    96
deba@1703
    97
    /// \brief Constructor to attach the new map into the registry.
deba@1703
    98
    ///
deba@1703
    99
    /// It constructs a map and attachs it into the registry.
klao@946
   100
    /// It adds all the items of the graph to the map.
deba@980
   101
    VectorMap(const Graph& _g) : graph(&_g) {
deba@1039
   102
      attach(_g.getNotifier(_Item()));
klao@946
   103
      build();
klao@946
   104
    }
deba@822
   105
deba@1703
   106
    /// \brief Constructor uses given value to initialize the map. 
deba@1703
   107
    ///
deba@1703
   108
    /// It constructs a map uses a given value to initialize the map. 
klao@946
   109
    /// It adds all the items of the graph to the map.
deba@980
   110
    VectorMap(const Graph& _g, const Value& _v) : graph(&_g) { 
deba@1039
   111
      attach(_g.getNotifier(_Item()));
deba@980
   112
      container.resize(graph->maxId(_Item()) + 1, _v);
klao@946
   113
    }
deba@822
   114
deba@1703
   115
    /// \brief Copy constructor
deba@1703
   116
    ///
deba@1703
   117
    /// Copy constructor.
deba@1374
   118
    VectorMap(const VectorMap& _copy) 
deba@1374
   119
      : Parent(), graph(_copy.getGraph()) {
deba@980
   120
      if (_copy.attached()) {
deba@980
   121
	attach(*_copy.getRegistry());
deba@980
   122
	container = _copy.container;
deba@822
   123
      }
deba@822
   124
    }
deba@822
   125
deba@1703
   126
    /// \brief Destrcutor
deba@1703
   127
    ///
deba@1703
   128
    /// Destructor.
klao@946
   129
    virtual ~VectorMap() {
klao@946
   130
      if (attached()) {
klao@946
   131
	detach();
deba@822
   132
      }
klao@946
   133
    }
klao@946
   134
deba@1669
   135
deba@1669
   136
  private:
deba@1669
   137
deba@1669
   138
    VectorMap& operator=(const VectorMap&);
deba@1669
   139
deba@1669
   140
  protected:
deba@1669
   141
deba@1669
   142
    using Parent::attach;
deba@1669
   143
    using Parent::detach;
deba@1669
   144
    using Parent::attached;
deba@1669
   145
klao@946
   146
    const Graph* getGraph() const {
klao@946
   147
      return graph;
deba@822
   148
    }
deba@937
   149
deba@1669
   150
  public:
deba@1669
   151
deba@1703
   152
    /// \brief The subcript operator.
deba@1703
   153
    ///
klao@946
   154
    /// The subscript operator. The map can be subscripted by the
deba@1703
   155
    /// actual items of the graph.      
alpar@987
   156
    Reference operator[](const Key& key) {
deba@980
   157
      return container[graph->id(key)];
deba@822
   158
    } 
deba@822
   159
		
deba@1703
   160
    /// \brief The const subcript operator.
deba@1703
   161
    ///
klao@946
   162
    /// The const subscript operator. The map can be subscripted by the
klao@946
   163
    /// actual items of the graph. 
alpar@987
   164
    ConstReference operator[](const Key& key) const {
deba@980
   165
      return container[graph->id(key)];
deba@822
   166
    }
deba@822
   167
deba@937
   168
deba@1703
   169
    /// \brief The setter function of the map.
deba@1703
   170
    ///
klao@946
   171
    /// It the same as operator[](key) = value expression.
alpar@987
   172
    void set(const Key& key, const Value& value) {
klao@946
   173
      (*this)[key] = value;
deba@822
   174
    }
klao@946
   175
deba@1669
   176
  protected:
deba@1669
   177
deba@1669
   178
    /// \brief Adds a new key to the map.
deba@1669
   179
    ///		
klao@946
   180
    /// It adds a new key to the map. It called by the observer registry
deba@1703
   181
    /// and it overrides the add() member function of the observer base.     
deba@1703
   182
    virtual void add(const Key& key) {
deba@980
   183
      int id = graph->id(key);
deba@822
   184
      if (id >= (int)container.size()) {
deba@822
   185
	container.resize(id + 1);
deba@822
   186
      }
deba@822
   187
    }
deba@937
   188
deba@1832
   189
    /// \brief Adds more new keys to the map.
deba@1832
   190
    ///		
deba@1832
   191
    /// It adds more new keys to the map. It called by the observer registry
deba@1832
   192
    /// and it overrides the add() member function of the observer base.     
deba@1832
   193
    virtual void add(const std::vector<Key>& keys) {
deba@1832
   194
      for (int i = 0; i < (int)keys.size(); ++i) {
deba@1832
   195
	add(keys[i]);
deba@1832
   196
      }
deba@1832
   197
    }
deba@1832
   198
deba@1703
   199
    /// \brief Erase a key from the map.
deba@1703
   200
    ///
klao@946
   201
    /// Erase a key from the map. It called by the observer registry
klao@946
   202
    /// and it overrides the erase() member function of the observer base.     
deba@1703
   203
    virtual void erase(const Key&) {}
deba@822
   204
deba@1832
   205
    /// \brief Erase more keys from the map.
deba@1832
   206
    ///
deba@1832
   207
    /// Erase more keys from the map. It called by the observer registry
deba@1832
   208
    /// and it overrides the erase() member function of the observer base.     
deba@1832
   209
    virtual void erase(const std::vector<Key>&) {}
deba@1832
   210
    
deba@1703
   211
    /// \brief Buildes the map.
deba@1703
   212
    ///	
klao@946
   213
    /// It buildes the map. It called by the observer registry
klao@946
   214
    /// and it overrides the build() member function of the observer base.
deba@1703
   215
    virtual void build() { 
deba@980
   216
      container.resize(graph->maxId(_Item()) + 1);
klao@946
   217
    }
deba@937
   218
deba@1703
   219
    /// \brief Clear the map.
deba@1703
   220
    ///
klao@946
   221
    /// It erase all items from the map. It called by the observer registry
klao@946
   222
    /// and it overrides the clear() member function of the observer base.     
deba@1703
   223
    virtual void clear() { 
deba@822
   224
      container.clear();
deba@822
   225
    }
deba@1267
   226
    
deba@822
   227
  private:
deba@822
   228
		
deba@822
   229
    Container container;
klao@946
   230
    const Graph *graph;
deba@822
   231
klao@946
   232
  };
klao@946
   233
deba@822
   234
}
deba@822
   235
deba@822
   236
#endif