lemon/bits/traits.h
author Alpar Juttner <alpar@cs.elte.hu>
Fri, 22 May 2015 17:48:24 +0200
branch1.3
changeset 1153 48a0d237db3c
parent 1026 699c7eac2c6d
permissions -rw-r--r--
Merge bugfix #598 to branch 1.3
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     5  * Copyright (C) 2003-2013
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_BITS_TRAITS_H
    20 #define LEMON_BITS_TRAITS_H
    21 
    22 //\file
    23 //\brief Traits for graphs and maps
    24 //
    25 
    26 #include <lemon/bits/enable_if.h>
    27 
    28 namespace lemon {
    29 
    30   struct InvalidType {};
    31 
    32   template <typename GR, typename _Item>
    33   class ItemSetTraits {};
    34 
    35 
    36   template <typename GR, typename Enable = void>
    37   struct NodeNotifierIndicator {
    38     typedef InvalidType Type;
    39   };
    40   template <typename GR>
    41   struct NodeNotifierIndicator<
    42     GR,
    43     typename enable_if<typename GR::NodeNotifier::Notifier, void>::type
    44   > {
    45     typedef typename GR::NodeNotifier Type;
    46   };
    47 
    48   template <typename GR>
    49   class ItemSetTraits<GR, typename GR::Node> {
    50   public:
    51 
    52     typedef GR Graph;
    53     typedef GR Digraph;
    54 
    55     typedef typename GR::Node Item;
    56     typedef typename GR::NodeIt ItemIt;
    57 
    58     typedef typename NodeNotifierIndicator<GR>::Type ItemNotifier;
    59 
    60     template <typename V>
    61     class Map : public GR::template NodeMap<V> {
    62       typedef typename GR::template NodeMap<V> Parent;
    63 
    64     public:
    65       typedef typename GR::template NodeMap<V> Type;
    66       typedef typename Parent::Value Value;
    67 
    68       Map(const GR& _digraph) : Parent(_digraph) {}
    69       Map(const GR& _digraph, const Value& _value)
    70         : Parent(_digraph, _value) {}
    71 
    72      };
    73 
    74   };
    75 
    76   template <typename GR, typename Enable = void>
    77   struct ArcNotifierIndicator {
    78     typedef InvalidType Type;
    79   };
    80   template <typename GR>
    81   struct ArcNotifierIndicator<
    82     GR,
    83     typename enable_if<typename GR::ArcNotifier::Notifier, void>::type
    84   > {
    85     typedef typename GR::ArcNotifier Type;
    86   };
    87 
    88   template <typename GR>
    89   class ItemSetTraits<GR, typename GR::Arc> {
    90   public:
    91 
    92     typedef GR Graph;
    93     typedef GR Digraph;
    94 
    95     typedef typename GR::Arc Item;
    96     typedef typename GR::ArcIt ItemIt;
    97 
    98     typedef typename ArcNotifierIndicator<GR>::Type ItemNotifier;
    99 
   100     template <typename V>
   101     class Map : public GR::template ArcMap<V> {
   102       typedef typename GR::template ArcMap<V> Parent;
   103 
   104     public:
   105       typedef typename GR::template ArcMap<V> Type;
   106       typedef typename Parent::Value Value;
   107 
   108       Map(const GR& _digraph) : Parent(_digraph) {}
   109       Map(const GR& _digraph, const Value& _value)
   110         : Parent(_digraph, _value) {}
   111     };
   112 
   113   };
   114 
   115   template <typename GR, typename Enable = void>
   116   struct EdgeNotifierIndicator {
   117     typedef InvalidType Type;
   118   };
   119   template <typename GR>
   120   struct EdgeNotifierIndicator<
   121     GR,
   122     typename enable_if<typename GR::EdgeNotifier::Notifier, void>::type
   123   > {
   124     typedef typename GR::EdgeNotifier Type;
   125   };
   126 
   127   template <typename GR>
   128   class ItemSetTraits<GR, typename GR::Edge> {
   129   public:
   130 
   131     typedef GR Graph;
   132     typedef GR Digraph;
   133 
   134     typedef typename GR::Edge Item;
   135     typedef typename GR::EdgeIt ItemIt;
   136 
   137     typedef typename EdgeNotifierIndicator<GR>::Type ItemNotifier;
   138 
   139     template <typename V>
   140     class Map : public GR::template EdgeMap<V> {
   141       typedef typename GR::template EdgeMap<V> Parent;
   142 
   143     public:
   144       typedef typename GR::template EdgeMap<V> Type;
   145       typedef typename Parent::Value Value;
   146 
   147       Map(const GR& _digraph) : Parent(_digraph) {}
   148       Map(const GR& _digraph, const Value& _value)
   149         : Parent(_digraph, _value) {}
   150     };
   151 
   152   };
   153 
   154   template <typename GR, typename Enable = void>
   155   struct RedNodeNotifierIndicator {
   156     typedef InvalidType Type;
   157   };
   158   template <typename GR>
   159   struct RedNodeNotifierIndicator<
   160     GR,
   161     typename enable_if<typename GR::RedNodeNotifier::Notifier, void>::type
   162   > {
   163     typedef typename GR::RedNodeNotifier Type;
   164   };
   165 
   166   template <typename GR>
   167   class ItemSetTraits<GR, typename GR::RedNode> {
   168   public:
   169 
   170     typedef GR BpGraph;
   171     typedef GR Graph;
   172     typedef GR Digraph;
   173 
   174     typedef typename GR::RedNode Item;
   175     typedef typename GR::RedNodeIt ItemIt;
   176 
   177     typedef typename RedNodeNotifierIndicator<GR>::Type ItemNotifier;
   178 
   179     template <typename V>
   180     class Map : public GR::template RedNodeMap<V> {
   181       typedef typename GR::template RedNodeMap<V> Parent;
   182 
   183     public:
   184       typedef typename GR::template RedNodeMap<V> Type;
   185       typedef typename Parent::Value Value;
   186 
   187       Map(const GR& _bpgraph) : Parent(_bpgraph) {}
   188       Map(const GR& _bpgraph, const Value& _value)
   189         : Parent(_bpgraph, _value) {}
   190 
   191      };
   192 
   193   };
   194 
   195   template <typename GR, typename Enable = void>
   196   struct BlueNodeNotifierIndicator {
   197     typedef InvalidType Type;
   198   };
   199   template <typename GR>
   200   struct BlueNodeNotifierIndicator<
   201     GR,
   202     typename enable_if<typename GR::BlueNodeNotifier::Notifier, void>::type
   203   > {
   204     typedef typename GR::BlueNodeNotifier Type;
   205   };
   206 
   207   template <typename GR>
   208   class ItemSetTraits<GR, typename GR::BlueNode> {
   209   public:
   210 
   211     typedef GR BpGraph;
   212     typedef GR Graph;
   213     typedef GR Digraph;
   214 
   215     typedef typename GR::BlueNode Item;
   216     typedef typename GR::BlueNodeIt ItemIt;
   217 
   218     typedef typename BlueNodeNotifierIndicator<GR>::Type ItemNotifier;
   219 
   220     template <typename V>
   221     class Map : public GR::template BlueNodeMap<V> {
   222       typedef typename GR::template BlueNodeMap<V> Parent;
   223 
   224     public:
   225       typedef typename GR::template BlueNodeMap<V> Type;
   226       typedef typename Parent::Value Value;
   227 
   228       Map(const GR& _bpgraph) : Parent(_bpgraph) {}
   229       Map(const GR& _bpgraph, const Value& _value)
   230         : Parent(_bpgraph, _value) {}
   231 
   232      };
   233 
   234   };
   235 
   236   template <typename Map, typename Enable = void>
   237   struct MapTraits {
   238     typedef False ReferenceMapTag;
   239 
   240     typedef typename Map::Key Key;
   241     typedef typename Map::Value Value;
   242 
   243     typedef Value ConstReturnValue;
   244     typedef Value ReturnValue;
   245   };
   246 
   247   template <typename Map>
   248   struct MapTraits<
   249     Map, typename enable_if<typename Map::ReferenceMapTag, void>::type >
   250   {
   251     typedef True ReferenceMapTag;
   252 
   253     typedef typename Map::Key Key;
   254     typedef typename Map::Value Value;
   255 
   256     typedef typename Map::ConstReference ConstReturnValue;
   257     typedef typename Map::Reference ReturnValue;
   258 
   259     typedef typename Map::ConstReference ConstReference;
   260     typedef typename Map::Reference Reference;
   261  };
   262 
   263   template <typename MatrixMap, typename Enable = void>
   264   struct MatrixMapTraits {
   265     typedef False ReferenceMapTag;
   266 
   267     typedef typename MatrixMap::FirstKey FirstKey;
   268     typedef typename MatrixMap::SecondKey SecondKey;
   269     typedef typename MatrixMap::Value Value;
   270 
   271     typedef Value ConstReturnValue;
   272     typedef Value ReturnValue;
   273   };
   274 
   275   template <typename MatrixMap>
   276   struct MatrixMapTraits<
   277     MatrixMap, typename enable_if<typename MatrixMap::ReferenceMapTag,
   278                                   void>::type >
   279   {
   280     typedef True ReferenceMapTag;
   281 
   282     typedef typename MatrixMap::FirstKey FirstKey;
   283     typedef typename MatrixMap::SecondKey SecondKey;
   284     typedef typename MatrixMap::Value Value;
   285 
   286     typedef typename MatrixMap::ConstReference ConstReturnValue;
   287     typedef typename MatrixMap::Reference ReturnValue;
   288 
   289     typedef typename MatrixMap::ConstReference ConstReference;
   290     typedef typename MatrixMap::Reference Reference;
   291  };
   292 
   293   // Indicators for the tags
   294 
   295   template <typename GR, typename Enable = void>
   296   struct NodeNumTagIndicator {
   297     static const bool value = false;
   298   };
   299 
   300   template <typename GR>
   301   struct NodeNumTagIndicator<
   302     GR,
   303     typename enable_if<typename GR::NodeNumTag, void>::type
   304   > {
   305     static const bool value = true;
   306   };
   307 
   308   template <typename GR, typename Enable = void>
   309   struct ArcNumTagIndicator {
   310     static const bool value = false;
   311   };
   312 
   313   template <typename GR>
   314   struct ArcNumTagIndicator<
   315     GR,
   316     typename enable_if<typename GR::ArcNumTag, void>::type
   317   > {
   318     static const bool value = true;
   319   };
   320 
   321   template <typename GR, typename Enable = void>
   322   struct EdgeNumTagIndicator {
   323     static const bool value = false;
   324   };
   325 
   326   template <typename GR>
   327   struct EdgeNumTagIndicator<
   328     GR,
   329     typename enable_if<typename GR::EdgeNumTag, void>::type
   330   > {
   331     static const bool value = true;
   332   };
   333 
   334   template <typename GR, typename Enable = void>
   335   struct FindArcTagIndicator {
   336     static const bool value = false;
   337   };
   338 
   339   template <typename GR>
   340   struct FindArcTagIndicator<
   341     GR,
   342     typename enable_if<typename GR::FindArcTag, void>::type
   343   > {
   344     static const bool value = true;
   345   };
   346 
   347   template <typename GR, typename Enable = void>
   348   struct FindEdgeTagIndicator {
   349     static const bool value = false;
   350   };
   351 
   352   template <typename GR>
   353   struct FindEdgeTagIndicator<
   354     GR,
   355     typename enable_if<typename GR::FindEdgeTag, void>::type
   356   > {
   357     static const bool value = true;
   358   };
   359 
   360   template <typename GR, typename Enable = void>
   361   struct UndirectedTagIndicator {
   362     static const bool value = false;
   363   };
   364 
   365   template <typename GR>
   366   struct UndirectedTagIndicator<
   367     GR,
   368     typename enable_if<typename GR::UndirectedTag, void>::type
   369   > {
   370     static const bool value = true;
   371   };
   372 
   373   template <typename GR, typename Enable = void>
   374   struct BuildTagIndicator {
   375     static const bool value = false;
   376   };
   377 
   378   template <typename GR>
   379   struct BuildTagIndicator<
   380     GR,
   381     typename enable_if<typename GR::BuildTag, void>::type
   382   > {
   383     static const bool value = true;
   384   };
   385 
   386 }
   387 
   388 #endif