最初のグラフ・ノード・クラスとしてほかのノードのコレクションをカプセル化するノード。composite_node を利用するには C++11 のサポートが必要です。Microsoft® Windows® では、Visual Studio® 2013 以降が必要です。
template<typename InputTuple, typename OutputTuple> class composite_node;
#include "tbb/flow_graph.h"
composite_node は、任意の数のほかのノードをパッケージできます。パッケージ内の composite_node に接するノードへの入力ポートと出力ポートの参照を保持します。これらの参照を使用して、composite_node 外のほかのノードにエッジを作成できます。InputTuple は入力タイプのタプルです。composite_node には、InputTuple の各タイプに 1 つの入力ポートがあります。同様に、OutputTuple は出力タイプのタプルです。composite_node には、OutputTuple の各タイプに 1 つの出力ポートがあります。
composite_node は、次の 3 つの特殊化を備えた複数ポートのノードです。
input_port テンプレート関数は特定の入力ポートへの参照を取得するために使用できます。また、output_port テンプレート関数は特定の出力ポートへの参照を取得するために使用できます。
composite_node の構築は 2 段階で行われます。
composite_node はコピー構築できません。
#include "tbb/flow_graph.h" #include <iostream> #include <tuple> using namespace tbb::flow; class adder : public composite_node< tuple< int, int >, tuple< int > > { join_node< tuple< int, int >, queueing > j; function_node< tuple< int, int >, int > f; typedef composite_node< tuple< int, int >, tuple< int > > base_type; struct f_body { int operator()( const tuple< int, int > &t ) { int n = (get<1>(t)+1)/2; int sum = get<0>(t) + get<1>(t); std::cout << "Sum of the first " << n <<" positive odd numbers is " << n <<" squared: " << sum << std::endl; return sum; } }; public: adder( graph &g) : base_type(g), j(g), f(g, unlimited, f_body() ) { make_edge( j, f ); base_type::input_ports_type input_tuple(input_port<0>(j), input_port<1>(j)); base_type::output_ports_type output_tuple(f); base_type::set_external_ports(input_tuple, output_tuple); } }; int main() { graph g; split_node< tuple<int, int, int, int> > s(g); adder a0(g); adder a1(g); adder a2(g); make_edge(output_port<0>(s), input_port<0>(a0)); make_edge(output_port<1>(s), input_port<1>(a0)); make_edge(output_port<0>(a0),input_port<0>(a1)); make_edge(output_port<2>(s), input_port<1>(a1)); make_edge(output_port<0>(a1), input_port<0>(a2)); make_edge(output_port<3>(s), input_port<1>(a2)); s.try_put(std::make_tuple(1,3,5,7)); g.wait_for_all(); return 0; }
この例は、composite_node を使用して 2 つのフローグラフのノード (join_node および function_node) をカプセル化します。例では、最初の n 個の正の奇数の合計は n の 2 乗と同じであるという概念が示されています。
クラス adder が定義されます。このクラスには join_node j と 2 つの入力ポイントおよび function_node f が含まれます。j は各入力ポートで数を受け取り、数を加算する f にこれらの数のタプルを送ります。これらの 2 つのノードをカプセル化するため、adder は composite_node 型と 2 つの入力ポートおよび 1 つの出力ポートを継承して、j の 2 つの入力ポートと f の 1 つの出力ポートを紐付けます。
split_node s を正の奇数のソースとして利用します。最初に、4 つの正の奇数 1、3、5 および 7 が使用されます。3 つの adders a0、a1 および a2 が作成されます。最初の adder a0 は、split_node から 1 と 3 を受け取ります。これらの値が加算され、合計が a1 に転送されます。2 番目の adder a1 は、split_node から 1 つの入力ポートで 1 および 3 の合計を受け取り、別の入力ポートで 5 を受け取ります。これらの値も加算され、合計が a2 に転送されます。同様に、3 番目の adder a2 は、split_node から 1 つの入力ポートで 1、3 および 5 の合計を受け取り、別の入力ポートで 7 を受け取ります。各 adder は合計をレポートし、累積された数の 2 乗を計算します。
例を実行すると、次の出力が生成されます。Sum of the first 2 positive odd numbers is 2^2: 4 Sum of the first 3 positive odd numbers is 3^2: 9 Sum of the first 4 positive odd numbers is 4^2: 16
namespace tbb { namespace flow { template< typename InputTuple, typename OutputTuple > class composite_node; // 入力ポートと出力ポートの両方を含む composite_node template< typename... InputTypes, typename... OutputTypes> class composite_node <tbb::flow::tuple<InputTypes...>, tbb::flow::tuple<OutputTypes...> > : public graph_node { public: typedef tbb::flow::tuple< receiver<InputTypes>&... > input_ports_type; typedef tbb::flow::tuple< sender<OutputTypes>&... > output_ports_type; composite_node( graph &g); virtual ~composite_node(); void set_external_ports(input_ports_type&& input_ports_tuple, output_ports_type&& output_ports_tuple); input_ports_type input_ports(); output_ports_type output_ports(); }; // 入力ポートのみを含む composite_node template< typename... InputTypes> class composite_node <tbb::flow::tuple<InputTypes...>, tbb::flow::tuple<> > : public graph_node{ public: typedef tbb::flow::tuple< receiver<InputTypes>&... > input_ports_type; composite_node( graph &g); virtual ~composite_node(); void set_external_ports(input_ports_type&& input_ports_tuple); input_ports_type input_ports(); }; // 出力ポートのみを含む composite_node template<typename... OutputTypes> class composite_node <tbb::flow::tuple<>, tbb::flow::tuple<OutputTypes...> > : public graph_node{ public: typedef tbb::flow::tuple< sender<OutputTypes>&... > output_ports_type; composite_node( graph &g); virtual ~composite_node(); void set_external_ports(output_ports_type&& output_ports_tuple); output_ports_type output_ports(); }; } }
メンバー | 説明 |
---|---|
composite_node( graph &g) |
graph g に属する composite_node を構築します。 |
void set_external_ports(input_ports_type&& input_ports_tuple, output_ports_type&& output_ports_tuple); |
composite_node の入力ポートと出力ポートを input_ports_tuple および output_ports_tuple で参照されるポートへのエイリアスとして作成します。つまり、input_ports_tuple の位置 N で参照されるポートが composite_node の N 番目の入力ポートとしてマップされます。出力ポートも同様です。 |
input_ports_type& input_ports() |
戻り値: receiver の flow::tuple。各要素は、set_external_ports() の該当する位置にエイリアスされた実際のノードまたは入力ポートへの参照です。 注意set_external_ports() への事前の呼び出しを行わないで input_ports() を呼び出した場合の動作は不定です。 |
output_ports_type& output_ports() |
戻り値: sender の flow::tuple。各要素は、set_external_ports() の該当する位置にエイリアスされた実際のノードまたは出力ポートへの参照です。 注意set_external_ports() への事前の呼び出しを行わないで output_ports() を呼び出した場合の動作は不定です。 |