From a2fdf2ded373a9d34605f9649844cf46f2c8e92c Mon Sep 17 00:00:00 2001
From: Ger van Diepen <diepen@astron.nl>
Date: Tue, 10 May 2011 11:48:42 +0000
Subject: [PATCH] bug 1687: Fixed makeSubset

---
 LCS/pyparameterset/src/__init__.py             | 17 +++++++++++++----
 LCS/pyparameterset/src/pyparameterset.cc       |  7 ++++---
 LCS/pyparameterset/test/tpyparameterset.py     |  9 +++++++++
 LCS/pyparameterset/test/tpyparameterset.stdout |  6 ++++++
 4 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/LCS/pyparameterset/src/__init__.py b/LCS/pyparameterset/src/__init__.py
index 51bac88f1db..7c711b50002 100755
--- a/LCS/pyparameterset/src/__init__.py
+++ b/LCS/pyparameterset/src/__init__.py
@@ -51,7 +51,7 @@ class parameterset(PyParameterSet):
     The Python interface to ParameterSet
     """
 
-    def __init__(self, filename=None, caseInsensitive=False):
+    def __init__(self, filename=None, caseInsensitive=False, _copyObj=False):
         """Create a parameterset object.
 
         filename
@@ -61,10 +61,14 @@ class parameterset(PyParameterSet):
           True = parameter names are case insensitive
 
         """
-        if filename==None:
-            PyParameterSet.__init__ (self, caseInsensitive);
+        if _copyObj == True:
+            # Copy constructor
+            PyParameterSet.__init__ (self, filename)
+        elif filename==None:
+            PyParameterSet.__init__ (self, caseInsensitive, 0, 0);
         elif isinstance(filename, bool):
-            PyParameterSet.__init__ (self, filename);
+            # Here filename argument means caseInsensitive
+            PyParameterSet.__init__ (self, filename, 0, 0);
         else:
             PyParameterSet.__init__ (self, filename, caseInsensitive);
 
@@ -76,6 +80,11 @@ class parameterset(PyParameterSet):
         """Get the parametervalue object of a parameter."""
         return self._get (key)
 
+    def makeSubset (self, prefix):
+        """Get a subset of all keys starting with the given prefix"""
+        ps = self._makeSubset (prefix)
+        return parameterset (ps, _copyObj=True)
+
     def keys(self):
         """Get a sorted list of all parameter names."""
         return self.keywords()
diff --git a/LCS/pyparameterset/src/pyparameterset.cc b/LCS/pyparameterset/src/pyparameterset.cc
index 998dc9d8476..bd583c9a373 100644
--- a/LCS/pyparameterset/src/pyparameterset.cc
+++ b/LCS/pyparameterset/src/pyparameterset.cc
@@ -39,7 +39,7 @@ namespace LOFAR {
     PyParameterSet()
       : ParameterSet()
     {}
-    PyParameterSet (bool caseInsensitive)
+    PyParameterSet (bool caseInsensitive, int, int)
       : ParameterSet (caseInsensitive)
     {}
     PyParameterSet (const string& fileName, bool caseInsensitive)
@@ -164,7 +164,8 @@ namespace LOFAR {
   void pyparameterset()
   {
     class_<PyParameterSet> ("PyParameterSet")
-      .def (init<bool>())
+      .def (init<PyParameterSet>())
+      .def (init<bool, int, int>())
       .def (init<std::string, bool>())
       .def ("version", &PyParameterSet::version,
             (boost::python::arg("type")="other"),
@@ -174,7 +175,7 @@ namespace LOFAR {
       .def ("__len__", &ParameterSet::size,
             "Get the number of parameters.")
       .def ("keywords", &PyParameterSet::keywords)
-      .def ("makeSubset", &PyParameterSet::makeSubset,
+      .def ("_makeSubset", &PyParameterSet::makeSubset,
  	    (boost::python::arg("baseKey"),
              boost::python::arg("prefix")=""),
             "Return a subset as a new parameterset object.\n"
diff --git a/LCS/pyparameterset/test/tpyparameterset.py b/LCS/pyparameterset/test/tpyparameterset.py
index 0ed5eace3a2..85ad29925b9 100644
--- a/LCS/pyparameterset/test/tpyparameterset.py
+++ b/LCS/pyparameterset/test/tpyparameterset.py
@@ -79,3 +79,12 @@ ps.add ("vecexp", "[1..3,5..10]")
 ps.add ("vecnest", "[[1..3,5*10],[5..10]]")
 print ps.keys()
 checkps (ps)
+
+# Check if a subset can be made and its name can be read.
+pss = ps.makeSubset('a.')
+print pss.keys()
+print 'b.c =', pss.getString ('b.c')
+print pss.makeSubset('b.').keys()
+print pss.makeSubset('b.').size()
+print pss.makeSubset('cc').keys()    # should be empty
+print len(pss.makeSubset('cc'))
diff --git a/LCS/pyparameterset/test/tpyparameterset.stdout b/LCS/pyparameterset/test/tpyparameterset.stdout
index 9cab053c842..9f0374a9260 100644
--- a/LCS/pyparameterset/test/tpyparameterset.stdout
+++ b/LCS/pyparameterset/test/tpyparameterset.stdout
@@ -78,3 +78,9 @@ True
 [1..3,5*10]
 [1, 2, 3, 10, 10, 10, 10, 10]
 [5, 6, 7, 8, 9, 10]
+['b', 'b.bool', 'b.c', 'b.double', 'b.lange_naam']
+b.c = 5
+['bool', 'c', 'double', 'lange_naam']
+4
+[]
+0
-- 
GitLab