lemon/traits.h
changeset 1992 6e1b62d42d94
parent 1979 c2992fd74dad
equal deleted inserted replaced
6:31662882a513 7:fec19f143bf7
    27 
    27 
    28 namespace lemon {
    28 namespace lemon {
    29   template <typename _Graph, typename _Item>
    29   template <typename _Graph, typename _Item>
    30   class ItemSetTraits {};
    30   class ItemSetTraits {};
    31   
    31   
       
    32 
       
    33   template <typename Graph, typename Enable = void>
       
    34   struct NodeNotifierIndicator {
       
    35     typedef InvalidType Type;
       
    36   };
       
    37   template <typename Graph>
       
    38   struct NodeNotifierIndicator<
       
    39     Graph, 
       
    40     typename enable_if<typename Graph::NodeNotifier::Notifier, void>::type
       
    41   > { 
       
    42     typedef typename Graph::NodeNotifier Type;
       
    43   };
       
    44 
    32   template <typename _Graph>
    45   template <typename _Graph>
    33   class ItemSetTraits<_Graph, typename _Graph::Node> {
    46   class ItemSetTraits<_Graph, typename _Graph::Node> {
    34   public:
    47   public:
    35     
    48     
    36     typedef _Graph Graph;
    49     typedef _Graph Graph;
    37 
    50 
    38     typedef typename Graph::Node Item;
    51     typedef typename Graph::Node Item;
    39     typedef typename Graph::NodeIt ItemIt;
    52     typedef typename Graph::NodeIt ItemIt;
    40 
    53 
       
    54     typedef typename NodeNotifierIndicator<Graph>::Type ItemNotifier;
       
    55 
    41     template <typename _Value>
    56     template <typename _Value>
    42     class Map : public Graph::template NodeMap<_Value> {
    57     class Map : public Graph::template NodeMap<_Value> {
    43     public:
    58     public:
    44       typedef typename Graph::template NodeMap<_Value> Parent; 
    59       typedef typename Graph::template NodeMap<_Value> Parent; 
    45       typedef typename Parent::Value Value;
    60       typedef typename Parent::Value Value;
    46 
    61 
    47       Map(const Graph& _graph) : Parent(_graph) {}
    62       Map(const Graph& _graph) : Parent(_graph) {}
    48       Map(const Graph& _graph, const Value& _value) 
    63       Map(const Graph& _graph, const Value& _value) 
    49 	: Parent(_graph, _value) {}
    64 	: Parent(_graph, _value) {}
    50     };
    65 
    51 
    66      };
       
    67 
       
    68   };
       
    69 
       
    70   template <typename Graph, typename Enable = void>
       
    71   struct EdgeNotifierIndicator {
       
    72     typedef InvalidType Type;
       
    73   };
       
    74   template <typename Graph>
       
    75   struct EdgeNotifierIndicator<
       
    76     Graph, 
       
    77     typename enable_if<typename Graph::EdgeNotifier::Notifier, void>::type
       
    78   > { 
       
    79     typedef typename Graph::EdgeNotifier Type;
    52   };
    80   };
    53 
    81 
    54   template <typename _Graph>
    82   template <typename _Graph>
    55   class ItemSetTraits<_Graph, typename _Graph::Edge> {
    83   class ItemSetTraits<_Graph, typename _Graph::Edge> {
    56   public:
    84   public:
    58     typedef _Graph Graph;
    86     typedef _Graph Graph;
    59 
    87 
    60     typedef typename Graph::Edge Item;
    88     typedef typename Graph::Edge Item;
    61     typedef typename Graph::EdgeIt ItemIt;
    89     typedef typename Graph::EdgeIt ItemIt;
    62 
    90 
       
    91     typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier;
       
    92 
    63     template <typename _Value>
    93     template <typename _Value>
    64     class Map : public Graph::template EdgeMap<_Value> {
    94     class Map : public Graph::template EdgeMap<_Value> {
    65     public:
    95     public:
    66       typedef typename Graph::template EdgeMap<_Value> Parent; 
    96       typedef typename Graph::template EdgeMap<_Value> Parent; 
    67       typedef typename Parent::Value Value;
    97       typedef typename Parent::Value Value;
    69       Map(const Graph& _graph) : Parent(_graph) {}
    99       Map(const Graph& _graph) : Parent(_graph) {}
    70       Map(const Graph& _graph, const Value& _value) 
   100       Map(const Graph& _graph, const Value& _value) 
    71 	: Parent(_graph, _value) {}
   101 	: Parent(_graph, _value) {}
    72     };
   102     };
    73 
   103 
       
   104   };
       
   105 
       
   106   template <typename Graph, typename Enable = void>
       
   107   struct UEdgeNotifierIndicator {
       
   108     typedef InvalidType Type;
       
   109   };
       
   110   template <typename Graph>
       
   111   struct UEdgeNotifierIndicator<
       
   112     Graph, 
       
   113     typename enable_if<typename Graph::UEdgeNotifier::Notifier, void>::type
       
   114   > { 
       
   115     typedef typename Graph::UEdgeNotifier Type;
    74   };
   116   };
    75 
   117 
    76   template <typename _Graph>
   118   template <typename _Graph>
    77   class ItemSetTraits<_Graph, typename _Graph::UEdge> {
   119   class ItemSetTraits<_Graph, typename _Graph::UEdge> {
    78   public:
   120   public:
    80     typedef _Graph Graph;
   122     typedef _Graph Graph;
    81 
   123 
    82     typedef typename Graph::UEdge Item;
   124     typedef typename Graph::UEdge Item;
    83     typedef typename Graph::UEdgeIt ItemIt;
   125     typedef typename Graph::UEdgeIt ItemIt;
    84 
   126 
       
   127     typedef typename UEdgeNotifierIndicator<Graph>::Type ItemNotifier;
       
   128 
    85     template <typename _Value>
   129     template <typename _Value>
    86     class Map : public Graph::template UEdgeMap<_Value> {
   130     class Map : public Graph::template UEdgeMap<_Value> {
    87     public:
   131     public:
    88       typedef typename Graph::template UEdgeMap<_Value> Parent; 
   132       typedef typename Graph::template UEdgeMap<_Value> Parent; 
    89       typedef typename Parent::Value Value;
   133       typedef typename Parent::Value Value;
    93 	: Parent(_graph, _value) {}
   137 	: Parent(_graph, _value) {}
    94     };
   138     };
    95 
   139 
    96   };
   140   };
    97 
   141 
       
   142   template <typename Graph, typename Enable = void>
       
   143   struct ANodeNotifierIndicator {
       
   144     typedef InvalidType Type;
       
   145   };
       
   146   template <typename Graph>
       
   147   struct ANodeNotifierIndicator<
       
   148     Graph, 
       
   149     typename enable_if<typename Graph::ANodeNotifier::Notifier, void>::type
       
   150   > { 
       
   151     typedef typename Graph::ANodeNotifier Type;
       
   152   };
    98 
   153 
    99   template <typename _Graph>
   154   template <typename _Graph>
   100   class ItemSetTraits<_Graph, typename _Graph::ANode> {
   155   class ItemSetTraits<_Graph, typename _Graph::ANode> {
   101   public:
   156   public:
   102     
   157     
   103     typedef _Graph Graph;
   158     typedef _Graph Graph;
   104 
   159 
   105     typedef typename Graph::ANode Item;
   160     typedef typename Graph::ANode Item;
   106     typedef typename Graph::ANodeIt ItemIt;
   161     typedef typename Graph::ANodeIt ItemIt;
   107 
   162 
       
   163     typedef typename ANodeNotifierIndicator<Graph>::Type ItemNotifier;
       
   164 
   108     template <typename _Value>
   165     template <typename _Value>
   109     class Map : public Graph::template ANodeMap<_Value> {
   166     class Map : public Graph::template ANodeMap<_Value> {
   110     public:
   167     public:
   111       typedef typename Graph::template ANodeMap<_Value> Parent; 
   168       typedef typename Graph::template ANodeMap<_Value> Parent; 
   112       typedef typename Parent::Value Value;
   169       typedef typename Parent::Value Value;
   114       Map(const Graph& _graph) : Parent(_graph) {}
   171       Map(const Graph& _graph) : Parent(_graph) {}
   115       Map(const Graph& _graph, const Value& _value) 
   172       Map(const Graph& _graph, const Value& _value) 
   116 	: Parent(_graph, _value) {}
   173 	: Parent(_graph, _value) {}
   117     };
   174     };
   118 
   175 
       
   176   };
       
   177 
       
   178   template <typename Graph, typename Enable = void>
       
   179   struct BNodeNotifierIndicator {
       
   180     typedef InvalidType Type;
       
   181   };
       
   182   template <typename Graph>
       
   183   struct BNodeNotifierIndicator<
       
   184     Graph, 
       
   185     typename enable_if<typename Graph::BNodeNotifier::Notifier, void>::type
       
   186   > { 
       
   187     typedef typename Graph::BNodeNotifier Type;
   119   };
   188   };
   120 
   189 
   121   template <typename _Graph>
   190   template <typename _Graph>
   122   class ItemSetTraits<_Graph, typename _Graph::BNode> {
   191   class ItemSetTraits<_Graph, typename _Graph::BNode> {
   123   public:
   192   public:
   124     
   193     
   125     typedef _Graph Graph;
   194     typedef _Graph Graph;
   126 
   195 
   127     typedef typename Graph::BNode Item;
   196     typedef typename Graph::BNode Item;
   128     typedef typename Graph::BNodeIt ItemIt;
   197     typedef typename Graph::BNodeIt ItemIt;
       
   198 
       
   199     typedef typename BNodeNotifierIndicator<Graph>::Type ItemNotifier;
   129 
   200 
   130     template <typename _Value>
   201     template <typename _Value>
   131     class Map : public Graph::template BNodeMap<_Value> {
   202     class Map : public Graph::template BNodeMap<_Value> {
   132     public:
   203     public:
   133       typedef typename Graph::template BNodeMap<_Value> Parent; 
   204       typedef typename Graph::template BNodeMap<_Value> Parent;