lemon/traits.h
author deba
Wed, 01 Mar 2006 10:25:30 +0000
changeset 1991 d7442141d9ef
parent 1979 c2992fd74dad
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.
deba@1719
     1
/* -*- C++ -*-
deba@1719
     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
deba@1719
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@1719
     8
 *
deba@1719
     9
 * Permission to use, modify and distribute this software is granted
deba@1719
    10
 * provided that this copyright notice appears in all copies. For
deba@1719
    11
 * precise terms see the accompanying LICENSE file.
deba@1719
    12
 *
deba@1719
    13
 * This software is provided "AS IS" with no warranty of any kind,
deba@1719
    14
 * express or implied, and with no claim as to its suitability for any
deba@1719
    15
 * purpose.
deba@1719
    16
 *
deba@1719
    17
 */
deba@1719
    18
deba@1719
    19
#ifndef LEMON_TRAITS_H
deba@1719
    20
#define LEMON_TRAITS_H
deba@1719
    21
deba@1719
    22
#include <lemon/utility.h>
deba@1719
    23
deba@1719
    24
///\file
deba@1719
    25
///\brief Traits for graphs and maps
deba@1719
    26
///
deba@1719
    27
deba@1719
    28
namespace lemon {
deba@1719
    29
  template <typename _Graph, typename _Item>
deba@1719
    30
  class ItemSetTraits {};
deba@1719
    31
  
deba@1989
    32
deba@1989
    33
  template <typename Graph, typename Enable = void>
deba@1989
    34
  struct NodeNotifierIndicator {
deba@1989
    35
    typedef InvalidType Type;
deba@1989
    36
  };
deba@1989
    37
  template <typename Graph>
deba@1989
    38
  struct NodeNotifierIndicator<
deba@1989
    39
    Graph, 
deba@1989
    40
    typename enable_if<typename Graph::NodeNotifier::Notifier, void>::type
deba@1989
    41
  > { 
deba@1989
    42
    typedef typename Graph::NodeNotifier Type;
deba@1989
    43
  };
deba@1989
    44
deba@1719
    45
  template <typename _Graph>
deba@1719
    46
  class ItemSetTraits<_Graph, typename _Graph::Node> {
deba@1719
    47
  public:
deba@1719
    48
    
deba@1719
    49
    typedef _Graph Graph;
deba@1719
    50
deba@1719
    51
    typedef typename Graph::Node Item;
deba@1719
    52
    typedef typename Graph::NodeIt ItemIt;
deba@1719
    53
deba@1989
    54
    typedef typename NodeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1989
    55
deba@1719
    56
    template <typename _Value>
deba@1719
    57
    class Map : public Graph::template NodeMap<_Value> {
deba@1719
    58
    public:
deba@1719
    59
      typedef typename Graph::template NodeMap<_Value> Parent; 
deba@1719
    60
      typedef typename Parent::Value Value;
deba@1719
    61
deba@1719
    62
      Map(const Graph& _graph) : Parent(_graph) {}
deba@1719
    63
      Map(const Graph& _graph, const Value& _value) 
deba@1719
    64
	: Parent(_graph, _value) {}
deba@1719
    65
deba@1989
    66
     };
deba@1989
    67
deba@1989
    68
  };
deba@1989
    69
deba@1989
    70
  template <typename Graph, typename Enable = void>
deba@1989
    71
  struct EdgeNotifierIndicator {
deba@1989
    72
    typedef InvalidType Type;
deba@1989
    73
  };
deba@1989
    74
  template <typename Graph>
deba@1989
    75
  struct EdgeNotifierIndicator<
deba@1989
    76
    Graph, 
deba@1989
    77
    typename enable_if<typename Graph::EdgeNotifier::Notifier, void>::type
deba@1989
    78
  > { 
deba@1989
    79
    typedef typename Graph::EdgeNotifier Type;
deba@1719
    80
  };
deba@1719
    81
deba@1719
    82
  template <typename _Graph>
deba@1719
    83
  class ItemSetTraits<_Graph, typename _Graph::Edge> {
deba@1719
    84
  public:
deba@1719
    85
    
deba@1719
    86
    typedef _Graph Graph;
deba@1719
    87
deba@1719
    88
    typedef typename Graph::Edge Item;
deba@1719
    89
    typedef typename Graph::EdgeIt ItemIt;
deba@1719
    90
deba@1989
    91
    typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1989
    92
deba@1719
    93
    template <typename _Value>
deba@1719
    94
    class Map : public Graph::template EdgeMap<_Value> {
deba@1719
    95
    public:
deba@1719
    96
      typedef typename Graph::template EdgeMap<_Value> Parent; 
deba@1719
    97
      typedef typename Parent::Value Value;
deba@1719
    98
deba@1719
    99
      Map(const Graph& _graph) : Parent(_graph) {}
deba@1719
   100
      Map(const Graph& _graph, const Value& _value) 
deba@1719
   101
	: Parent(_graph, _value) {}
deba@1719
   102
    };
deba@1719
   103
deba@1719
   104
  };
deba@1719
   105
deba@1989
   106
  template <typename Graph, typename Enable = void>
deba@1989
   107
  struct UEdgeNotifierIndicator {
deba@1989
   108
    typedef InvalidType Type;
deba@1989
   109
  };
deba@1989
   110
  template <typename Graph>
deba@1989
   111
  struct UEdgeNotifierIndicator<
deba@1989
   112
    Graph, 
deba@1989
   113
    typename enable_if<typename Graph::UEdgeNotifier::Notifier, void>::type
deba@1989
   114
  > { 
deba@1989
   115
    typedef typename Graph::UEdgeNotifier Type;
deba@1989
   116
  };
deba@1989
   117
deba@1719
   118
  template <typename _Graph>
klao@1909
   119
  class ItemSetTraits<_Graph, typename _Graph::UEdge> {
deba@1719
   120
  public:
deba@1719
   121
    
deba@1719
   122
    typedef _Graph Graph;
deba@1719
   123
klao@1909
   124
    typedef typename Graph::UEdge Item;
klao@1909
   125
    typedef typename Graph::UEdgeIt ItemIt;
deba@1719
   126
deba@1989
   127
    typedef typename UEdgeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1989
   128
deba@1719
   129
    template <typename _Value>
klao@1909
   130
    class Map : public Graph::template UEdgeMap<_Value> {
deba@1719
   131
    public:
klao@1909
   132
      typedef typename Graph::template UEdgeMap<_Value> Parent; 
deba@1719
   133
      typedef typename Parent::Value Value;
deba@1719
   134
deba@1719
   135
      Map(const Graph& _graph) : Parent(_graph) {}
deba@1719
   136
      Map(const Graph& _graph, const Value& _value) 
deba@1719
   137
	: Parent(_graph, _value) {}
deba@1719
   138
    };
deba@1719
   139
deba@1719
   140
  };
deba@1719
   141
deba@1989
   142
  template <typename Graph, typename Enable = void>
deba@1989
   143
  struct ANodeNotifierIndicator {
deba@1989
   144
    typedef InvalidType Type;
deba@1989
   145
  };
deba@1989
   146
  template <typename Graph>
deba@1989
   147
  struct ANodeNotifierIndicator<
deba@1989
   148
    Graph, 
deba@1989
   149
    typename enable_if<typename Graph::ANodeNotifier::Notifier, void>::type
deba@1989
   150
  > { 
deba@1989
   151
    typedef typename Graph::ANodeNotifier Type;
deba@1989
   152
  };
deba@1915
   153
deba@1915
   154
  template <typename _Graph>
deba@1915
   155
  class ItemSetTraits<_Graph, typename _Graph::ANode> {
deba@1915
   156
  public:
deba@1915
   157
    
deba@1915
   158
    typedef _Graph Graph;
deba@1915
   159
deba@1915
   160
    typedef typename Graph::ANode Item;
deba@1915
   161
    typedef typename Graph::ANodeIt ItemIt;
deba@1915
   162
deba@1989
   163
    typedef typename ANodeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1989
   164
deba@1915
   165
    template <typename _Value>
deba@1915
   166
    class Map : public Graph::template ANodeMap<_Value> {
deba@1915
   167
    public:
deba@1915
   168
      typedef typename Graph::template ANodeMap<_Value> Parent; 
deba@1915
   169
      typedef typename Parent::Value Value;
deba@1915
   170
deba@1915
   171
      Map(const Graph& _graph) : Parent(_graph) {}
deba@1915
   172
      Map(const Graph& _graph, const Value& _value) 
deba@1915
   173
	: Parent(_graph, _value) {}
deba@1915
   174
    };
deba@1915
   175
deba@1915
   176
  };
deba@1915
   177
deba@1989
   178
  template <typename Graph, typename Enable = void>
deba@1989
   179
  struct BNodeNotifierIndicator {
deba@1989
   180
    typedef InvalidType Type;
deba@1989
   181
  };
deba@1989
   182
  template <typename Graph>
deba@1989
   183
  struct BNodeNotifierIndicator<
deba@1989
   184
    Graph, 
deba@1989
   185
    typename enable_if<typename Graph::BNodeNotifier::Notifier, void>::type
deba@1989
   186
  > { 
deba@1989
   187
    typedef typename Graph::BNodeNotifier Type;
deba@1989
   188
  };
deba@1989
   189
deba@1915
   190
  template <typename _Graph>
deba@1915
   191
  class ItemSetTraits<_Graph, typename _Graph::BNode> {
deba@1915
   192
  public:
deba@1915
   193
    
deba@1915
   194
    typedef _Graph Graph;
deba@1915
   195
deba@1915
   196
    typedef typename Graph::BNode Item;
deba@1915
   197
    typedef typename Graph::BNodeIt ItemIt;
deba@1915
   198
deba@1989
   199
    typedef typename BNodeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1989
   200
deba@1915
   201
    template <typename _Value>
deba@1915
   202
    class Map : public Graph::template BNodeMap<_Value> {
deba@1915
   203
    public:
deba@1915
   204
      typedef typename Graph::template BNodeMap<_Value> Parent; 
deba@1915
   205
      typedef typename Parent::Value Value;
deba@1915
   206
deba@1915
   207
      Map(const Graph& _graph) : Parent(_graph) {}
deba@1915
   208
      Map(const Graph& _graph, const Value& _value) 
deba@1915
   209
	: Parent(_graph, _value) {}
deba@1915
   210
    };
deba@1915
   211
deba@1915
   212
  };
deba@1915
   213
deba@1915
   214
deba@1719
   215
  template <typename Map, typename Enable = void>
deba@1719
   216
  struct MapTraits {
deba@1719
   217
    typedef False ReferenceMapTag;
deba@1719
   218
deba@1719
   219
    typedef typename Map::Key Key;
deba@1719
   220
    typedef typename Map::Value Value;
deba@1719
   221
deba@1790
   222
    typedef const Value ConstReturnValue;
deba@1790
   223
    typedef const Value ReturnValue;
deba@1719
   224
  };
deba@1719
   225
deba@1719
   226
  template <typename Map>
deba@1719
   227
  struct MapTraits<
deba@1719
   228
    Map, typename enable_if<typename Map::ReferenceMapTag, void>::type > 
deba@1719
   229
  {
deba@1719
   230
    typedef True ReferenceMapTag;
deba@1719
   231
    
deba@1719
   232
    typedef typename Map::Key Key;
deba@1719
   233
    typedef typename Map::Value Value;
deba@1719
   234
deba@1719
   235
    typedef typename Map::ConstReference ConstReturnValue;
deba@1719
   236
    typedef typename Map::Reference ReturnValue;
deba@1719
   237
deba@1719
   238
    typedef typename Map::ConstReference ConstReference; 
deba@1719
   239
    typedef typename Map::Reference Reference;
deba@1719
   240
 };
deba@1719
   241
deba@1719
   242
  // Indicators for the tags
deba@1719
   243
deba@1719
   244
  template <typename Graph, typename Enable = void>
deba@1719
   245
  struct NodeNumTagIndicator {
deba@1719
   246
    static const bool value = false;
deba@1719
   247
  };
deba@1719
   248
deba@1719
   249
  template <typename Graph>
deba@1719
   250
  struct NodeNumTagIndicator<
deba@1719
   251
    Graph, 
deba@1719
   252
    typename enable_if<typename Graph::NodeNumTag, void>::type
deba@1719
   253
  > {
deba@1719
   254
    static const bool value = true;
deba@1719
   255
  };
deba@1719
   256
deba@1719
   257
  template <typename Graph, typename Enable = void>
deba@1719
   258
  struct EdgeNumTagIndicator {
deba@1719
   259
    static const bool value = false;
deba@1719
   260
  };
deba@1719
   261
deba@1719
   262
  template <typename Graph>
deba@1719
   263
  struct EdgeNumTagIndicator<
deba@1719
   264
    Graph, 
deba@1719
   265
    typename enable_if<typename Graph::EdgeNumTag, void>::type
deba@1719
   266
  > {
deba@1719
   267
    static const bool value = true;
deba@1719
   268
  };
deba@1719
   269
deba@1719
   270
  template <typename Graph, typename Enable = void>
deba@1719
   271
  struct FindEdgeTagIndicator {
deba@1719
   272
    static const bool value = false;
deba@1719
   273
  };
deba@1719
   274
deba@1719
   275
  template <typename Graph>
deba@1719
   276
  struct FindEdgeTagIndicator<
deba@1719
   277
    Graph, 
deba@1719
   278
    typename enable_if<typename Graph::FindEdgeTag, void>::type
deba@1719
   279
  > {
deba@1719
   280
    static const bool value = true;
deba@1719
   281
  };
deba@1719
   282
deba@1979
   283
  template <typename Graph, typename Enable = void>
deba@1979
   284
  struct UndirectedTagIndicator {
deba@1979
   285
    static const bool value = false;
deba@1979
   286
  };
deba@1979
   287
deba@1979
   288
  template <typename Graph>
deba@1979
   289
  struct UndirectedTagIndicator<
deba@1979
   290
    Graph, 
deba@1979
   291
    typename enable_if<typename Graph::UndirectedTag, void>::type
deba@1979
   292
  > {
deba@1979
   293
    static const bool value = true;
deba@1979
   294
  };
deba@1979
   295
deba@1719
   296
deba@1719
   297
deba@1719
   298
}
deba@1719
   299
deba@1719
   300
#endif // LEMON_MAPS_H