composite_node テンプレート・クラス

概要

最初のグラフ・ノード・クラスとしてほかのノードのコレクションをカプセル化するノード。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 つのノードをカプセル化するため、addercomposite_node 型と 2 つの入力ポートおよび 1 つの出力ポートを継承して、j の 2 つの入力ポートと f の 1 つの出力ポートを紐付けます。

split_node s を正の奇数のソースとして利用します。最初に、4 つの正の奇数 1、3、5 および 7 が使用されます。3 つの adders a0a1 および 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_nodeN 番目の入力ポートとしてマップされます。出力ポートも同様です。

input_ports_type& input_ports()

戻り値: receiverflow::tuple。各要素は、set_external_ports() の該当する位置にエイリアスされた実際のノードまたは入力ポートへの参照です。

注意

set_external_ports() への事前の呼び出しを行わないで input_ports() を呼び出した場合の動作は不定です。

output_ports_type& output_ports()

戻り値: senderflow::tuple。各要素は、set_external_ports() の該当する位置にエイリアスされた実際のノードまたは出力ポートへの参照です。

注意

set_external_ports() への事前の呼び出しを行わないで output_ports() を呼び出した場合の動作は不定です。

関連情報