diff --git a/app/playground/main.cpp b/app/playground/main.cpp index 0b1a636..eb9384b 100644 --- a/app/playground/main.cpp +++ b/app/playground/main.cpp @@ -28,7 +28,8 @@ int main() { auto minus_one = [](const int &i1, int &o1) { o1 = i1 - 1; }; - function_node, outputs, decltype(minus_one)> minus_one_node{minus_one}; + function_node, outputs, decltype(minus_one)> minus_one_node_1{minus_one}; + function_node, outputs, decltype(minus_one)> minus_one_node_2{minus_one}; auto is_positive = [](const int &i1, bool &o1) { o1 = i1 > 0; @@ -49,11 +50,12 @@ int main() { merge_node recursion_merge; // Connect + minus_one_node_1 >> minus_one_node_2; // Inputs to first processing step - graph.input<0>() >> minus_one_node.in_port<0>(); + graph.input<0>() >> minus_one_node_1.in_port<0>(); graph.input<1>() >> triple_node.in_port<0>(); - minus_one_node.out_port<0>() >> minus_split.value_in_port(); + minus_one_node_2.out_port<0>() >> minus_split.value_in_port(); // Prepare decision... minus_split.out_port_1() >> is_positive_node.in_port<0>(); diff --git a/lib/pls/include/pls/dataflow/internal/function_node.h b/lib/pls/include/pls/dataflow/internal/function_node.h index ed6205f..8005470 100644 --- a/lib/pls/include/pls/dataflow/internal/function_node.h +++ b/lib/pls/include/pls/dataflow/internal/function_node.h @@ -22,6 +22,10 @@ namespace internal { using namespace pls::internal::helpers; +// Forward Decl +template +class graph; + template class function_node {}; @@ -60,11 +64,26 @@ class function_node, outputs, F> : public node { return in_port_.template get(); } + multi_in_port_type &in_ports() { + return in_port_; + } + template out_port_at &out_port() { return out_port_.template get(); } + multi_out_port_type &out_ports() { + return out_port_; + } + + template + function_node, outputs, FUNC> + &operator>>(function_node, outputs, FUNC> &other_node); + + template + void operator>>(graph, outputs> &graph); + template void token_pushed(token token); 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 26e641d..36f083b 100644 --- a/lib/pls/include/pls/dataflow/internal/function_node_impl.h +++ b/lib/pls/include/pls/dataflow/internal/function_node_impl.h @@ -2,11 +2,29 @@ #ifndef PLS_DATAFLOW_INTERNAL_FUNCTION_NODE_IMPL_H_ #define PLS_DATAFLOW_INTERNAL_FUNCTION_NODE_IMPL_H_ +#include "graph.h" + namespace pls { namespace dataflow { namespace internal { template +template +function_node, outputs, FUNC>& +function_node, outputs, F>:: +operator>>(function_node, outputs, FUNC> &other_node) { + out_port_ >> other_node.in_ports(); + return other_node; +} + +template +template +void function_node, outputs, F>:: +operator>>(graph, outputs> &graph) { + out_port_ >> graph.output_ports(); +} + +template template void function_node, outputs, F>:: token_pushed(token token) { diff --git a/lib/pls/include/pls/dataflow/internal/graph.h b/lib/pls/include/pls/dataflow/internal/graph.h index e4343ce..75436ad 100644 --- a/lib/pls/include/pls/dataflow/internal/graph.h +++ b/lib/pls/include/pls/dataflow/internal/graph.h @@ -25,6 +25,9 @@ class graph {}; template class graph, outputs> : public node { + template + friend + class function_node; private: // Our own type using self_type = graph, outputs>; @@ -58,11 +61,24 @@ class graph, outputs> : public node { input_at &input() { return inputs_.template get(); } + + inputs_type& input_ports() { + return inputs_; + } + template output_at &output() { return outputs_.template get(); } + outputs_type& output_ports() { + return outputs_; + } + + template + function_node, outputs, FUNC> + &operator>>(function_node, outputs, FUNC> &other_node); + template void token_pushed(token token); diff --git a/lib/pls/include/pls/dataflow/internal/graph_impl.h b/lib/pls/include/pls/dataflow/internal/graph_impl.h index fe59035..e675752 100644 --- a/lib/pls/include/pls/dataflow/internal/graph_impl.h +++ b/lib/pls/include/pls/dataflow/internal/graph_impl.h @@ -7,6 +7,14 @@ namespace dataflow { namespace internal { template +template +function_node, outputs, FUNC> &graph, outputs>:: +operator>>(function_node, outputs, FUNC> &other_node) { + inputs_ >> other_node.in_ports(); + return other_node; +} + +template template void graph, outputs>:: token_pushed(token token) { diff --git a/lib/pls/include/pls/dataflow/internal/out_port.h b/lib/pls/include/pls/dataflow/internal/out_port.h index dc8f816..b499150 100644 --- a/lib/pls/include/pls/dataflow/internal/out_port.h +++ b/lib/pls/include/pls/dataflow/internal/out_port.h @@ -69,6 +69,12 @@ class multi_out_port { return std::get(outputs_); } + // Simple interface to connect multiple intputs to matching, multiple outputs + template + void operator>>(multi_in_port &input) { + connect_to < CB, 0 > {this, &input}.connect(); + } + node *next_node_at(int pos) const { return next_node < 0 > {&outputs_}.get(pos); } @@ -115,8 +121,26 @@ class multi_out_port { return true; } }; -}; + template + struct connect_to { + multi_out_port *out_port_; + multi_in_port *in_port_; + + void connect() { + out_port_->template get() >> in_port_->template get(); + connect_to{out_port_, in_port_}.connect(); + } + }; + template + struct connect_to { + multi_out_port *out_port_; + multi_in_port *in_port_; + + void connect() { + }; + }; +}; } } } diff --git a/lib/pls/include/pls/internal/data_structures/work_stealing_deque.h b/lib/pls/include/pls/internal/data_structures/work_stealing_deque.h index f6338f9..d985632 100644 --- a/lib/pls/include/pls/internal/data_structures/work_stealing_deque.h +++ b/lib/pls/include/pls/internal/data_structures/work_stealing_deque.h @@ -25,7 +25,7 @@ class work_stealing_deque_item { // as the race occurs in 'pop_head', where ALL CASES reading a corrupt/old value are cases // where the next CAS fails anywas, thus making these corrupted values have no influence on // the overall program execution. - // ==> If we find performance problems in this queue, try removing the atoimcs again. + // ==> If we find performance problems in this queue, try removing the atomics again. // Pointer to the actual data std::atomic data_; // Index (relative to stack base) to the next and previous element