composite_node
[flow_graph.composite_node]
最初のグラフ・ノード・クラスとしてほかのノードのコレクションをカプセル化するノード。
// <oneapi/tbb/flow_graph.h> ヘッダーで定義
namespace oneapi {
namespace tbb {
namespace flow {
template< typename InputTuple, typename OutputTuple > class composite_node;
// 入力ポートと出力ポートを備えた composite_node
template< typename...InputTypes, typename... OutputTypes>
class composite_node <std::tuple<InputTypes...>, std::tuple<OutputTypes...> > : public graph_node {
public:
typedef std::tuple< receiver<InputTypes>&...> input_ports_type;
typedef std::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 <std::tuple<InputTypes...>, std::tuple<> > : public graph_node{
public:
typedef std::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 <std::tuple<>, std::tuple<OutputTypes...> > : public graph_node{
public:
typedef std::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();
};
} // namespace flow
} // namespace tbb
} // namespace oneapi
InputTuple
およびOutputTuple
は、std::tuple
のインスタンス化でなければなりません。
composite_node
は、graph_node
、receiver<T>
、および sender<T>
です。
composite_node
は、任意の数のほかのノードをパッケージできます。composite_node
に接するパッケージ内のノードへの入力ポートと出力ポートの参照を維持します。これらの参照を使用して、composite_node
外のほかのノードにエッジを作成できます。InputTuple
は入力タイプのタプルです。composite_node
には、InputTuple
の各タイプに 1 つの入力ポートがあります。同様に、OutputTuple
は出力タイプのタプルです。composite_node
には、OutputTuple
の各タイプに 1 つの出力ポートがあります。
composite_node は、次の 3 つの特殊化を備えた複数ポートのノードです。
複数入力ポートと複数出力ポートの複数ポートノードこの特殊化は、
InputTuple
のタイプのreceiver
(レシーバー) である入力ポートのタプルを持ちます。各入力ポートは、composite_node
がカプセル化するノードのポートへの参照です。同様に、この特殊化はOutputTuple
のタイプのsender
(センダー) である出力ポートのタプルも持ちます。各出力ポートは、composite_node
がカプセル化するノードのポートへの参照です。入力ポートを持ち出力ポートを持たない複数ポートノードこの特殊化は入力ポートのタプルのみを持ちます。
出力ポートを持ち入力ポートを持たない複数ポートノードこの特殊化は出力ポートのタプルのみを持ちます。
関数テンプレート input_port を使用して特定の入力ポートへの参照を取得し、関数テンプレート output_port を使用して特定の出力ポートへの参照を取得できます。
composite_node
の構築は 2 段階で行われます。
InputTuple
とOutputTuple
を指定してcomposite_node
を定義します。composite_node
に接するカプセル化されたノードからcomposite_node
の入力ポートおよび出力ポートへのエイリアスを作成します。この処理を行わないとcomposite_node
の入力ポートおよび出力ポートは実際のノードにバインドされないため必須です。エイリアスの作成は、set_external_ports
メソッドを呼び出して行います。
composite_node は、[copyconstructible] ISO C++ 標準の CopyConstructible の要件を満たしません。
メンバー関数
- composite_node(graph &g)
グラフ
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()
戻り値:
receivers
のstd::tuple
を返します。各要素は、set_external_ports()
の該当する位置にエイリアスされた実際のノードまたは出力ポートへの参照です。警告
set_external_ports()
を事前に呼び出さずにinput_ports()
を呼び出すと、未定義の動作となります。
- output_ports_type &output_ports()
戻り値:
senders
のstd::tuple
を返します。各要素は、set_external_ports()
の該当する位置にエイリアスされた実際のノードまたは出力ポートへの参照です。警告
set_external_ports()
を事前に呼び出さずにoutput_ports()
を呼び出すと、未定義の動作となります。
参照: