lemon/bits/traits.h
author Alpar Juttner <alpar@cs.elte.hu>
Thu, 24 Jan 2008 17:36:45 +0000
changeset 98 c4582fc14f58
child 107 31a2e6d28f61
permissions -rw-r--r--
Merge path_utils.h into path.h
     1 
     2 /* -*- C++ -*-
     3  *
     4  * This file is a part of LEMON, a generic C++ optimization library
     5  *
     6  * Copyright (C) 2003-2007
     7  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     8  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     9  *
    10  * Permission to use, modify and distribute this software is granted
    11  * provided that this copyright notice appears in all copies. For
    12  * precise terms see the accompanying LICENSE file.
    13  *
    14  * This software is provided "AS IS" with no warranty of any kind,
    15  * express or implied, and with no claim as to its suitability for any
    16  * purpose.
    17  *
    18  */
    19 
    20 #ifndef LEMON_BITS_TRAITS_H
    21 #define LEMON_BITS_TRAITS_H
    22 
    23 #include <lemon/bits/utility.h>
    24 
    25 ///\file
    26 ///\brief Traits for graphs and maps
    27 ///
    28 
    29 namespace lemon {
    30   template <typename _Graph, typename _Item>
    31   class ItemSetTraits {};
    32   
    33 
    34   template <typename Graph, typename Enable = void>
    35   struct NodeNotifierIndicator {
    36     typedef InvalidType Type;
    37   };
    38   template <typename Graph>
    39   struct NodeNotifierIndicator<
    40     Graph, 
    41     typename enable_if<typename Graph::NodeNotifier::Notifier, void>::type
    42   > { 
    43     typedef typename Graph::NodeNotifier Type;
    44   };
    45 
    46   template <typename _Graph>
    47   class ItemSetTraits<_Graph, typename _Graph::Node> {
    48   public:
    49     
    50     typedef _Graph Graph;
    51 
    52     typedef typename Graph::Node Item;
    53     typedef typename Graph::NodeIt ItemIt;
    54 
    55     typedef typename NodeNotifierIndicator<Graph>::Type ItemNotifier;
    56 
    57     template <typename _Value>
    58     class Map : public Graph::template NodeMap<_Value> {
    59     public:
    60       typedef typename Graph::template NodeMap<_Value> Parent; 
    61       typedef typename Graph::template NodeMap<_Value> Type; 
    62       typedef typename Parent::Value Value;
    63 
    64       Map(const Graph& _digraph) : Parent(_digraph) {}
    65       Map(const Graph& _digraph, const Value& _value) 
    66 	: Parent(_digraph, _value) {}
    67 
    68      };
    69 
    70   };
    71 
    72   template <typename Graph, typename Enable = void>
    73   struct ArcNotifierIndicator {
    74     typedef InvalidType Type;
    75   };
    76   template <typename Graph>
    77   struct ArcNotifierIndicator<
    78     Graph, 
    79     typename enable_if<typename Graph::ArcNotifier::Notifier, void>::type
    80   > { 
    81     typedef typename Graph::ArcNotifier Type;
    82   };
    83 
    84   template <typename _Graph>
    85   class ItemSetTraits<_Graph, typename _Graph::Arc> {
    86   public:
    87     
    88     typedef _Graph Graph;
    89 
    90     typedef typename Graph::Arc Item;
    91     typedef typename Graph::ArcIt ItemIt;
    92 
    93     typedef typename ArcNotifierIndicator<Graph>::Type ItemNotifier;
    94 
    95     template <typename _Value>
    96     class Map : public Graph::template ArcMap<_Value> {
    97     public:
    98       typedef typename Graph::template ArcMap<_Value> Parent; 
    99       typedef typename Graph::template ArcMap<_Value> Type; 
   100       typedef typename Parent::Value Value;
   101 
   102       Map(const Graph& _digraph) : Parent(_digraph) {}
   103       Map(const Graph& _digraph, const Value& _value) 
   104 	: Parent(_digraph, _value) {}
   105     };
   106 
   107   };
   108 
   109   template <typename Graph, typename Enable = void>
   110   struct EdgeNotifierIndicator {
   111     typedef InvalidType Type;
   112   };
   113   template <typename Graph>
   114   struct EdgeNotifierIndicator<
   115     Graph, 
   116     typename enable_if<typename Graph::EdgeNotifier::Notifier, void>::type
   117   > { 
   118     typedef typename Graph::EdgeNotifier Type;
   119   };
   120 
   121   template <typename _Graph>
   122   class ItemSetTraits<_Graph, typename _Graph::Edge> {
   123   public:
   124     
   125     typedef _Graph Graph;
   126 
   127     typedef typename Graph::Edge Item;
   128     typedef typename Graph::EdgeIt ItemIt;
   129 
   130     typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier;
   131 
   132     template <typename _Value>
   133     class Map : public Graph::template EdgeMap<_Value> {
   134     public:
   135       typedef typename Graph::template EdgeMap<_Value> Parent; 
   136       typedef typename Graph::template EdgeMap<_Value> Type; 
   137       typedef typename Parent::Value Value;
   138 
   139       Map(const Graph& _digraph) : Parent(_digraph) {}
   140       Map(const Graph& _digraph, const Value& _value) 
   141 	: Parent(_digraph, _value) {}
   142     };
   143 
   144   };
   145 
   146   template <typename Map, typename Enable = void>
   147   struct MapTraits {
   148     typedef False ReferenceMapTag;
   149 
   150     typedef typename Map::Key Key;
   151     typedef typename Map::Value Value;
   152 
   153     typedef const Value ConstReturnValue;
   154     typedef const Value ReturnValue;
   155   };
   156 
   157   template <typename Map>
   158   struct MapTraits<
   159     Map, typename enable_if<typename Map::ReferenceMapTag, void>::type > 
   160   {
   161     typedef True ReferenceMapTag;
   162     
   163     typedef typename Map::Key Key;
   164     typedef typename Map::Value Value;
   165 
   166     typedef typename Map::ConstReference ConstReturnValue;
   167     typedef typename Map::Reference ReturnValue;
   168 
   169     typedef typename Map::ConstReference ConstReference; 
   170     typedef typename Map::Reference Reference;
   171  };
   172 
   173   template <typename MatrixMap, typename Enable = void>
   174   struct MatrixMapTraits {
   175     typedef False ReferenceMapTag;
   176 
   177     typedef typename MatrixMap::FirstKey FirstKey;
   178     typedef typename MatrixMap::SecondKey SecondKey;
   179     typedef typename MatrixMap::Value Value;
   180 
   181     typedef const Value ConstReturnValue;
   182     typedef const Value ReturnValue;
   183   };
   184 
   185   template <typename MatrixMap>
   186   struct MatrixMapTraits<
   187     MatrixMap, typename enable_if<typename MatrixMap::ReferenceMapTag, 
   188                                   void>::type > 
   189   {
   190     typedef True ReferenceMapTag;
   191     
   192     typedef typename MatrixMap::FirstKey FirstKey;
   193     typedef typename MatrixMap::SecondKey SecondKey;
   194     typedef typename MatrixMap::Value Value;
   195 
   196     typedef typename MatrixMap::ConstReference ConstReturnValue;
   197     typedef typename MatrixMap::Reference ReturnValue;
   198 
   199     typedef typename MatrixMap::ConstReference ConstReference; 
   200     typedef typename MatrixMap::Reference Reference;
   201  };
   202 
   203   // Indicators for the tags
   204 
   205   template <typename Graph, typename Enable = void>
   206   struct NodeNumTagIndicator {
   207     static const bool value = false;
   208   };
   209 
   210   template <typename Graph>
   211   struct NodeNumTagIndicator<
   212     Graph, 
   213     typename enable_if<typename Graph::NodeNumTag, void>::type
   214   > {
   215     static const bool value = true;
   216   };
   217 
   218   template <typename Graph, typename Enable = void>
   219   struct ArcNumTagIndicator {
   220     static const bool value = false;
   221   };
   222 
   223   template <typename Graph>
   224   struct ArcNumTagIndicator<
   225     Graph, 
   226     typename enable_if<typename Graph::ArcNumTag, void>::type
   227   > {
   228     static const bool value = true;
   229   };
   230 
   231   template <typename Graph, typename Enable = void>
   232   struct FindArcTagIndicator {
   233     static const bool value = false;
   234   };
   235 
   236   template <typename Graph>
   237   struct FindArcTagIndicator<
   238     Graph, 
   239     typename enable_if<typename Graph::FindArcTag, void>::type
   240   > {
   241     static const bool value = true;
   242   };
   243 
   244   template <typename Graph, typename Enable = void>
   245   struct UndirectedTagIndicator {
   246     static const bool value = false;
   247   };
   248 
   249   template <typename Graph>
   250   struct UndirectedTagIndicator<
   251     Graph, 
   252     typename enable_if<typename Graph::UndirectedTag, void>::type
   253   > {
   254     static const bool value = true;
   255   };
   256 
   257   template <typename Graph, typename Enable = void>
   258   struct BuildTagIndicator {
   259     static const bool value = false;
   260   };
   261 
   262   template <typename Graph>
   263   struct BuildTagIndicator<
   264     Graph, 
   265     typename enable_if<typename Graph::BuildTag, void>::type
   266   > {
   267     static const bool value = true;
   268   };
   269 
   270 }
   271 
   272 #endif