From df13f94693d1a6ebf3c3cbf742e3e0be87751e37 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radek=20Hu=C5=A1ek?= <PitelVonSacek@gmail.com>
Date: Wed, 9 Dec 2015 11:29:57 +0100
Subject: [PATCH] Interface & classes transfer mechanism change

Function testGroupConnectivity now doesn't return list
of classes by default but you have to opt in
for it. Moreover the transfer mechanism  of list of classes
between C++ and Python was changed from instance
variable to (virtual) function.
---
 group-connectivity.h  |  6 ++++++
 groupConnectivity.pyx | 17 +++++++++--------
 timit.md              |  4 ++--
 3 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/group-connectivity.h b/group-connectivity.h
index 6a19341..024d7c6 100644
--- a/group-connectivity.h
+++ b/group-connectivity.h
@@ -34,6 +34,7 @@ struct AbstractTester {
     std::vector<EdgeId> spanningTree,
     std::vector< std::vector<DirectedEdgeId> > elementaryCycles
   ) =0;
+  virtual std::vector<size_t> getClasses() =0;
   virtual bool run() =0;
 
   virtual ~AbstractTester() {}
@@ -125,6 +126,11 @@ struct Tester : public AbstractTester {
   }
 
 
+  virtual std::vector<size_t> getClasses() {
+    return classes;
+  }
+
+
   virtual bool run() {
     Mapping forb(edges, 0);
     
diff --git a/groupConnectivity.pyx b/groupConnectivity.pyx
index a732146..44d8f87 100644
--- a/groupConnectivity.pyx
+++ b/groupConnectivity.pyx
@@ -12,10 +12,8 @@ cdef extern from "group-connectivity.h" namespace "Ring":
 
 cdef extern from "group-connectivity.h":
   cdef cppclass AbstractTester:
-    bool isConnected
-    vector[size_t] classes
-
     void init(int, vector[int], vector[vector[int]])
+    vector[size_t] getClasses()
     bool run()
 
   cdef cppclass Tester[T](AbstractTester):
@@ -31,7 +29,7 @@ def pathToEdges(G, path):
     u = v
   return ret
 
-def testGroupConnectivity(G, group = "Z4", debug = False):
+def testGroupConnectivity(G, group = "Z4", getClasses = False, debug = False):
   cdef AbstractTester* tester = NULL
   if group == "Z4":
     tester = new Tester[Z4[int]]()
@@ -59,11 +57,14 @@ def testGroupConnectivity(G, group = "Z4", debug = False):
 
   tester.init(G.num_edges(), [ l for (_, _, l) in spanningTree.edge_iterator() ], elemCycles)
   ret = tester.run()
-  classes = tester.classes
-
-  del tester
 
-  return (ret, classes)
+  if getClasses:
+    classes = tester.getClasses()
+    del tester
+    return (ret, classes)
+  else:
+    del tester
+    return ret
 
 def subdivisionIterator(G, edges = None):
   if edges is None:
diff --git a/timit.md b/timit.md
index c2b38c1..b108ebe 100644
--- a/timit.md
+++ b/timit.md
@@ -7,8 +7,8 @@ Command:
   graphs.CubeGraph(3).edges()[0:2],
   function = lambda H: "%-20s Z4: %-5s Z2_2: %s" % (
     H.graph6_string(),
-    groupConnectivity.testGroupConnectivity(H, "Z4")[0],
-    groupConnectivity.testGroupConnectivity(H, "Z2_2")[0]
+    groupConnectivity.testGroupConnectivity(H, "Z4"),
+    groupConnectivity.testGroupConnectivity(H, "Z2_2")
   )
 )
 ``
-- 
GitLab