summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pmc_to_ptree.cpp72
-rw-r--r--tests/query_test.py67
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()