最初のグラフ・ノード・クラスとしてほかのノードのコレクションをカプセル化するノード。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() を呼び出した場合の動作は不定です。 |