[Lemon-commits] [lemon_svn] marci: r1416 - hugo/trunk/src/work/marci

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:45:16 CET 2006


Author: marci
Date: Wed Dec  1 15:08:37 2004
New Revision: 1416

Modified:
   hugo/trunk/src/work/marci/merge_node_graph_wrapper.h

Log:
More rational structure of classes in MergeGraphWrappers


Modified: hugo/trunk/src/work/marci/merge_node_graph_wrapper.h
==============================================================================
--- hugo/trunk/src/work/marci/merge_node_graph_wrapper.h	(original)
+++ hugo/trunk/src/work/marci/merge_node_graph_wrapper.h	Wed Dec  1 15:08:37 2004
@@ -360,7 +360,7 @@
     Generic implementation for unrelated _Graph1::Edge and _Graph2::Edge.
    */
   template <typename _Graph1, typename _Graph2, typename Enable=void>
-  class MergeEdgeGraphWrapperBase : 
+  class MergeEdgeGraphWrapperBaseBase : 
     public MergeNodeGraphWrapperBase<_Graph1, _Graph2> {
   public:
     static void printEdge() { std::cout << "edge: generic" << std::endl; }
@@ -374,15 +374,11 @@
     typedef typename Parent1::Edge Graph1Edge;
     typedef typename Parent2::Edge Graph2Edge;
   protected:
-    MergeEdgeGraphWrapperBase() { }
+    MergeEdgeGraphWrapperBaseBase() { }
   public:
-    template <typename _Value> class EdgeMap;
-
-    typedef typename Parent::Node Node;
 
     class Edge : public Graph1Edge, public Graph2Edge {
-      friend class MergeEdgeGraphWrapperBase<_Graph1, _Graph2>;
-      template <typename _Value> friend class EdgeMap;
+      friend class MergeEdgeGraphWrapperBaseBase<_Graph1, _Graph2>;
     protected:
       bool backward; //true, iff backward
     public:
@@ -409,136 +405,16 @@
 
     using Parent::forward;
     using Parent::backward;
-    bool forward(const Edge& e) const { return !e.backward; }
-    bool backward(const Edge& e) const { return e.backward; }
-
-    using Parent::first;
-    void first(Edge& i) const {
-      Parent1::graph->first(*static_cast<Graph1Edge*>(&i));
-      i.backward=false;
-      if (*static_cast<Graph1Edge*>(&i)==INVALID) {
-	Parent2::graph->first(*static_cast<Graph2Edge*>(&i));
-	i.backward=true;
-      }
-    }
-    void firstIn(Edge& i, const Node& n) const {
-      if (!backward(n)) {
-	Parent1::graph->firstIn(*static_cast<Graph1Edge*>(&i), n);
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) 
-	  i=INVALID;
-	else
-	  i.backward=false;
-      } else {
-	Parent2::graph->firstIn(*static_cast<Graph2Edge*>(&i), n);
-	i.backward=true;
-      }
-    }
-    void firstOut(Edge& i, const Node& n) const {
-      if (!backward(n)) {
-	Parent1::graph->firstOut(*static_cast<Graph1Edge*>(&i), n);
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) 
-	  i=INVALID;
-	else
-	  i.backward=false;
-      } else {
-	Parent2::graph->firstOut(*static_cast<Graph2Edge*>(&i), n);
-	i.backward=true;
-      }
-    }
-
-    using Parent::next;
-    void next(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->next(*static_cast<Graph1Edge*>(&i));
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) {
-	  Parent2::graph->first(*static_cast<Graph2Edge*>(&i));
-	  i.backward=true;
-	}
-      } else {
-	Parent2::graph->next(*static_cast<Graph2Edge*>(&i));
-      }
-    }
-    void nextIn(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->nextIn(*static_cast<Graph1Edge*>(&i));
- 	if (*static_cast<Graph1Edge*>(&i)==INVALID) i=INVALID;
-      } else {
-	Parent2::graph->nextIn(*static_cast<Graph2Edge*>(&i));
-      }
-    }
-    void nextOut(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->nextOut(*static_cast<Graph1Edge*>(&i));
- 	if (*static_cast<Graph1Edge*>(&i)==INVALID) i=INVALID;
-      } else {
-	Parent2::graph->nextOut(*static_cast<Graph2Edge*>(&i));
-      }
-    }
-
-    Node source(const Edge& i) const {
-      if (!(i.backward)) {
-	return 
-	  Node(Parent1::graph->source(i), INVALID, false);
-      } else {
-	return 
-	  Node(INVALID, Parent2::graph->source(i), true);
-      }
-    }
-
-    Node target(const Edge& i) const {
-      if (!(i.backward)) {
-	return 
-	  Node(Parent1::graph->target(i), INVALID, false);
-      } else {
-	return 
-	  Node(INVALID, Parent2::graph->target(i), true);
-      }
-    }
-
-    using Parent::id;
-    int id(const Edge& n) const { 
-      if (!n.backward) 
-	return this->Parent1::graph->id(n);
-      else
-	return this->Parent2::graph->id(n);
-    }
-
-    template <typename _Value> 
-    class EdgeMap { 
-    protected:
-      typedef typename Parent::Graph1::template EdgeMap<_Value> ParentMap1;
-      typedef typename Parent::Graph2::template EdgeMap<_Value> ParentMap2;
-      ParentMap1 forward_map;
-      ParentMap2 backward_map;
-    public:
-      typedef _Value Value;
-      typedef Edge Key;
-      EdgeMap(const MergeEdgeGraphWrapperBase<_Graph1, _Graph2>& gw) : 
-	forward_map(*(gw.Parent1::graph)), 
-	backward_map(*(gw.Parent2::graph)) { }
-      EdgeMap(const MergeEdgeGraphWrapperBase<_Graph1, _Graph2>& gw, 
-	      const _Value& value) : 
-	forward_map(*(gw.Parent1::graph), value), 
-	backward_map(*(gw.Parent2::graph), value) { }
-      _Value operator[](const Edge& n) const {
-	if (!n.backward) 
-	  return forward_map[n];
-	else 
-	  return backward_map[n];
-      }
-      void set(const Edge& n, const _Value& value) {
-	if (!n.backward) 
-	  forward_map.set(n, value);
-	else 
-	  backward_map.set(n, value);
-      }
-//       using ParentMap1::operator[];
-//       using ParentMap2::operator[];
-    };
-
+    using Parent::setForward;
+    using Parent::setBackward;
+    static bool forward(const Edge& e) { return !e.backward; }
+    static bool backward(const Edge& e) { return e.backward; }
+    static void setForward(Edge& e) { e.backward=false; }
+    static void setBackward(Edge& e) { e.backward=true; }
   };
 
 
+
   /*! A graph wrapper base class 
     for merging the node-sets and edge-sets of 
     two node-disjoint graphs 
@@ -547,7 +423,7 @@
     are the same.
    */
   template <typename _Graph1, typename _Graph2>
-  class MergeEdgeGraphWrapperBase<
+  class MergeEdgeGraphWrapperBaseBase<
     _Graph1, _Graph2, typename boost::enable_if<
     boost::is_same<typename _Graph1::Edge, typename _Graph2::Edge> >::type> : 
     public MergeNodeGraphWrapperBase<_Graph1, _Graph2> {
@@ -563,15 +439,11 @@
     typedef typename Parent1::Edge Graph1Edge;
     typedef typename Parent2::Edge Graph2Edge;
   protected:
-    MergeEdgeGraphWrapperBase() { }
+    MergeEdgeGraphWrapperBaseBase() { }
   public:
-    template <typename _Value> class EdgeMap;
-
-    typedef typename Parent::Node Node;
 
     class Edge : public Graph1Edge {
-      friend class MergeEdgeGraphWrapperBase<_Graph1, _Graph2>;
-      template <typename _Value> friend class EdgeMap;
+      friend class MergeEdgeGraphWrapperBaseBase<_Graph1, _Graph2>;
     protected:
       bool backward; //true, iff backward
     public:
@@ -594,133 +466,12 @@
 
     using Parent::forward;
     using Parent::backward;
-    bool forward(const Edge& e) const { return !e.backward; }
-    bool backward(const Edge& e) const { return e.backward; }
-
-    using Parent::first;
-    void first(Edge& i) const {
-      Parent1::graph->first(*static_cast<Graph1Edge*>(&i));
-      i.backward=false;
-      if (*static_cast<Graph1Edge*>(&i)==INVALID) {
-	Parent2::graph->first(*static_cast<Graph1Edge*>(&i));
-	i.backward=true;
-      }
-    }
-    void firstIn(Edge& i, const Node& n) const {
-      if (!backward(n)) {
-	Parent1::graph->firstIn(*static_cast<Graph1Edge*>(&i), n);
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) 
-	  i=INVALID;
-	else
-	  i.backward=false;
-      } else {
-	Parent2::graph->firstIn(*static_cast<Graph1Edge*>(&i), n);
-	i.backward=true;
-      }
-    }
-    void firstOut(Edge& i, const Node& n) const {
-      if (!backward(n)) {
-	Parent1::graph->firstOut(*static_cast<Graph1Edge*>(&i), n);
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) 
-	  i=INVALID;
-	else
-	  i.backward=false;
-      } else {
-	Parent2::graph->firstOut(*static_cast<Graph1Edge*>(&i), n);
-	i.backward=true;
-      }
-    }
-
-    using Parent::next;
-    void next(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->next(*static_cast<Graph1Edge*>(&i));
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) {
-	  Parent2::graph->first(*static_cast<Graph1Edge*>(&i));
-	  i.backward=true;
-	}
-      } else {
-	Parent2::graph->next(*static_cast<Graph1Edge*>(&i));
-      }
-    }
-    void nextIn(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->nextIn(*static_cast<Graph1Edge*>(&i));
- 	if (*static_cast<Graph1Edge*>(&i)==INVALID) i=INVALID;
-      } else {
-	Parent2::graph->nextIn(*static_cast<Graph1Edge*>(&i));
-      }
-    }
-    void nextOut(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->nextOut(*static_cast<Graph1Edge*>(&i));
- 	if (*static_cast<Graph1Edge*>(&i)==INVALID) i=INVALID;
-      } else {
-	Parent2::graph->nextOut(*static_cast<Graph1Edge*>(&i));
-      }
-    }
-
-    Node source(const Edge& i) const {
-      if (!(i.backward)) {
-	return 
-	  Node(Parent1::graph->source(i), INVALID, false);
-      } else {
-	return 
-	  Node(INVALID, Parent2::graph->source(i), true);
-      }
-    }
-
-    Node target(const Edge& i) const {
-      if (!(i.backward)) {
-	return 
-	  Node(Parent1::graph->target(i), INVALID, false);
-      } else {
-	return 
-	  Node(INVALID, Parent2::graph->target(i), true);
-      }
-    }
-
-    using Parent::id;
-    int id(const Edge& n) const { 
-      if (!n.backward) 
-	return this->Parent1::graph->id(n);
-      else
-	return this->Parent2::graph->id(n);
-    }
-
-    template <typename _Value> 
-    class EdgeMap { 
-    protected:
-      typedef typename Parent::Graph1::template EdgeMap<_Value> ParentMap1;
-      typedef typename Parent::Graph2::template EdgeMap<_Value> ParentMap2;
-      ParentMap1 forward_map;
-      ParentMap2 backward_map;
-    public:
-      typedef _Value Value;
-      typedef Edge Key;
-      EdgeMap(const MergeEdgeGraphWrapperBase<_Graph1, _Graph2>& gw) : 
-	forward_map(*(gw.Parent1::graph)), 
-	backward_map(*(gw.Parent2::graph)) { }
-      EdgeMap(const MergeEdgeGraphWrapperBase<_Graph1, _Graph2>& gw, 
-	      const _Value& value) : 
-	forward_map(*(gw.Parent1::graph), value), 
-	backward_map(*(gw.Parent2::graph), value) { }
-      _Value operator[](const Edge& n) const {
-	if (!n.backward) 
-	  return forward_map[n];
-	else 
-	  return backward_map[n];
-      }
-      void set(const Edge& n, const _Value& value) {
-	if (!n.backward) 
-	  forward_map.set(n, value);
-	else 
-	  backward_map.set(n, value);
-      }
-//       using ParentMap1::operator[];
-//       using ParentMap2::operator[];
-    };
-
+    using Parent::setForward;
+    using Parent::setBackward;
+    static bool forward(const Edge& e) { return !e.backward; }
+    static bool backward(const Edge& e) { return e.backward; }
+    static void setForward(Edge& e) { e.backward=false; }
+    static void setBackward(Edge& e) { e.backward=true; }
   };
 
 
@@ -733,7 +484,7 @@
     is derived from it.
    */
   template <typename _Graph1, typename _Graph2>
-  class MergeEdgeGraphWrapperBase<
+  class MergeEdgeGraphWrapperBaseBase<
     _Graph1, _Graph2, typename boost::enable_if<
     boost::is_base_and_derived<typename _Graph1::Edge, typename _Graph2::Edge> >::type> : 
     public MergeNodeGraphWrapperBase<_Graph1, _Graph2> {
@@ -749,15 +500,11 @@
     typedef typename Parent1::Edge Graph1Edge;
     typedef typename Parent2::Edge Graph2Edge;
   protected:
-    MergeEdgeGraphWrapperBase() { }
+    MergeEdgeGraphWrapperBaseBase() { }
   public:
-    template <typename _Value> class EdgeMap;
-
-    typedef typename Parent::Node Node;
 
     class Edge : public Graph2Edge {
-      friend class MergeEdgeGraphWrapperBase<_Graph1, _Graph2>;
-      template <typename _Value> friend class EdgeMap;
+      friend class MergeEdgeGraphWrapperBaseBase<_Graph1, _Graph2>;
     protected:
       bool backward; //true, iff backward
     public:
@@ -786,133 +533,12 @@
 
     using Parent::forward;
     using Parent::backward;
-    bool forward(const Edge& e) const { return !e.backward; }
-    bool backward(const Edge& e) const { return e.backward; }
-
-    using Parent::first;
-    void first(Edge& i) const {
-      Parent1::graph->first(*static_cast<Graph1Edge*>(&i));
-      i.backward=false;
-      if (*static_cast<Graph1Edge*>(&i)==INVALID) {
-	Parent2::graph->first(*static_cast<Graph2Edge*>(&i));
-	i.backward=true;
-      }
-    }
-    void firstIn(Edge& i, const Node& n) const {
-      if (!backward(n)) {
-	Parent1::graph->firstIn(*static_cast<Graph1Edge*>(&i), n);
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) 
-	  i=INVALID;
-	else
-	  i.backward=false;
-      } else {
-	Parent2::graph->firstIn(*static_cast<Graph2Edge*>(&i), n);
-	i.backward=true;
-      }
-    }
-    void firstOut(Edge& i, const Node& n) const {
-      if (!backward(n)) {
-	Parent1::graph->firstOut(*static_cast<Graph1Edge*>(&i), n);
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) 
-	  i=INVALID;
-	else	
-	  i.backward=false;
-      } else {
-	Parent2::graph->firstOut(*static_cast<Graph2Edge*>(&i), n);
-	i.backward=true;
-      }
-    }
-
-    using Parent::next;
-    void next(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->next(*static_cast<Graph1Edge*>(&i));
-	if (*static_cast<Graph1Edge*>(&i)==INVALID) {
-	  Parent2::graph->first(*static_cast<Graph2Edge*>(&i));
-	  i.backward=true;
-	}
-      } else {
-	Parent2::graph->next(*static_cast<Graph2Edge*>(&i));
-      }
-    }
-    void nextIn(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->nextIn(*static_cast<Graph1Edge*>(&i));
- 	if (*static_cast<Graph1Edge*>(&i)==INVALID) i=INVALID;
-      } else {
-	Parent2::graph->nextIn(*static_cast<Graph2Edge*>(&i));
-      }
-    }
-    void nextOut(Edge& i) const {
-      if (!(i.backward)) {
-	Parent1::graph->nextOut(*static_cast<Graph1Edge*>(&i));
- 	if (*static_cast<Graph1Edge*>(&i)==INVALID) i=INVALID;
-      } else {
-	Parent2::graph->nextOut(*static_cast<Graph2Edge*>(&i));
-      }
-    }
-
-    Node source(const Edge& i) const {
-      if (!(i.backward)) {
-	return 
-	  Node(Parent1::graph->source(i), INVALID, false);
-      } else {
-	return 
-	  Node(INVALID, Parent2::graph->source(i), true);
-      }
-    }
-
-    Node target(const Edge& i) const {
-      if (!(i.backward)) {
-	return 
-	  Node(Parent1::graph->target(i), INVALID, false);
-      } else {
-	return 
-	  Node(INVALID, Parent2::graph->target(i), true);
-      }
-    }
-
-    using Parent::id;
-    int id(const Edge& n) const { 
-      if (!n.backward) 
-	return this->Parent1::graph->id(n);
-      else
-	return this->Parent2::graph->id(n);
-    }
-
-    template <typename _Value> 
-    class EdgeMap { 
-    protected:
-      typedef typename Parent::Graph1::template EdgeMap<_Value> ParentMap1;
-      typedef typename Parent::Graph2::template EdgeMap<_Value> ParentMap2;
-      ParentMap1 forward_map;
-      ParentMap2 backward_map;
-    public:
-      typedef _Value Value;
-      typedef Edge Key;
-      EdgeMap(const MergeEdgeGraphWrapperBase<_Graph1, _Graph2>& gw) : 
-	forward_map(*(gw.Parent1::graph)), 
-	backward_map(*(gw.Parent2::graph)) { }
-      EdgeMap(const MergeEdgeGraphWrapperBase<_Graph1, _Graph2>& gw, 
-	      const _Value& value) : 
-	forward_map(*(gw.Parent1::graph), value), 
-	backward_map(*(gw.Parent2::graph), value) { }
-      _Value operator[](const Edge& n) const {
-	if (!n.backward) 
-	  return forward_map[n];
-	else 
-	  return backward_map[n];
-      }
-      void set(const Edge& n, const _Value& value) {
-	if (!n.backward) 
-	  forward_map.set(n, value);
-	else 
-	  backward_map.set(n, value);
-      }
-//       using ParentMap1::operator[];
-//       using ParentMap2::operator[];
-    };
-
+    using Parent::setForward;
+    using Parent::setBackward;
+    static bool forward(const Edge& e) { return !e.backward; }
+    static bool backward(const Edge& e) { return e.backward; }
+    static void setForward(Edge& e) { e.backward=false; }
+    static void setBackward(Edge& e) { e.backward=true; }
   };
 
 
@@ -924,7 +550,7 @@
     when _Graph1::Edge is derived from _Graph2::Edge.
    */
   template <typename _Graph1, typename _Graph2>
-  class MergeEdgeGraphWrapperBase<
+  class MergeEdgeGraphWrapperBaseBase<
     _Graph1, _Graph2, typename boost::enable_if<
     boost::is_base_and_derived<typename _Graph2::Edge, typename _Graph1::Edge> >::type> : 
     public MergeNodeGraphWrapperBase<_Graph1, _Graph2> {
@@ -932,7 +558,7 @@
     static void printEdge() { std::cout << "edge: 1st is derived" << std::endl; }
     typedef _Graph1 Graph1;
     typedef _Graph2 Graph2;
-    typedef MergeNodeGraphWrapperBase<_Graph1, _Graph2> Parent;
+    typedef MergeNodeGraphWrapperBaseBase<_Graph1, _Graph2> Parent;
     typedef typename Parent::Parent1 Parent1;
     typedef typename Parent::Parent2 Parent2;
 //     typedef P1<_Graph1> Parent1;
@@ -940,15 +566,11 @@
     typedef typename Parent1::Edge Graph1Edge;
     typedef typename Parent2::Edge Graph2Edge;
   protected:
-    MergeEdgeGraphWrapperBase() { }
+    MergeEdgeGraphWrapperBaseBase() { }
   public:
-    template <typename _Value> class EdgeMap;
-
-    typedef typename Parent::Node Node;
 
     class Edge : public Graph1Edge {
-      friend class MergeEdgeGraphWrapperBase<_Graph1, _Graph2>;
-      template <typename _Value> friend class EdgeMap;
+      friend class MergeEdgeGraphWrapperBaseBase<_Graph1, _Graph2>;
     protected:
       bool backward; //true, iff backward
     public:
@@ -977,57 +599,80 @@
 
     using Parent::forward;
     using Parent::backward;
-    bool forward(const Edge& e) const { return !e.backward; }
-    bool backward(const Edge& e) const { return e.backward; }
+    using Parent::setForward;
+    using Parent::setBackward;
+    static bool forward(const Edge& e) { return !e.backward; }
+    static bool backward(const Edge& e) { return e.backward; }
+    static void setForward(Edge& e) { e.backward=false; }
+    static void setBackward(Edge& e) { e.backward=true; }
+  };
+
+
+  template <typename _Graph1, typename _Graph2>
+  class MergeEdgeGraphWrapperBase : 
+    public MergeEdgeGraphWrapperBaseBase<_Graph1, _Graph2> {
+  public:
+    typedef MergeEdgeGraphWrapperBaseBase<_Graph1, _Graph2> Parent;
+    typedef _Graph1 Graph1;
+    typedef _Graph2 Graph2;
+    typedef typename Parent::Parent1 Parent1;
+    typedef typename Parent::Parent2 Parent2;
+    typedef typename Parent1::Node Graph1Node;
+    typedef typename Parent2::Node Graph2Node;
+    typedef typename Parent1::Edge Graph1Edge;
+    typedef typename Parent2::Edge Graph2Edge;
+
+    typedef typename Parent::Node Node;
+    typedef typename Parent::Edge Edge;
 
     using Parent::first;
     void first(Edge& i) const {
       Parent1::graph->first(*static_cast<Graph1Edge*>(&i));
-      i.backward=false;
+      this->setForward(i);
       if (*static_cast<Graph1Edge*>(&i)==INVALID) {
 	Parent2::graph->first(*static_cast<Graph2Edge*>(&i));
-	i.backward=true;
+	this->setBackward(i);
       }
     }
     void firstIn(Edge& i, const Node& n) const {
-      if (!backward(n)) {
+      if (forward(n)) {
 	Parent1::graph->firstIn(*static_cast<Graph1Edge*>(&i), n);
 	if (*static_cast<Graph1Edge*>(&i)==INVALID) 
 	  i=INVALID;
 	else
-	  i.backward=false;
+	  this->setForward(i);
       } else {
 	Parent2::graph->firstIn(*static_cast<Graph2Edge*>(&i), n);
-	i.backward=true;
+	this->setBackward(i);
       }
     }
     void firstOut(Edge& i, const Node& n) const {
-      if (!backward(n)) {
+      if (forward(n)) {
 	Parent1::graph->firstOut(*static_cast<Graph1Edge*>(&i), n);
 	if (*static_cast<Graph1Edge*>(&i)==INVALID) 
 	  i=INVALID;
-	else	
-	  i.backward=false;
+	else
+	  this->setForward(i);
       } else {
 	Parent2::graph->firstOut(*static_cast<Graph2Edge*>(&i), n);
-	i.backward=true;
+	this->setBackward(i);
       }
     }
 
     using Parent::next;
     void next(Edge& i) const {
-      if (!(i.backward)) {
+      if (forward(i)) {
 	Parent1::graph->next(*static_cast<Graph1Edge*>(&i));
 	if (*static_cast<Graph1Edge*>(&i)==INVALID) {
 	  Parent2::graph->first(*static_cast<Graph2Edge*>(&i));
-	  i.backward=true;
+	  this->setBackward(i);
 	}
       } else {
 	Parent2::graph->next(*static_cast<Graph2Edge*>(&i));
       }
     }
     void nextIn(Edge& i) const {
-      if (!(i.backward)) {
+      if (forward(i)) {
 	Parent1::graph->nextIn(*static_cast<Graph1Edge*>(&i));
  	if (*static_cast<Graph1Edge*>(&i)==INVALID) i=INVALID;
       } else {
@@ -1035,7 +680,7 @@
       }
     }
     void nextOut(Edge& i) const {
-      if (!(i.backward)) {
+      if (Parent::forward(i)) {
 	Parent1::graph->nextOut(*static_cast<Graph1Edge*>(&i));
  	if (*static_cast<Graph1Edge*>(&i)==INVALID) i=INVALID;
       } else {
@@ -1044,7 +689,7 @@
     }
 
     Node source(const Edge& i) const {
-      if (!(i.backward)) {
+      if (forward(i)) {
 	return 
 	  Node(Parent1::graph->source(i), INVALID, false);
       } else {
@@ -1054,7 +699,7 @@
     }
 
     Node target(const Edge& i) const {
-      if (!(i.backward)) {
+      if (forward(i)) {
 	return 
 	  Node(Parent1::graph->target(i), INVALID, false);
       } else {
@@ -1065,7 +710,7 @@
 
     using Parent::id;
     int id(const Edge& n) const { 
-      if (!n.backward) 
+      if (forward(n)) 
 	return this->Parent1::graph->id(n);
       else
 	return this->Parent2::graph->id(n);
@@ -1089,13 +734,13 @@
 	forward_map(*(gw.Parent1::graph), value), 
 	backward_map(*(gw.Parent2::graph), value) { }
       _Value operator[](const Edge& n) const {
-	if (!n.backward) 
+	if (Parent::forward(n)) 
 	  return forward_map[n];
 	else 
 	  return backward_map[n];
       }
       void set(const Edge& n, const _Value& value) {
-	if (!n.backward) 
+	if (Parent::forward(n)) 
 	  forward_map.set(n, value);
 	else 
 	  backward_map.set(n, value);
@@ -1107,11 +752,24 @@
   };
 
 
+
   /*! A graph wrapper class 
-    for merging the node-sets and edge-sets of 
-    two node-disjoint graphs 
-    into one graph.
-   */
+    for merging two node-disjoint graphs 
+    into one graph. 
+    Different implementations are according to the relation of 
+    _Graph1::Edge and _Graph2::Edge. 
+    If _Graph1::Edge and _Graph2::Edge are unrelated, then 
+    MergeEdgeGraphWrapper<_Graph1, _Graph2>::Edge 
+    is derived from both. 
+    If _Graph1::Edge and _Graph2::Edge are the same type, then 
+    MergeEdgeGraphWrapper<_Graph1, _Graph2>::Edge 
+    is derived from _Graph1::Edge. 
+    If one of _Graph1::Edge and _Graph2::Edge 
+    is derived from the other one, then 
+    MergeEdgeGraphWrapper<_Graph1, _Graph2>::Edge 
+    is derived from the derived type.
+    It does not satisfy 
+  */
   template <typename _Graph1, typename _Graph2>
   class MergeEdgeGraphWrapper : public 
   IterableGraphExtender<MergeEdgeGraphWrapperBase<_Graph1, _Graph2> > {



More information about the Lemon-commits mailing list