diff --git a/app/playground/main.cpp b/app/playground/main.cpp index e5e6c7b..0b1a636 100644 --- a/app/playground/main.cpp +++ b/app/playground/main.cpp @@ -4,14 +4,14 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include "pls/pls.h" +#include "pls/dataflow/internal/inputs.h" +#include "pls/dataflow/internal/outputs.h" +#include "pls/dataflow/internal/function_node.h" +#include "pls/dataflow/internal/graph.h" +#include "pls/dataflow/internal/switch_node.h" +#include "pls/dataflow/internal/split_node.h" +#include "pls/dataflow/internal/merge_node.h" int main() { using namespace pls::dataflow; diff --git a/lib/pls/CMakeLists.txt b/lib/pls/CMakeLists.txt index 9e314cb..67e9cd8 100644 --- a/lib/pls/CMakeLists.txt +++ b/lib/pls/CMakeLists.txt @@ -56,7 +56,7 @@ add_library(pls STATIC include/pls/internal/scheduling/task.h src/internal/scheduling/task.cpp include/pls/internal/scheduling/scheduler_memory.h src/internal/scheduling/scheduler_memory.cpp include/pls/internal/scheduling/lambda_task.h - include/pls/dataflow/internal/split_node.h) + include/pls/dataflow/internal/split_node.h include/pls/internal/helpers/member_function.h) # Add everything in `./include` to be in the include path of this project target_include_directories(pls PUBLIC diff --git a/lib/pls/include/pls/dataflow/internal/function_node.h b/lib/pls/include/pls/dataflow/internal/function_node.h index dac72b5..ed6205f 100644 --- a/lib/pls/include/pls/dataflow/internal/function_node.h +++ b/lib/pls/include/pls/dataflow/internal/function_node.h @@ -26,10 +26,10 @@ template class function_node {}; template -class function_node, pls::dataflow::outputs, F> : public node { +class function_node, outputs, F> : public node { private: // Our own type - using self_type = function_node, pls::dataflow::outputs, F>; + using self_type = function_node, outputs, F>; // Input-Output port types using multi_in_port_type = multi_in_port; diff --git a/lib/pls/include/pls/dataflow/internal/function_node_impl.h b/lib/pls/include/pls/dataflow/internal/function_node_impl.h index 3f2d3b0..26e641d 100644 --- a/lib/pls/include/pls/dataflow/internal/function_node_impl.h +++ b/lib/pls/include/pls/dataflow/internal/function_node_impl.h @@ -8,7 +8,7 @@ namespace internal { template template -void function_node, pls::dataflow::outputs, F>:: +void function_node, outputs, F>:: token_pushed(token token) { auto current_memory = get_invocation(token.invocation()); @@ -24,7 +24,7 @@ token_pushed(token token) { // Helpers for actually calling the work lambda ////////////////////////////////////////////////////////////////// template -void function_node, pls::dataflow::outputs, F>:: +void function_node, outputs, F>:: execute_function(invocation_memory *invocation_memory, invocation_info invocation_info) { auto lambda = [&]() { input_tuple &inputs = invocation_memory->input_buffer_; @@ -39,14 +39,14 @@ execute_function(invocation_memory *invocation_memory, invocation_info invocatio template template -struct function_node, pls::dataflow::outputs, F>:: +struct function_node, outputs, F>:: propagate_output { propagate_output(multi_out_port_type &, output_tuple &) {} void propagate() {} }; template template -struct function_node, pls::dataflow::outputs, F>:: +struct function_node, outputs, F>:: propagate_output { multi_out_port_type &out_port_; output_tuple &output_tuple_; @@ -62,14 +62,14 @@ propagate_output { template template -void function_node, pls::dataflow::outputs, F>:: +void function_node, outputs, F>:: set_invocation_info(token &token, invocation_info invocation_info) { token.set_invocation(invocation_info); } template template -void function_node, pls::dataflow::outputs, F>:: +void function_node, outputs, F>:: execute_function_internal(input_tuple &inputs, sequence, output_tuple &outputs, sequence, invocation_info invocation_info) { diff --git a/lib/pls/include/pls/dataflow/internal/graph.h b/lib/pls/include/pls/dataflow/internal/graph.h index eb0830c..e4343ce 100644 --- a/lib/pls/include/pls/dataflow/internal/graph.h +++ b/lib/pls/include/pls/dataflow/internal/graph.h @@ -24,10 +24,10 @@ template class graph {}; template -class graph, pls::dataflow::outputs> : public node { +class graph, outputs> : public node { private: // Our own type - using self_type = graph, pls::dataflow::outputs>; + using self_type = graph, outputs>; // Input-Output port types (internal) using inputs_type = multi_out_port; @@ -71,6 +71,7 @@ class graph, pls::dataflow::outputs> : void build(); void run(value_input_tuple input, value_output_tuple &output) { + PLS_ASSERT(build_state_ == build_state::built, "Must build graph before running it!") pls::scheduler::spawn_child(this, input, &output); } diff --git a/lib/pls/include/pls/dataflow/internal/graph_impl.h b/lib/pls/include/pls/dataflow/internal/graph_impl.h index ccdc04c..fe59035 100644 --- a/lib/pls/include/pls/dataflow/internal/graph_impl.h +++ b/lib/pls/include/pls/dataflow/internal/graph_impl.h @@ -8,14 +8,14 @@ namespace internal { template template -void graph, pls::dataflow::outputs>:: +void graph, outputs>:: token_pushed(token token) { auto invocation = get_invocation(token.invocation()); std::get(*invocation->output_buffer_) = token.value(); } template -void graph, pls::dataflow::outputs>:: +void graph, outputs>:: build() { PLS_ASSERT(build_state_ == build_state::fresh, "Must only build a dataflow graph once!") PLS_ASSERT(is_fully_connected(), "Must fully connect all inputs/outputs inside a dataflow graph!") @@ -31,7 +31,7 @@ build() { } template -void graph, pls::dataflow::outputs>:: +void graph, outputs>:: build_recursive(node *node) { if (node->build_state_ != build_state::fresh) { return; // Already visited @@ -48,7 +48,7 @@ build_recursive(node *node) { } template -void graph, pls::dataflow::outputs>:: +void graph, outputs>:: add_node(node *new_node) { new_node->memory_index_ = num_nodes_++; @@ -63,7 +63,7 @@ add_node(node *new_node) { template template -struct graph, pls::dataflow::outputs>:: +struct graph, outputs>:: feed_inputs { feed_inputs(inputs_type &, value_input_tuple &, invocation_info &) {} void run() {} @@ -71,7 +71,7 @@ feed_inputs { template template -struct graph, pls::dataflow::outputs>:: +struct graph, outputs>:: feed_inputs { inputs_type &inputs_; value_input_tuple &input_values_; @@ -90,7 +90,7 @@ feed_inputs { }; template -class graph, pls::dataflow::outputs>::run_graph_task : public pls::task { +class graph, outputs>::run_graph_task : public pls::task { graph *self_; value_input_tuple input_; value_output_tuple *output_; diff --git a/lib/pls/include/pls/dataflow/internal/inputs.h b/lib/pls/include/pls/dataflow/internal/inputs.h index 5bb9e61..9be844a 100644 --- a/lib/pls/include/pls/dataflow/internal/inputs.h +++ b/lib/pls/include/pls/dataflow/internal/inputs.h @@ -4,6 +4,7 @@ namespace pls { namespace dataflow { +namespace internal { template struct inputs { @@ -11,5 +12,6 @@ struct inputs { } } +} #endif //PLS_DATAFLOW_INTERNAL_INPUTS_H_ diff --git a/lib/pls/include/pls/dataflow/internal/node.h b/lib/pls/include/pls/dataflow/internal/node.h index b871183..0b9c447 100644 --- a/lib/pls/include/pls/dataflow/internal/node.h +++ b/lib/pls/include/pls/dataflow/internal/node.h @@ -3,6 +3,7 @@ #define PLS_DATAFLOW_INTERNAL_NODE_H_ #include "build_state.h" +#include "token.h" namespace pls { namespace dataflow { diff --git a/lib/pls/include/pls/dataflow/internal/outputs.h b/lib/pls/include/pls/dataflow/internal/outputs.h index 9090885..40237d9 100644 --- a/lib/pls/include/pls/dataflow/internal/outputs.h +++ b/lib/pls/include/pls/dataflow/internal/outputs.h @@ -4,6 +4,7 @@ namespace pls { namespace dataflow { +namespace internal { template struct outputs { @@ -11,5 +12,6 @@ struct outputs { } } +} #endif //PLS_DATAFLOW_INTERNAL_OUTPUTS_H_ diff --git a/lib/pls/include/pls/pls.h b/lib/pls/include/pls/pls.h index f90d55e..cbaef30 100644 --- a/lib/pls/include/pls/pls.h +++ b/lib/pls/include/pls/pls.h @@ -7,6 +7,7 @@ #include "pls/internal/scheduling/task.h" #include "pls/internal/scheduling/scheduler.h" #include "pls/internal/helpers/unique_id.h" +#include "pls/internal/helpers/member_function.h" namespace pls { @@ -16,6 +17,8 @@ using internal::scheduling::malloc_scheduler_memory; using internal::scheduling::scheduler; using unique_id = internal::helpers::unique_id; +template +using member_function = internal::helpers::member_function; using internal::scheduling::task; using internal::scheduling::lambda_task_by_reference;