Skip to content

Commit

Permalink
adding iterators
Browse files Browse the repository at this point in the history
  • Loading branch information
RiccardoRossi committed Feb 23, 2017
1 parent 81d23fc commit 3d6440f
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 0 deletions.
38 changes: 38 additions & 0 deletions kratos/python/add_kratos_parameters_to_python.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,44 @@ namespace Kratos
namespace Python
{

Parameters::iterator NonConstBegin(Parameters& el)
{
return el.begin();
}
Parameters::iterator NonConstEnd(Parameters& el)
{
return el.end();
}

boost::python::list items(Parameters const& self)
{
boost::python::list t;
for(Parameters::const_iterator it=self.begin(); it!=self.end(); ++it)
t.append( boost::python::make_tuple(it.name(), *it) );
return t;
}

boost::python::list keys(Parameters const& self)
{
boost::python::list t;
for(Parameters::const_iterator it=self.begin(); it!=self.end(); ++it)
t.append(it.name());
return t;
}

boost::python::list values(Parameters const& self)
{
boost::python::list t;
for(Parameters::const_iterator it=self.begin(); it!=self.end(); ++it)
t.append(*it);
return t;
}

void AddKratosParametersToPython()
{
using namespace boost::python;

class_<Parameters::iterator >("ParametersIterator", no_init);

//init<rapidjson::Value& >())
class_<Parameters, Parameters::Pointer >("Parameters", init<const std::string& >())
Expand Down Expand Up @@ -66,6 +100,10 @@ void AddKratosParametersToPython()
.def("__getitem__", &Parameters::GetValue)
.def("__setitem__", &Parameters::SetArrayItem)
.def("__getitem__", &Parameters::GetArrayItem)
.def("__iter__", range(&NonConstBegin, &NonConstEnd) )
.def("items", &items )
.def("keys", &keys )
.def("values", &values )
.def(self_ns::str(self))
;

Expand Down
29 changes: 29 additions & 0 deletions kratos/tests/test_kratos_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,35 @@ def test_add_value(self):
self.assertTrue(kp.Has("new_double"))
self.assertEqual(kp["new_double"].GetDouble(), 1.0)

def test_iterators(self):
kp = Parameters(json_string)

#iteration by range
nitems = 0
for iterator in kp:
nitems = nitems + 1
self.assertEqual(nitems, 5)

#iteration by items
for key,value in kp.items():
print(value.PrettyPrintJsonString())
self.assertEqual(kp[key].PrettyPrintJsonString(), value.PrettyPrintJsonString())
#print(key,value)

#testing values
expected_values = ['true', '2.0', '10', '{"list_value":[3,"hi",false],"tmp":5.0}', '"hello"']
counter = 0
for value in kp.values():
self.assertEqual(value.WriteJsonString(), expected_values[counter])
counter += 1

#testing values
expected_keys = ['bool_value', 'double_value', 'int_value', 'level1', 'string_value']
counter = 0
for key in kp.keys():
self.assertEqual(key, expected_keys[counter])
counter += 1


if __name__ == '__main__':
KratosUnittest.main()

1 comment on commit 3d6440f

@roigcarlo
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@RiccardoRossi Can we delete this or is going to be used in the future? The branch is closed but it still exists

Please sign in to comment.