indexer_node テンプレート・クラス

概要

入力ポートで受け取ったメッセージをすべてのサクセサーにブロードキャストするノード。各ポートで受け取ったメッセージは個別にブロードキャストされます。出力は、タグと値を含むタグ付きメッセージです。タグは、メッセージを受け取った入力ポートを識別します。

構文

template<typename T0, typename T1...typename TN>
 class indexer_node;

ヘッダー

 #include "tbb/flow_graph.h"

説明

indexer_node は、graph_node および sender<indexer_node<T0..TN>::output_type > です。入力の T0 .. TN に対応する receiver<Ti> である入力ポートのタプルが含まれます。異なる型の複数の入力レシーバーをサポートしており、受け取ったメッセージをサクセサーにブロードキャストします。join_node とは異なり、入力ポートで受け取ったメッセージは、indexer_node のすべてのサクセサーに個別にブロードキャストされます。ブロードキャストの前に、メッセージは、メッセージを受け取ったポートのインデックスでタグ付けされます。

input_port テンプレート関数は、特定の入力ポートへの参照を取得するための構文を単純化します。

indexer_node のサクセサーがメッセージを拒否した場合、「メッセージ・パッシング・プロトコル」で説明されているプロトコルを使用して処理されます。入力ポートが着信メッセージを拒否することはありません。

入力リスト T0, T1 ... TN の型は、コピー構築可能および代入可能でなければなりません。

サンプル

#include<cstdio>
#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; } );

  typedef indexer_node<int,float> my_indexer_type;
  my_indexer_type o(g);

  function_node< my_indexer_type::output_type >
    f3( g, unlimited,
        []( const my_indexer_type::output_type &v ) {
            if (v.tag() == 0) {
              printf("Received an int %d\n", 
                     cast_to<int>(v));
            } else {
              printf("Received a float %f\n", 
                     cast_to<float>(v));
           }
        }
    );
  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 を掛けて、f2float f を 2 で割って、f3f1f2 の値を受け取って出力します。indexer_node o は、f1f2 の出力をラップし、それぞれの結果を f3 に送ります。このサンプルは構文を示すことを目的としているため、ノードでほとんど作業を行っていません。

メンバー

namespace tbb {
namespace flow {
  template<typename T0, typename T1...typename TN>
  class indexer_node : public graph_node,
  public sender<implementation-dependent-output-type > {
  public:
    typedef tagged_msg< size_t tag, T result> output_type;
    typedef receiver<output_type> successor_type;
    implementation-dependent-tuple input_ports_type;

    indexer_node(graph &g);
    indexer_node(const indexer_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( );
  };
}
}
次の表は、このテンプレート・クラスのメンバーの詳細な情報を提供します。
メンバー 説明
indexer_node(graph &g)

graph g に属する indexer_node を構築します。

indexer_node( const indexer_node &src )

indexer_node を構築します。プレデセッサーのリスト、入力ポートのメッセージ、サクセサーはコピーされません。

input_ports_type& input_ports()

戻り値: レシーバーの flow::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 )

indexer_node にバッファーは含まれていないため、get はサポートしていません。

戻り値: false

bool try_reserve( output_type & )

indexer_node にバッファーは含まれていないため、予約することはできません。

戻り値: false

bool try_release( )

indexer_node にバッファーは含まれていないため、予約することはできません。

戻り値: false

bool try_consume( )

indexer_node にバッファーは含まれていないため、予約することはできません。

戻り値: false

注意

Microsoft® Windows® オペレーティング・システムでは、配列型を indexer_node に渡すときに既知の問題があります。

関連情報