diff options
-rw-r--r-- | lib/gras_impl/output_buffer_queues.hpp | 1 | ||||
-rw-r--r-- | python/gras/GRAS_Block.i | 18 | ||||
-rw-r--r-- | tests/block_test.py | 63 |
3 files changed, 73 insertions, 9 deletions
diff --git a/lib/gras_impl/output_buffer_queues.hpp b/lib/gras_impl/output_buffer_queues.hpp index d876aa7..6777fe2 100644 --- a/lib/gras_impl/output_buffer_queues.hpp +++ b/lib/gras_impl/output_buffer_queues.hpp @@ -59,6 +59,7 @@ struct OutputBufferQueues GRAS_FORCE_INLINE T &front(const size_t i) { + ASSERT(not _queues[i].empty()); return _queues[i].front(); } diff --git a/python/gras/GRAS_Block.i b/python/gras/GRAS_Block.i index ab92b26..ca43589 100644 --- a/python/gras/GRAS_Block.i +++ b/python/gras/GRAS_Block.i @@ -86,8 +86,8 @@ struct PyGILPhondler %include <std_pair.i> %include <std_vector.i> -%template () std::pair<ptrdiff_t, size_t>; -%template () std::vector<std::pair<ptrdiff_t, size_t> >; +%template () std::pair<size_t, size_t>; +%template () std::vector<std::pair<size_t, size_t> >; //////////////////////////////////////////////////////////////////////// // Pull in the implementation goodies @@ -139,6 +139,9 @@ struct BlockPython : Block void notify_topology(const size_t num_inputs, const size_t num_outputs) { + _input_items.resize(num_inputs); + _output_items.resize(num_outputs); + PyGILPhondler phil(); return this->_Py_notify_topology(num_inputs, num_outputs); } @@ -151,17 +154,15 @@ struct BlockPython : Block const OutputItems &output_items ) { - _input_items.resize(input_items.size()); for (size_t i = 0; i < input_items.size(); i++) { - _input_items[i].first = ptrdiff_t(input_items[i].get()); + _input_items[i].first = size_t(input_items[i].get()); _input_items[i].second = input_items[i].size(); } - _output_items.resize(output_items.size()); for (size_t i = 0; i < output_items.size(); i++) { - _output_items[i].first = ptrdiff_t(output_items[i].get()); + _output_items[i].first = size_t(output_items[i].get()); _output_items[i].second = output_items[i].size(); } @@ -169,7 +170,7 @@ struct BlockPython : Block return this->_Py_work(_input_items, _output_items); } - typedef std::vector<std::pair<ptrdiff_t, size_t> > IOPairVec; + typedef std::vector<std::pair<size_t, size_t> > IOPairVec; IOPairVec _input_items; IOPairVec _output_items; @@ -218,9 +219,8 @@ def sig_to_dtype_sig(sig): class Block(BlockPython): def __init__(self, name='Block', in_sig=None, out_sig=None): BlockPython.__init__(self, name) - print 'BlockPython.__init__(self, name)' self.set_input_signature(in_sig) - self.set_output_signature(in_sig) + self.set_output_signature(out_sig) def set_input_signature(self, sig): self.__in_sig = sig_to_dtype_sig(sig) diff --git a/tests/block_test.py b/tests/block_test.py index b598b27..a6dccfc 100644 --- a/tests/block_test.py +++ b/tests/block_test.py @@ -19,9 +19,72 @@ class NullSink(gras.Block): def work(self, ins, outs): self.mark_done() +class VectorSource(gras.Block): + def __init__(self, out_sig, vec): + gras.Block.__init__(self, + name='VectorSource', + in_sig=None, + out_sig=[out_sig], + ) + self._vec = vec + + def work(self, ins, outs): + print 'vector source work' + num = min(len(outs[0]), len(self._vec)) + if num == 0: + self.mark_done() + return + #print 'outs[0][:num] is ' + #print len(outs) + #print len(outs[0]) + #print outs[0][0] + #print outs[0][:num] + outs[0][:num] = self._vec[:num] + self.produce(0, num) + self._vec = self._vec[num:] + #if not self._vec: + # self.mark_done() + print 'vector source work done' + +class VectorSink(gras.Block): + def __init__(self, in_sig): + gras.Block.__init__(self, + name='VectorSink', + in_sig=[in_sig], + out_sig=None, + ) + self._vec = list() + + def get_vector(self): + return self._vec + + def work(self, ins, outs): + print 'vector sink work' + self._vec.extend(ins[0].copy()) + self.consume(0, len(ins[0])) + print 'vector sink work done' + class BlockTest(unittest.TestCase): + def test_vector_blocks(self): + vec_source = VectorSource(numpy.uint32, [0, 9, 8, 7, 6]) + vec_sink = VectorSink(numpy.uint32) + + print 'make tb' + tb = gras.TopBlock() + print 'connect' + tb.connect(vec_source, vec_sink) + print 'run' + tb.run() + print 'done run' + tb = None + + print vec_sink.get_vector() + vec_source = None + vec_sink = None + def test_make_block(self): + return null_src = NullSource() null_sink = NullSink() |