diff options
-rw-r--r-- | lib/pmc_to_ptree.cpp | 72 | ||||
-rw-r--r-- | tests/query_test.py | 67 |
2 files changed, 108 insertions, 31 deletions
diff --git a/lib/pmc_to_ptree.cpp b/lib/pmc_to_ptree.cpp index 677b6ce..1037d7e 100644 --- a/lib/pmc_to_ptree.cpp +++ b/lib/pmc_to_ptree.cpp @@ -5,6 +5,9 @@ #include <PMC/Containers.hpp> #include <boost/property_tree/ptree.hpp> #include <boost/foreach.hpp> +#include <vector> +#include <complex> +#include <sstream> using namespace boost::property_tree; @@ -17,9 +20,13 @@ PMCC ptree_to_pmc(const ptree &value, const std::type_info &hint) if (value.size() == 0) { //can we cast to number? - try{return ptree_to_pmc(value, typeid(long));} + try{return ptree_to_pmc(value, typeid(double));} catch(...){} - //TODO complex + + //can we cast to complex? + try{return ptree_to_pmc(value, typeid(std::complex<double>));} + catch(...){} + //then string return ptree_to_pmc(value, typeid(std::string)); } @@ -27,7 +34,7 @@ PMCC ptree_to_pmc(const ptree &value, const std::type_info &hint) else { //TODO more if statements - w/ define - return ptree_to_pmc(value, typeid(std::vector<long>)); + return ptree_to_pmc(value, typeid(std::vector<double>)); } } @@ -46,7 +53,19 @@ PMCC ptree_to_pmc(const ptree &value, const std::type_info &hint) ptree_to_pmc_try(unsigned long); ptree_to_pmc_try(signed long long); ptree_to_pmc_try(unsigned long long); - //complex number TODO + ptree_to_pmc_try(float); + ptree_to_pmc_try(double); + + //complex number + std::istringstream ss(value.get_value<std::string>()); + if (hint == typeid(std::complex<double>)) + { + std::complex<double> c; ss >> c; return PMC_M(c); + } + if (hint == typeid(std::complex<float>)) + { + std::complex<float> c; ss >> c; return PMC_M(c); + } //string ptree_to_pmc_try(std::string); @@ -56,7 +75,6 @@ PMCC ptree_to_pmc(const ptree &value, const std::type_info &hint) BOOST_FOREACH(const ptree::value_type &elem, value) { vec.push_back(elem.second.get_value<long>()); - VAR(vec.back()); } return PMC_M(vec); @@ -82,19 +100,49 @@ ptree pmc_to_ptree(const PMCC &value) pmc_to_ptree_try(unsigned long); pmc_to_ptree_try(signed long long); pmc_to_ptree_try(unsigned long long); + pmc_to_ptree_try(float); + pmc_to_ptree_try(double); + + //derermine complex + if (value.is<std::complex<double> >()) + { + std::ostringstream oss; + oss << value.as<std::complex<double> >(); + v.put_value(oss.str()); return v; + } + if (value.is<std::complex<float> >()) + { + std::ostringstream oss; + oss << value.as<std::complex<float> >(); + v.put_value(oss.str()); return v; + } //determine string pmc_to_ptree_try(std::string); //try numeric vector - //TODO more if statements - w/ define - if (value.is<std::vector<long> >()) - { - BOOST_FOREACH(const long &elem, value.as<std::vector<long> >()) - { - - } + #define pmc_to_ptree_tryv(type) \ + if (value.is<std::vector<type> >()) \ + { \ + BOOST_FOREACH(const type &elem, value.as<std::vector<type> >()) \ + { \ + ptree t; t.put_value(elem); \ + v.push_back(std::make_pair("", t)); \ + } \ } + pmc_to_ptree_tryv(char); + pmc_to_ptree_tryv(signed char); + pmc_to_ptree_tryv(unsigned char); + pmc_to_ptree_tryv(signed short); + pmc_to_ptree_tryv(unsigned short); + pmc_to_ptree_tryv(signed int); + pmc_to_ptree_tryv(unsigned int); + pmc_to_ptree_tryv(signed long); + pmc_to_ptree_tryv(unsigned long); + pmc_to_ptree_tryv(signed long long); + pmc_to_ptree_tryv(unsigned long long); + pmc_to_ptree_tryv(float); + pmc_to_ptree_tryv(double); return v; } diff --git a/tests/query_test.py b/tests/query_test.py index 039888c..8faa148 100644 --- a/tests/query_test.py +++ b/tests/query_test.py @@ -8,25 +8,25 @@ from demo_blocks import * class MyBlock(gras.Block): def __init__(self): gras.Block.__init__(self, "MyBlock", out_sig=[numpy.uint32], in_sig=[numpy.uint32]) - self.integer_value = 0 - self.register_getter("integer_value", self.get_integer_value) - self.register_setter("integer_value", self.set_integer_value) + self.numeric_value = 0 + self.register_getter("numeric_value", self.get_numeric_value) + self.register_setter("numeric_value", self.set_numeric_value) self.vector_value = [0] self.register_getter("vector_value", self.get_vector_value) self.register_setter("vector_value", self.set_vector_value) def work(self, ins, outs): n = min(len(ins[0]), len(outs[0])) - outs[0][:n] = ins[0][:n] + self.integer_value + outs[0][:n] = ins[0][:n] + self.numeric_value self.consume(n) self.produce(n) - def get_integer_value(self): - return self.integer_value + def get_numeric_value(self): + return self.numeric_value - def set_integer_value(self, new_integer_value): - print "new_integer_value", new_integer_value - self.integer_value = new_integer_value + def set_numeric_value(self, new_numeric_value): + print "new_numeric_value", new_numeric_value + self.numeric_value = new_numeric_value def get_vector_value(self): return self.vector_value @@ -70,39 +70,59 @@ class QueryTest(unittest.TestCase): #found the block we asked for self.assertTrue(block_id in stats_result['blocks']) - def test_integer_query(self): + def test_numeric_query(self): vec_source = VectorSource(numpy.uint32, [0, 9, 8, 7, 6]) vec_sink = VectorSink(numpy.uint32) block = MyBlock() - block.set_uid("test_integer_query") + block.set_uid("test_numeric_query") self.tb.connect(vec_source, block, vec_sink) self.tb.run() #query the block list blocks_result = self.tb.query(dict(path="/blocks.json")) self.assertEqual(len(blocks_result['blocks']), 3) - self.assertTrue('test_integer_query' in blocks_result['blocks']) + self.assertTrue('test_numeric_query' in blocks_result['blocks']) #set the integer property self.tb.query(dict( path="/props.json", - block='test_integer_query', - key='integer_value', + block='test_numeric_query', + key='numeric_value', action='set', value=42, )) - self.assertEqual(block.integer_value, 42) + self.assertEqual(block.numeric_value, 42) #get the integer property - block.set('integer_value', 21) + block.set('numeric_value', 21) result = self.tb.query(dict( path="/props.json", - block='test_integer_query', - key='integer_value', + block='test_numeric_query', + key='numeric_value', action='get' )) self.assertEqual(result['value'], 21) + #set the complex property + self.tb.query(dict( + path="/props.json", + block='test_numeric_query', + key='numeric_value', + action='set', + value='(0, 42)', + )) + self.assertEqual(block.numeric_value, 42j) + + #get the complex property + block.set('numeric_value', 21j) + result = self.tb.query(dict( + path="/props.json", + block='test_numeric_query', + key='numeric_value', + action='get' + )) + self.assertEqual(result['value'], '(0,21)') + def test_vector_query(self): vec_source = VectorSource(numpy.uint32, [0, 9, 8, 7, 6]) vec_sink = VectorSink(numpy.uint32) @@ -119,8 +139,17 @@ class QueryTest(unittest.TestCase): action='set', value=[1, 2, 3, 4, 5], )) - print block.vector_value self.assertEqual(list(block.vector_value), [1, 2, 3, 4, 5]) + #get the vector property + block.set('vector_value', [6, 7, 8, 9]) + result = self.tb.query(dict( + path="/props.json", + block='test_vector_query', + key='vector_value', + action='get' + )) + self.assertEqual(list(result['value']), [6, 7, 8, 9]) + if __name__ == '__main__': unittest.main() |