diff options
-rw-r--r-- | include/gras/block.hpp | 10 | ||||
-rw-r--r-- | lib/block.cpp | 32 | ||||
-rw-r--r-- | python/gras/GRAS_Block.i | 5 |
3 files changed, 43 insertions, 4 deletions
diff --git a/include/gras/block.hpp b/include/gras/block.hpp index 5ce207b..bddc0f4 100644 --- a/include/gras/block.hpp +++ b/include/gras/block.hpp @@ -123,10 +123,16 @@ struct GRAS_API Block : Element ******************************************************************/ //! Call during work to consume items - void consume(const size_t num_items, const size_t which_input); + void consume(const size_t which_input, const size_t num_items); //! Call during work to produce items - void produce(const size_t num_items, const size_t which_output); + void produce(const size_t which_output, const size_t num_items); + + //! Convenience method to consume items on all inputs + void consume(const size_t num_items); + + //! Convenience method to produce items on all outputs + void produce(const size_t num_items); //! Get absolute count of all items consumed on the given input port item_index_t get_consumed(const size_t which_input); diff --git a/lib/block.cpp b/lib/block.cpp index 039daf3..d84cc8b 100644 --- a/lib/block.cpp +++ b/lib/block.cpp @@ -2,6 +2,7 @@ #include "element_impl.hpp" #include <gras/block.hpp> +#include <boost/foreach.hpp> using namespace gras; @@ -97,6 +98,24 @@ void Block::produce(const size_t which_output, const size_t num_items) (*this)->block->produce(which_output, num_items); } +void Block::consume(const size_t num_items) +{ + const size_t num_inputs = (*this)->block->get_num_inputs(); + for (size_t i = 0; i < num_inputs; i++) + { + (*this)->block->consume(i, num_items); + } +} + +void Block::produce(const size_t num_items) +{ + const size_t num_outputs = (*this)->block->get_num_outputs(); + for (size_t o = 0; o < num_outputs; o++) + { + (*this)->block->produce(o, num_items); + } +} + item_index_t Block::get_consumed(const size_t which_input) { return (*this)->block->items_consumed[which_input]; @@ -123,9 +142,18 @@ void Block::erase_input_tags(const size_t which_input) (*this)->block->input_tags[which_input].clear(); } -void Block::propagate_tags(const size_t, const TagIter &) +void Block::propagate_tags(const size_t i, const TagIter &iter) { - //NOP + const size_t num_outputs = (*this)->block->get_num_outputs(); + for (size_t o = 0; o < num_outputs; o++) + { + BOOST_FOREACH(gras::Tag t, iter) + { + t.offset -= this->get_consumed(i); + t.offset += this->get_produced(o); + this->post_output_tag(o, t); + } + } } bool Block::start(void) diff --git a/python/gras/GRAS_Block.i b/python/gras/GRAS_Block.i index b224b74..f068b25 100644 --- a/python/gras/GRAS_Block.i +++ b/python/gras/GRAS_Block.i @@ -165,6 +165,11 @@ struct BlockPython : Block const std::vector<void *> &, const std::vector<size_t> & ) = 0; + + void propagate_tags(const size_t which_input, const TagIter &iter) + { + //TODO implement _Py_ version of this + } }; } |