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

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


Author: marci
Date: Wed Nov 17 20:37:54 2004
New Revision: 1392

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

Log:
MergeNodeGraphWrapper with factory


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 Nov 17 20:37:54 2004
@@ -25,26 +25,24 @@
 
 namespace lemon {
 
-  template <typename Graph1, typename Graph2, typename Enable=void> 
-  class MergeNodeGraphWrapper : 
-    public GraphWrapper<Graph1>, public GraphWrapper<Graph2> {
-    typedef GraphWrapper<Graph1> Parent1;
-    typedef GraphWrapper<Graph2> Parent2;
-    typedef typename GraphWrapper<Graph1>::Node Graph1Node;
-    typedef typename GraphWrapper<Graph2>::Node Graph2Node;
+  template <typename _Graph1, typename _Graph2, typename Enable=void>
+  class MergeNodeGraphWrapperBase : 
+    public GraphWrapperBase<_Graph1>, public GraphWrapperBase<_Graph2> {
   public:
-    class Node;
-    class NodeIt;
-    friend class Node;
-    friend class NodeIt;
-    template<typename Value> class NodeMap;
-
-    MergeNodeGraphWrapper(Graph1& _graph1, Graph2& _graph2) : 
-      Parent1(_graph1), Parent2(_graph2) { }
+    typedef _Graph1 Graph1;
+    typedef _Graph2 Graph2;
+    typedef GraphWrapperBase<_Graph1> Parent1;
+    typedef GraphWrapperBase<_Graph2> Parent2;
+    typedef typename Parent1::Node Graph1Node;
+    typedef typename Parent2::Node Graph2Node;
+  protected:
+    MergeNodeGraphWrapperBase() { }
+  public:
+    template <typename _Value> class NodeMap;
 
     class Node : public Graph1Node, public Graph2Node {
-      friend class MergeNodeGraphWrapper<Graph1, Graph2>;
-      template<typename Value> friend class NodeMap;
+      friend class MergeNodeGraphWrapperBase<_Graph1, _Graph2>;
+      template <typename Value> friend class NodeMap;
     protected:
       bool backward; //true, iff backward
     public:
@@ -72,49 +70,28 @@
       }
     };
 
-    class NodeIt : public Node {
-      friend class MergeNodeGraphWrapper<Graph1, Graph2>;
-    protected:
-      const MergeNodeGraphWrapper<Graph1, Graph2>* gw;
-    public:
-      NodeIt() { }
-      NodeIt(Invalid i) : Node(i) { }
-      NodeIt(const MergeNodeGraphWrapper<Graph1, Graph2>& _gw) : 
-	Node(typename Graph1::NodeIt(*_gw.Parent1::graph), 
-	     typename Graph2::Node(),
-	     false), gw(&_gw) { 
-	if (*static_cast<Graph1Node*>(this)==INVALID) {
-// 	  *static_cast<Node*>(this)=
-// 	    Node(Graph1Node(INVALID), 
-// 		 typename Graph2::NodeIt(*_gw.Parent2::graph), 
-// 		 true);
-	  *static_cast<Graph2Node*>(this)=
-	    typename Graph2::NodeIt(*_gw.Parent2::graph);
-	  backward=true;
-	}
+    //typedef void Edge;
+    class Edge { };
+    
+    void first(Node& i) const {
+      Parent1::graph->first(*static_cast<Graph1Node*>(&i));
+      i.backward=false;
+      if (*static_cast<Graph1Node*>(&i)==INVALID) {
+	Parent2::graph->first(*static_cast<Graph2Node*>(&i));
+	i.backward=true;
       }
-      NodeIt(const MergeNodeGraphWrapper<Graph1, Graph2>& _gw, 
-	     const Node& n) : 
-	Node(n), gw(&_gw) { }
-      NodeIt& operator++() { 
-	if (!this->backward) {
-	  *(static_cast<Graph1Node*>(this))=
-	    ++(typename Graph1::NodeIt(*gw->Parent1::graph, *this));
-	  if (*static_cast<Graph1Node*>(this)==INVALID) {
-// 	    *static_cast<Node*>(this)=
-// 	      Node(typename Graph1::Node(INVALID), 
-// 		   typename Graph2::NodeIt(*gw->Parent2::graph), true);
-	    *static_cast<Graph2Node*>(this)=
-	      typename Graph2::NodeIt(*gw->Parent2::graph);
-	    backward=true;
-	  }
-	} else {
-	  *(static_cast<Graph2Node*>(this))=
-	    ++(typename Graph2::NodeIt(*gw->Parent2::graph, *this));
+    }
+    void next(Node& i) const {
+      if (!(i.backward)) {
+	Parent1::graph->next(*static_cast<Graph1Node*>(&i));
+	if (*static_cast<Graph1Node*>(&i)==INVALID) {
+	  Parent2::graph->first(*static_cast<Graph2Node*>(&i));
+	  i.backward=true;
 	}
-	return *this;
+      } else {
+	Parent2::graph->next(*static_cast<Graph2Node*>(&i));
       }
-    };
+    }
 
     int id(const Node& n) const { 
       if (!n.backward) 
@@ -123,44 +100,44 @@
 	return this->Parent2::graph->id(n);
     }
 
-    template <typename Value> 
-    class NodeMap : public Parent1::template NodeMap<Value>, 
-		    public Parent2::template NodeMap<Value> { 
-      typedef typename Parent1::template NodeMap<Value> ParentMap1;
-      typedef typename Parent2::template NodeMap<Value> ParentMap2;
+    template <typename _Value> 
+    class NodeMap : public Parent1::template NodeMap<_Value>, 
+		    public Parent2::template NodeMap<_Value> { 
+      typedef typename Parent1::template NodeMap<_Value> ParentMap1;
+      typedef typename Parent2::template NodeMap<_Value> ParentMap2;
     public:
-      NodeMap(const MergeNodeGraphWrapper<Graph1, Graph2>& gw) : 
-	ParentMap1(gw), 
-	ParentMap2(gw) { }
-      NodeMap(const MergeNodeGraphWrapper<Graph1, Graph2>& gw, 
-	      const Value& value)
-	: ParentMap1(gw, value), 
-	  ParentMap2(gw, value) { }
-      NodeMap(const NodeMap& copy)
-	: ParentMap1(copy), 
-	  ParentMap2(copy) { }
-      template <typename TT>
-      NodeMap(const NodeMap<TT>& copy)
-	: ParentMap1(copy),
-	  ParentMap2(copy) { }
-      NodeMap& operator=(const NodeMap& copy) {
-	ParentMap1::operator=(copy);
-	ParentMap2::operator=(copy);
-	return *this;
-      }
-      template <typename TT>
-      NodeMap& operator=(const NodeMap<TT>& copy) {
-	ParentMap1::operator=(copy);
-	ParentMap2::operator=(copy);
-	return *this;
-      }
-      Value operator[](const Node& n) const {
+      typedef _Value Value;
+      typedef Node Key;
+      NodeMap(const MergeNodeGraphWrapperBase<_Graph1, _Graph2>& gw) : 
+	ParentMap1(gw), ParentMap2(gw) { }
+      NodeMap(const MergeNodeGraphWrapperBase<_Graph1, _Graph2>& gw, 
+	      const _Value& value) : 
+	ParentMap1(gw, value), ParentMap2(gw, value) { }
+//       NodeMap(const NodeMap& copy)
+// 	: ParentMap1(copy), 
+// 	  ParentMap2(copy) { }
+//       template <typename TT>
+//       NodeMap(const NodeMap<TT>& copy)
+// 	: ParentMap1(copy),
+// 	  ParentMap2(copy) { }
+//       NodeMap& operator=(const NodeMap& copy) {
+// 	ParentMap1::operator=(copy);
+// 	ParentMap2::operator=(copy);
+// 	return *this;
+//       }
+//       template <typename TT>
+//       NodeMap& operator=(const NodeMap<TT>& copy) {
+// 	ParentMap1::operator=(copy);
+// 	ParentMap2::operator=(copy);
+// 	return *this;
+//       }
+      _Value operator[](const Node& n) const {
 	if (!n.backward) 
 	  return ParentMap1::operator[](n);
 	else 
 	  return ParentMap2::operator[](n);
       }
-      void set(const Node& n, const Value& value) {
+      void set(const Node& n, const _Value& value) {
 	if (!n.backward) 
 	  ParentMap1::set(n, value);
 	else 
@@ -169,7 +146,25 @@
       using ParentMap1::operator[];
       using ParentMap2::operator[];
     };
-    
+
+  };
+
+
+  template <typename _Graph1, typename _Graph2, typename Enable=void>
+  class MergeNodeGraphWrapper : public 
+  IterableGraphExtender<MergeNodeGraphWrapperBase<_Graph1, _Graph2, Enable> > {
+  public:
+    typedef _Graph1 Graph1;
+    typedef _Graph2 Graph2;
+    typedef IterableGraphExtender<
+      MergeNodeGraphWrapperBase<_Graph1, _Graph2, Enable> > Parent;
+  protected:
+    MergeNodeGraphWrapper() { }
+  public:
+    MergeNodeGraphWrapper(_Graph1& _graph1, _Graph2& _graph2) { 
+      Parent::Parent1::setGraph(_graph1);
+      Parent::Parent2::setGraph(_graph2);
+    }
   };
 
 } //namespace lemon



More information about the Lemon-commits mailing list