入力ポートで受け取ったメッセージをすべての後続 (successor) にブロードキャストするノード。 各入力ポート pi は receiver<Ti> です。 各ポートで受け取ったメッセージは個別にブロードキャストされます。 出力メッセージは、メッセージを受け取ったポートを識別するインデックス番号と、値が格納された入力型のタプルからなる構造体です。
template<typename InputTuple> class or_node;
#define TBB_PREVIEW_GRAPH_NODES 1 #include "tbb/flow_graph.h"
or_node は、graph_node および sender<or_node<InputTyple>::output_type > です。 InputTuple の T0 .. TN に対応する receiver<Ti> である入力ポートのタプルが含まれます。 異なる型の複数の入力レシーバーをサポートしており、受け取ったメッセージを後続にブロードキャストします。 join_node とは異なり、入力ポートで受け取ったメッセージは、or_node のすべての後続に個別にブロードキャストされます。 受け取ったメッセージは、メッセージを受け取ったポート番号のインデックスと受け取った値が格納された入力型のタプルからなる構造体にラップされます。
input_port テンプレート関数は、特定の入力ポートへの参照を取得するための構文を単純化します。
or_node の後続がメッセージを拒否した場合、メッセージ・パッシング・プロトコルを使用して処理されます (詳細は、以下のリンクを参照)。 入力ポートがメッセージの受け取りを拒否することはありません。
InputTuple は、各要素がコピー構築および代入可能な std::tuple<T0,T1,...> でなければなりません。
#include<cstdio>
#define TBB_PREVIEW_GRAPH_NODES 1
#include "tbb/flow_graph.h"
using namespace tbb::flow;
int main() {
graph g;
function_node<int,int> f1( g, unlimited,
[](const int &i) { return 2*i; } );
function_node<float,float> f2( g, unlimited,
[](const float &f) { return f/2; } );
or_node< std::tuple<int,float> > my_or_type;
my_or_type o(g);
function_node< my_or_type::output_type >
f3( g, unlimited,
[]( const my_or_type::output_type &v ) {
if (v.indx == 0) {
printf("Received an int %d\n",
std::get<0>(v.result));
} else {
printf("Received a float %f\n",
std::get<1>(v.result));
}
}
);
make_edge( f1, input_port<0>(o) );
make_edge( f2, input_port<1>(o) );
make_edge( o, f3 );
f1.try_put( 3 );
f2.try_put( 3 );
g.wait_for_all();
return 0;
}
上記の例では、3 つの function_node オブジェクトが作成されます。f1 は int i に 2 を掛けて、f2 は float f を 2 で割って、f3 は f1 と f2 の値を受け取って出力します。 or_node j は、f1 と f2 の出力をラップし、それぞれの結果を f3 に送ります。 この例は構文を示すことを目的としているため、ノードでほとんど作業を行っていません。
namespace tbb {
namespace flow {
template<typename InputTuple>
class or_node : public graph_node,
public sender<impl-dependent-output-type > {
public:
typedef struct { size_t indx; InputTuple result; } output_type;
typedef receiver<output_type> successor_type;
implementation-dependent-tuple input_ports_tuple_type;
or_node(graph &g);
or_node(const or_node &src);
input_ports_type &input_ports();
bool register_successor( successor_type &r );
bool remove_successor( successor_type &r );
bool try_get( output_type &v );
bool try_reserve( output_type & );
bool try_release( );
bool try_consume( );
};
}
}
| メンバー | 説明 |
|---|---|
| or_node(graph &g) |
graph g に属する or_node を構築します。 |
| or_node( const or_node &src ) |
or_node を構築します。 先行 (predecessor) のリスト、入力ポートのメッセージ、後続はコピーされません。 |
| input_ports_type& input_ports() |
戻り値: レシーバーの std::tuple。 各要素は tbb::receiver<T> から継承されます。T はその入力で想定されるメッセージの型です。 各タプル要素は、flow::receiver<T> と同じように使用できます。 |
| bool register_successor( successor_type & r ) |
後続のセットに r を追加します。 戻り値: true。 |
| bool remove_successor( successor_type & r ) |
後続のセットから r を削除します。 戻り値: true。 |
| bool try_get( output_type &v ) |
or_node にバッファーは含まれていないため、get はサポートしていません。 戻り値: false。 |
| bool try_reserve( output_type & ) |
or_node にバッファーは含まれていないため、予約することはできません。 戻り値: false。 |
| bool try_release( ) |
or_node にバッファーは含まれていないため、予約することはできません。 戻り値: false。 |
| bool try_consume( ) |
or_node にバッファーは含まれていないため、予約することはできません。 戻り値: false。 |