summaryrefslogtreecommitdiff
path: root/lib/block.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/block.cpp')
-rw-r--r--lib/block.cpp63
1 files changed, 25 insertions, 38 deletions
diff --git a/lib/block.cpp b/lib/block.cpp
index 424df83..e9e170b 100644
--- a/lib/block.cpp
+++ b/lib/block.cpp
@@ -9,6 +9,7 @@ using namespace gras;
InputPortConfig::InputPortConfig(void)
{
+ item_size = 1;
reserve_items = 1;
maximum_items = 0;
inline_buffer = false;
@@ -17,6 +18,7 @@ InputPortConfig::InputPortConfig(void)
OutputPortConfig::OutputPortConfig(void)
{
+ item_size = 1;
reserve_items = 1;
maximum_items = 0;
}
@@ -38,10 +40,8 @@ Block::Block(const std::string &name):
(*this)->block->block_state = BlockActor::BLOCK_STATE_INIT;
//call block methods to init stuff
- this->set_input_size(0, 1);
- this->set_output_size(0, 1);
- this->set_input_config(0, InputPortConfig());
- this->set_output_config(0, OutputPortConfig());
+ this->input_config(0) = InputPortConfig();
+ this->output_config(0) = OutputPortConfig();
this->set_interruptible_work(false);
this->set_buffer_affinity(-1);
}
@@ -62,74 +62,62 @@ void ElementImpl::block_cleanup(void)
this->thread_pool.reset(); //must be deleted after actor
}
-template <typename V, typename T>
-void vector_set(V &v, const T &t, const size_t index)
+template <typename V>
+const typename V::value_type &vector_get_const(const V &v, const size_t index)
{
if (v.size() <= index)
{
- v.resize(index+1, t);
+ return v.back();
}
- v[index] = t;
+ return v[index];
}
template <typename V>
-typename V::value_type vector_get(const V &v, const size_t index)
+typename V::value_type &vector_get_resize(V &v, const size_t index)
{
if (v.size() <= index)
{
- return v.front();
+ if (v.empty()) v.resize(1);
+ v.resize(index+1, v.back());
}
return v[index];
}
-size_t Block::get_input_size(const size_t which_input) const
-{
- return vector_get((*this)->block->input_items_sizes, which_input);
-}
-
-void Block::set_input_size(const size_t which_input, const size_t bytes)
+InputPortConfig &Block::input_config(const size_t which_input)
{
- vector_set((*this)->block->input_items_sizes, bytes, which_input);
+ return vector_get_resize((*this)->block->input_configs, which_input);
}
-size_t Block::get_output_size(const size_t which_output) const
+const InputPortConfig &Block::input_config(const size_t which_input) const
{
- return vector_get((*this)->block->output_items_sizes, which_output);
+ return vector_get_const((*this)->block->input_configs, which_input);
}
-void Block::set_output_size(const size_t which_output, const size_t bytes)
+OutputPortConfig &Block::output_config(const size_t which_output)
{
- vector_set((*this)->block->output_items_sizes, bytes, which_output);
+ return vector_get_resize((*this)->block->output_configs, which_output);
}
-InputPortConfig Block::get_input_config(const size_t which_input) const
+const OutputPortConfig &Block::output_config(const size_t which_output) const
{
- return vector_get((*this)->block->input_configs, which_input);
+ return vector_get_const((*this)->block->output_configs, which_output);
}
-void Block::set_input_config(const size_t which_input, const InputPortConfig &config)
+void Block::commit_config(void)
{
- vector_set((*this)->block->input_configs, config, which_input);
+ for (size_t i = 0; i < (*this)->block->get_num_inputs(); i++)
{
InputUpdateMessage message;
- message.index = which_input;
+ message.index = i;
(*this)->block->Push(message, Theron::Address());
}
-}
-
-OutputPortConfig Block::get_output_config(const size_t which_output) const
-{
- return vector_get((*this)->block->output_configs, which_output);
-}
-
-void Block::set_output_config(const size_t which_output, const OutputPortConfig &config)
-{
- vector_set((*this)->block->output_configs, config, which_output);
+ for (size_t i = 0; i < (*this)->block->get_num_outputs(); i++)
{
OutputUpdateMessage message;
- message.index = which_output;
+ message.index = i;
(*this)->block->Push(message, Theron::Address());
}
+
}
void Block::consume(const size_t which_input, const size_t num_items)
@@ -195,7 +183,6 @@ PMCC Block::pop_input_msg(const size_t which_input)
if (input_tags.empty()) return PMCC();
PMCC p = input_tags.front().object;
input_tags.erase(input_tags.begin());
- (*this)->block->stats.items_consumed[which_input]++;
return p;
}