summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gras/block.hpp10
-rw-r--r--lib/block.cpp32
-rw-r--r--python/gras/GRAS_Block.i5
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
+ }
};
}