[Lemon-commits] Peter Kovacs: Add a resize() function to Hypercu...

Lemon HG hg at lemon.cs.elte.hu
Wed Sep 30 08:52:47 CEST 2009


details:   http://lemon.cs.elte.hu/hg/lemon/rev/9d6c3e8b2421
changeset: 788:9d6c3e8b2421
user:      Peter Kovacs <kpeter [at] inf.elte.hu>
date:      Sun Aug 23 11:11:49 2009 +0200
description:
	Add a resize() function to HypercubeGraph (#311) just like the
	similar functions in other static graph structures, and extend the
	test files to check these functions.

diffstat:

 lemon/hypercube_graph.h |  18 +++++++++++++++++-
 test/digraph_test.cc    |   5 +++++
 test/graph_test.cc      |  16 ++++++++++++++++
 3 files changed, 38 insertions(+), 1 deletions(-)

diffs (91 lines):

diff --git a/lemon/hypercube_graph.h b/lemon/hypercube_graph.h
--- a/lemon/hypercube_graph.h
+++ b/lemon/hypercube_graph.h
@@ -287,7 +287,8 @@
   /// Two nodes are connected in the graph if and only if their indices
   /// differ only on one position in the binary form.
   /// This class is completely static and it needs constant memory space.
-  /// Thus you can neither add nor delete nodes or edges.
+  /// Thus you can neither add nor delete nodes or edges, however 
+  /// the structure can be resized using resize().
   ///
   /// This type fully conforms to the \ref concepts::Graph "Graph concept".
   /// Most of its member functions and nested classes are documented
@@ -306,6 +307,21 @@
     /// Constructs a hypercube graph with \c dim dimensions.
     HypercubeGraph(int dim) { construct(dim); }
 
+    /// \brief Resizes the graph
+    ///
+    /// This function resizes the graph. It fully destroys and
+    /// rebuilds the structure, therefore the maps of the graph will be
+    /// reallocated automatically and the previous values will be lost.
+    void resize(int dim) {
+      Parent::notifier(Arc()).clear();
+      Parent::notifier(Edge()).clear();
+      Parent::notifier(Node()).clear();
+      construct(dim);
+      Parent::notifier(Node()).build();
+      Parent::notifier(Edge()).build();
+      Parent::notifier(Arc()).build();
+    }
+
     /// \brief The number of dimensions.
     ///
     /// Gives back the number of dimensions.
diff --git a/test/digraph_test.cc b/test/digraph_test.cc
--- a/test/digraph_test.cc
+++ b/test/digraph_test.cc
@@ -378,7 +378,12 @@
 void checkFullDigraph(int num) {
   typedef FullDigraph Digraph;
   DIGRAPH_TYPEDEFS(Digraph);
+
   Digraph G(num);
+  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
+
+  G.resize(num);
+  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
 
   checkGraphNodeList(G, num);
   checkGraphArcList(G, num * num);
diff --git a/test/graph_test.cc b/test/graph_test.cc
--- a/test/graph_test.cc
+++ b/test/graph_test.cc
@@ -270,6 +270,13 @@
   GRAPH_TYPEDEFS(Graph);
 
   Graph G(num);
+  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
+        "Wrong size");
+
+  G.resize(num);
+  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
+        "Wrong size");
+
   checkGraphNodeList(G, num);
   checkGraphEdgeList(G, num * (num - 1) / 2);
 
@@ -414,6 +421,10 @@
   check(G.width() == width, "Wrong column number");
   check(G.height() == height, "Wrong row number");
 
+  G.resize(width, height);
+  check(G.width() == width, "Wrong column number");
+  check(G.height() == height, "Wrong row number");
+
   for (int i = 0; i < width; ++i) {
     for (int j = 0; j < height; ++j) {
       check(G.col(G(i, j)) == i, "Wrong column");
@@ -489,6 +500,11 @@
   GRAPH_TYPEDEFS(HypercubeGraph);
 
   HypercubeGraph G(dim);
+  check(G.dimension() == dim, "Wrong dimension");
+
+  G.resize(dim);
+  check(G.dimension() == dim, "Wrong dimension");
+  
   checkGraphNodeList(G, 1 << dim);
   checkGraphEdgeList(G, dim * (1 << (dim-1)));
   checkGraphArcList(G, dim * (1 << dim));



More information about the Lemon-commits mailing list