17 #ifndef __TBB__flow_graph_join_impl_H    18 #define __TBB__flow_graph_join_impl_H    20 #ifndef __TBB_flow_graph_H    21 #error Do not #include this internal file directly; use public TBB headers instead.    39     template<
typename KeyType>
    50         template< 
typename TupleType, 
typename PortType >
    55         template< 
typename TupleType >
    57             tbb::flow::get<N-1>( my_input ).consume();
    61         template< 
typename TupleType >
    63             tbb::flow::get<N-1>( my_input ).
release();
    66         template <
typename TupleType>
    72         template< 
typename InputTuple, 
typename OutputTuple >
    73         static inline bool reserve( InputTuple &my_input, OutputTuple &out) {
    74             if ( !tbb::flow::get<N-1>( my_input ).
reserve( tbb::flow::get<N-1>( out ) ) ) 
return false;
    82         template<
typename InputTuple, 
typename OutputTuple>
    83         static inline bool get_my_item( InputTuple &my_input, OutputTuple &out) {
    84             bool res = tbb::flow::get<N-1>(my_input).get_item(tbb::flow::get<N-1>(out) ); 
    88         template<
typename InputTuple, 
typename OutputTuple>
    89         static inline bool get_items(InputTuple &my_input, OutputTuple &out) {
    93         template<
typename InputTuple>
    96             tbb::flow::get<N-1>(my_input).reset_port();
    99         template<
typename InputTuple>
   104         template<
typename InputTuple, 
typename KeyFuncTuple>
   106             tbb::flow::get<N-1>(my_input).set_my_key_func(tbb::flow::get<N-1>(my_key_funcs));
   107             tbb::flow::get<N-1>(my_key_funcs) = NULL;
   111         template< 
typename KeyFuncTuple>
   113             if(tbb::flow::get<N-1>(other_inputs).get_my_key_func()) {
   114                 tbb::flow::get<N-1>(my_inputs).set_my_key_func(tbb::flow::get<N-1>(other_inputs).get_my_key_func()->clone());
   119         template<
typename InputTuple>
   122             tbb::flow::get<N-1>(my_input).reset_receiver(f);
   125 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   126         template<
typename InputTuple>
   127         static inline void extract_inputs(InputTuple &my_input) {
   129             tbb::flow::get<N-1>(my_input).extract_receiver();
   137         template< 
typename TupleType, 
typename PortType >
   139             tbb::flow::get<0>( my_input ).set_join_node_pointer(port);
   142         template< 
typename TupleType >
   144             tbb::flow::get<0>( my_input ).consume();
   147         template< 
typename TupleType >
   149             tbb::flow::get<0>( my_input ).release();
   152         template<
typename TupleType>
   157         template< 
typename InputTuple, 
typename OutputTuple >
   158         static inline bool reserve( InputTuple &my_input, OutputTuple &out) {
   159             return tbb::flow::get<0>( my_input ).reserve( tbb::flow::get<0>( out ) );
   162         template<
typename InputTuple, 
typename OutputTuple>
   163         static inline bool get_my_item( InputTuple &my_input, OutputTuple &out) {
   164             return tbb::flow::get<0>(my_input).get_item(tbb::flow::get<0>(out));
   167         template<
typename InputTuple, 
typename OutputTuple>
   168         static inline bool get_items(InputTuple &my_input, OutputTuple &out) {
   172         template<
typename InputTuple>
   174             tbb::flow::get<0>(my_input).reset_port();
   177         template<
typename InputTuple>
   182         template<
typename InputTuple, 
typename KeyFuncTuple>
   184             tbb::flow::get<0>(my_input).set_my_key_func(tbb::flow::get<0>(my_key_funcs));
   185             tbb::flow::get<0>(my_key_funcs) = NULL;
   188         template< 
typename KeyFuncTuple>
   190             if(tbb::flow::get<0>(other_inputs).get_my_key_func()) {
   191                 tbb::flow::get<0>(my_inputs).set_my_key_func(tbb::flow::get<0>(other_inputs).get_my_key_func()->clone());
   194         template<
typename InputTuple>
   196             tbb::flow::get<0>(my_input).reset_receiver(f);
   199 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   200         template<
typename InputTuple>
   201         static inline void extract_inputs(InputTuple &my_input) {
   202             tbb::flow::get<0>(my_input).extract_receiver();
   208     template< 
typename T >
   213 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   214         typedef typename receiver<input_type>::predecessor_list_type predecessor_list_type;
   215         typedef typename receiver<input_type>::built_predecessors_type built_predecessors_type;
   220 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   221             , add_blt_pred, del_blt_pred, blt_pred_cnt, blt_pred_cpy
   232 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   234                 predecessor_list_type *plist;
   250             bool no_predecessors;
   253                 op_list = op_list->
next;
   254                 switch(current->
type) {
   258                     if ( no_predecessors ) {
   292 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   380 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   383             reserving_port_operation op_data(src, add_blt_pred);
   388             reserving_port_operation op_data(src, del_blt_pred);
   393             reserving_port_operation op_data(blt_pred_cnt);
   395             return op_data.cnt_val;
   399             reserving_port_operation op_data(blt_pred_cpy);
   404         void extract_receiver() {
   419 #if __TBB_PREVIEW_FLOW_GRAPH_NODE_SET   420         friend class get_graph_helper;
   435 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   436         typedef typename receiver<input_type>::built_predecessors_type built_predecessors_type;
   437         typedef typename receiver<input_type>::predecessor_list_type predecessor_list_type;
   443 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   444             , add_blt_pred, del_blt_pred, blt_pred_cnt, blt_pred_cpy
   453 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   456             predecessor_list_type *plist;
   484                 op_list = op_list->
next;
   485                 switch(current->
type) {
   514 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   516                     my_built_predecessors.add_edge(*(current->pred));
   520                     my_built_predecessors.delete_edge(*(current->pred));
   524                     current->cnt_val = my_built_predecessors.edge_count();
   528                     my_built_predecessors.copy_edges(*(current->plist));
   586 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   587         built_predecessors_type &built_predecessors() 
__TBB_override { 
return my_built_predecessors; }
   590             queueing_port_operation op_data(add_blt_pred);
   596             queueing_port_operation op_data(del_blt_pred);
   602             queueing_port_operation op_data(blt_pred_cnt);
   604             return op_data.cnt_val;
   608             queueing_port_operation op_data(blt_pred_cpy);
   613         void extract_receiver() {
   615             my_built_predecessors.receiver_extract(*
this);
   622 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   624                 my_built_predecessors.clear();
   629 #if __TBB_PREVIEW_FLOW_GRAPH_NODE_SET   630         friend class get_graph_helper;
   634 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   635         edge_container<predecessor_type> my_built_predecessors;
   649     template< 
typename K >
   657     template< 
class TraitsType >
   659         public receiver<typename TraitsType::T>,
   660         public hash_buffer< typename TraitsType::K, typename TraitsType::T, typename TraitsType::TtoK,
   661                 typename TraitsType::KHash > {
   672 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   673         typedef typename receiver<input_type>::built_predecessors_type built_predecessors_type;
   674         typedef typename receiver<input_type>::predecessor_list_type predecessor_list_type;
   680 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   681            , add_blt_pred, del_blt_pred, blt_pred_cnt, blt_pred_cpy
   690 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   693             predecessor_list_type *plist;
   713                 op_list = op_list->
next;
   714                 switch(current->
type) {
   724                         __TBB_ASSERT(
false, 
"Failed to find item corresponding to current_key.");
   733 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   735                     my_built_predecessors.add_edge(*(current->pred));
   739                     my_built_predecessors.delete_edge(*(current->pred));
   743                     current->cnt_val = my_built_predecessors.edge_count();
   747                     my_built_predecessors.copy_edges(*(current->plist));
   805 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   806         built_predecessors_type &built_predecessors() 
__TBB_override { 
return my_built_predecessors; }
   809             key_matching_port_operation op_data(add_blt_pred);
   815             key_matching_port_operation op_data(del_blt_pred);
   821             key_matching_port_operation op_data(blt_pred_cnt);
   823             return op_data.cnt_val;
   827             key_matching_port_operation op_data(blt_pred_cpy);
   841 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   842         void extract_receiver() {
   844             my_built_predecessors.receiver_extract(*
this);
   850 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   852               my_built_predecessors.clear();
   860 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   861         edge_container<predecessor_type> my_built_predecessors;
   865     using namespace graph_policy_namespace;
   867     template<
typename JP, 
typename InputTuple, 
typename OutputTuple>
   871     template<
typename JP, 
typename InputTuple, 
typename OutputTuple>
   874     template<
typename InputTuple, 
typename OutputTuple>
   883             ports_with_no_inputs = N;
   888             ports_with_no_inputs = N;
   895             ++ports_with_no_inputs;
   900             if(ports_with_no_inputs.fetch_and_decrement() == 1) {
   902                     task *rtask = 
new ( task::allocate_additional_child_of( *(this->graph_ref.root_task()) ) )
   904                     if(!handle_task) 
return rtask;
   917             ports_with_no_inputs = N;
   921 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION   924             ports_with_no_inputs = N;
   932             return !ports_with_no_inputs;
   936             if(ports_with_no_inputs) 
return false;
   952     template<
typename InputTuple, 
typename OutputTuple>
   961             ports_with_no_items = N;
   966             ports_with_no_items = N;
   974             ports_with_no_items = N;
   980             if(ports_with_no_items.fetch_and_decrement() == 1) {
   982                     task *rtask = 
new ( task::allocate_additional_child_of( *(this->graph_ref.root_task()) ) )
   984                     if(!handle_task) 
return rtask;
  1002 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION  1011             return !ports_with_no_items;
  1015             if(ports_with_no_items) 
return false;
  1033     template<
typename InputTuple, 
typename OutputTuple, 
typename K, 
typename KHash>
  1037                   typename tbb::internal::strip<K>::type&,        
  1038                   count_element<typename tbb::internal::strip<K>::type>,
  1039                   internal::type_to_key_function_body<
  1040                       count_element<typename tbb::internal::strip<K>::type>,
  1041                       typename tbb::internal::strip<K>::type& >,
  1070         enum op_type { res_count, inc_count, may_succeed, try_make };
  1082                  my_output(NULL), bypass_t(NULL), enqueue_task(q_task) {}
  1084                  enqueue_task(true) {}
  1100             this->current_key = t;
  1101             this->delete_with_key(this->current_key);   
  1103                 this->push_back(l_out);
  1105                     rtask = 
new ( task::allocate_additional_child_of( *(this->graph_ref.root_task()) ) )
  1117                 __TBB_ASSERT(
false, 
"should have had something to push");
  1123             key_matching_FE_operation *current;
  1126                 op_list = op_list->next;
  1127                 switch(current->type) {
  1130                         this->destroy_front();
  1137                         bool do_enqueue = current->enqueue_task;
  1138                         if(!(this->find_ref_with_key(t,
p))) {
  1142                             this->insert_with_key(ev);
  1143                             if(!(this->find_ref_with_key(t,
p))) {
  1144                                 __TBB_ASSERT(
false, 
"should find key after inserting it");
  1147                         if(++(
p->my_value) == 
size_t(N)) {
  1148                             task *rtask = fill_output_buffer(t, 
true, do_enqueue);
  1149                             __TBB_ASSERT(!rtask || !do_enqueue, 
"task should not be returned");
  1150                             current->bypass_t = rtask;
  1159                     if(this->buffer_empty()) {
  1163                         *(current->my_output) = this->front();
  1173         template<
typename FunctionTuple>
  1179             this->set_key_func(cfb);
  1189             this->set_key_func(cfb);
  1196             key_matching_FE_operation op_data(res_count);
  1197             my_aggregator.
execute(&op_data);
  1204             key_matching_FE_operation op_data(t, handle_task, inc_count);
  1205             my_aggregator.
execute(&op_data);
  1206             return op_data.bypass_t;
  1221             key_to_count_buffer_type::reset();
  1222             output_buffer_type::reset();
  1225 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION  1229             key_to_count_buffer_type::reset();  
  1230             output_buffer_type::reset();  
  1237             key_matching_FE_operation op_data(may_succeed);
  1238             my_aggregator.
execute(&op_data);
  1245             key_matching_FE_operation op_data(&out,try_make);
  1246             my_aggregator.
execute(&op_data);
  1263     template<
typename JP, 
typename InputTuple, 
typename OutputTuple>
  1265                            public sender<OutputTuple> {
  1267         using graph_node::my_graph;
  1273         using input_ports_type::tuple_build_may_succeed;
  1274         using input_ports_type::try_to_make_tuple;
  1275         using input_ports_type::tuple_accepted;
  1276         using input_ports_type::tuple_rejected;
  1277 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION  1278         typedef typename sender<output_type>::built_successors_type built_successors_type;
  1279         typedef typename sender<output_type>::successor_list_type successor_list_type;
  1285 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION  1286             , add_blt_succ, del_blt_succ, blt_succ_cnt, blt_succ_cpy
  1297 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION  1299                 successor_list_type *slist;
  1304                 my_arg(const_cast<
output_type*>(&e)), bypass_t(NULL) {}
  1319                 op_list = op_list->
next;
  1320                 switch(current->
type) {
  1322                         my_successors.register_successor(*(current->
my_succ));
  1324                             task *rtask = 
new ( task::allocate_additional_child_of(*(my_graph.root_task())) )
  1328                             forwarder_busy = 
true;
  1334                     my_successors.remove_successor(*(current->
my_succ));
  1338                     if(tuple_build_may_succeed()) {
  1339                         if(try_to_make_tuple(*(current->
my_arg))) {
  1347                 case do_fwrd_bypass: {
  1348                         bool build_succeeded;
  1349                         task *last_task = NULL;
  1351                         if(tuple_build_may_succeed()) {  
  1353                                 build_succeeded = try_to_make_tuple(out);  
  1354                                 if(build_succeeded) {
  1355                                     task *new_task = my_successors.try_put_task(out);
  1362                                         build_succeeded = 
false;
  1365                             } 
while(build_succeeded);
  1369                         forwarder_busy = 
false;
  1372 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION  1374                     my_successors.internal_add_built_successor(*(current->
my_succ));
  1378                     my_successors.internal_delete_built_successor(*(current->
my_succ));
  1382                     current->cnt_val = my_successors.successor_count();
  1386                     my_successors.copy_successors(*(current->slist));
  1396             my_successors.set_owner(
this);
  1397             input_ports_type::set_my_node(
this);
  1403             sender<OutputTuple>(), forwarder_busy(false), my_successors() {
  1404             my_successors.set_owner(
this);
  1405             input_ports_type::set_my_node(
this);
  1409         template<
typename FunctionTuple>
  1411             my_successors.set_owner(
this);
  1412             input_ports_type::set_my_node(
this);
  1418             my_aggregator.
execute(&op_data);
  1424             my_aggregator.
execute(&op_data);
  1430             my_aggregator.
execute(&op_data);
  1434 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION  1435         built_successors_type &built_successors() 
__TBB_override { 
return my_successors.built_successors(); }
  1437         void internal_add_built_successor( successor_type &r) 
__TBB_override {
  1438             join_node_base_operation op_data(r, add_blt_succ);
  1439             my_aggregator.
execute(&op_data);
  1442         void internal_delete_built_successor( successor_type &r) 
__TBB_override {
  1443             join_node_base_operation op_data(r, del_blt_succ);
  1444             my_aggregator.
execute(&op_data);
  1448             join_node_base_operation op_data(blt_succ_cnt);
  1449             my_aggregator.
execute(&op_data);
  1450             return op_data.cnt_val;
  1454             join_node_base_operation op_data(blt_succ_cpy);
  1456             my_aggregator.
execute(&op_data);
  1460 #if TBB_DEPRECATED_FLOW_NODE_EXTRACTION  1462             input_ports_type::extract();
  1463             my_successors.built_successors().sender_extract(*
this);
  1470             input_ports_type::reset(f);
  1480             my_aggregator.
execute(&op_data);
  1487     template<
int N, 
template<
class> 
class PT, 
typename OutputTuple, 
typename JP>
  1492     template<
int N, 
typename OutputTuple, 
typename K, 
typename KHash>
  1507     template<
int N, 
template<
class> 
class PT, 
typename OutputTuple, 
typename JP>
  1519 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1520     template <
typename K, 
typename T>
  1521     struct key_from_message_body {
  1522         K operator()(
const T& t)
 const {
  1524             return key_from_message<K>(t);
  1528     template <
typename K, 
typename T>
  1529     struct key_from_message_body<K&,T> {
  1530         const K& operator()(
const T& t)
 const {
  1532             return key_from_message<const K&>(t);
  1539     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1541             join_base<2,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1553 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1561         template<
typename Body0, 
typename Body1>
  1572     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1574             join_base<3,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1588 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1597         template<
typename Body0, 
typename Body1, 
typename Body2>
  1609     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1611             join_base<4,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1627 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1637         template<
typename Body0, 
typename Body1, 
typename Body2, 
typename Body3>
  1650     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1652             join_base<5,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1670 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1681         template<
typename Body0, 
typename Body1, 
typename Body2, 
typename Body3, 
typename Body4>
  1695 #if __TBB_VARIADIC_MAX >= 6  1696     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1697     class unfolded_join_node<6,key_matching_port,OutputTuple,key_matching<K,KHash> > : 
public  1698             join_base<6,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1706         typedef typename wrap_key_tuple_elements<6,key_matching_port,key_matching<K,KHash>,OutputTuple>
::type input_ports_type;
  1707         typedef OutputTuple output_type;
  1709         typedef join_node_base<key_matching<K,KHash> , input_ports_type, output_type > base_type;
  1716         typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p > func_initializer_type;
  1718 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1719         unfolded_join_node(graph &g) : base_type(g,
  1720                 func_initializer_type(
  1721                     new 
internal::type_to_key_function_body_leaf<T0, K, key_from_message_body<K,T0> >(key_from_message_body<K,T0>()),
  1722                     new 
internal::type_to_key_function_body_leaf<T1, K, key_from_message_body<K,T1> >(key_from_message_body<K,T1>()),
  1723                     new 
internal::type_to_key_function_body_leaf<T2, K, key_from_message_body<K,T2> >(key_from_message_body<K,T2>()),
  1724                     new 
internal::type_to_key_function_body_leaf<T3, K, key_from_message_body<K,T3> >(key_from_message_body<K,T3>()),
  1725                     new 
internal::type_to_key_function_body_leaf<T4, K, key_from_message_body<K,T4> >(key_from_message_body<K,T4>()),
  1726                     new 
internal::type_to_key_function_body_leaf<T5, K, key_from_message_body<K,T5> >(key_from_message_body<K,T5>())
  1730         template<
typename Body0, 
typename Body1, 
typename Body2, 
typename Body3, 
typename Body4, 
typename Body5>
  1731         unfolded_join_node(graph &g, Body0 body0, Body1 body1, Body2 body2, Body3 body3, Body4 body4, Body5 body5)
  1732                 : base_type(g, func_initializer_type(
  1733                     new 
internal::type_to_key_function_body_leaf<T0, K, Body0>(body0),
  1734                     new 
internal::type_to_key_function_body_leaf<T1, K, Body1>(body1),
  1735                     new 
internal::type_to_key_function_body_leaf<T2, K, Body2>(body2),
  1736                     new 
internal::type_to_key_function_body_leaf<T3, K, Body3>(body3),
  1737                     new 
internal::type_to_key_function_body_leaf<T4, K, Body4>(body4),
  1738                     new 
internal::type_to_key_function_body_leaf<T5, K, Body5>(body5)
  1742         unfolded_join_node(
const unfolded_join_node &other) : base_type(other) {}
  1746 #if __TBB_VARIADIC_MAX >= 7  1747     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1748     class unfolded_join_node<7,key_matching_port,OutputTuple,key_matching<K,KHash> > : 
public  1749             join_base<7,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1758         typedef typename wrap_key_tuple_elements<7,key_matching_port,key_matching<K,KHash>,OutputTuple>
::type input_ports_type;
  1759         typedef OutputTuple output_type;
  1761         typedef join_node_base<key_matching<K,KHash> , input_ports_type, output_type > base_type;
  1769         typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p > func_initializer_type;
  1771 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1772         unfolded_join_node(graph &g) : base_type(g,
  1773                 func_initializer_type(
  1774                     new 
internal::type_to_key_function_body_leaf<T0, K, key_from_message_body<K,T0> >(key_from_message_body<K,T0>()),
  1775                     new 
internal::type_to_key_function_body_leaf<T1, K, key_from_message_body<K,T1> >(key_from_message_body<K,T1>()),
  1776                     new 
internal::type_to_key_function_body_leaf<T2, K, key_from_message_body<K,T2> >(key_from_message_body<K,T2>()),
  1777                     new 
internal::type_to_key_function_body_leaf<T3, K, key_from_message_body<K,T3> >(key_from_message_body<K,T3>()),
  1778                     new 
internal::type_to_key_function_body_leaf<T4, K, key_from_message_body<K,T4> >(key_from_message_body<K,T4>()),
  1779                     new 
internal::type_to_key_function_body_leaf<T5, K, key_from_message_body<K,T5> >(key_from_message_body<K,T5>()),
  1780                     new 
internal::type_to_key_function_body_leaf<T6, K, key_from_message_body<K,T6> >(key_from_message_body<K,T6>())
  1784         template<
typename Body0, 
typename Body1, 
typename Body2, 
typename Body3, 
typename Body4,
  1785                  typename Body5, 
typename Body6>
  1786         unfolded_join_node(graph &g, Body0 body0, Body1 body1, Body2 body2, Body3 body3, Body4 body4,
  1787                 Body5 body5, Body6 body6) : base_type(g, func_initializer_type(
  1788                     new 
internal::type_to_key_function_body_leaf<T0, K, Body0>(body0),
  1789                     new 
internal::type_to_key_function_body_leaf<T1, K, Body1>(body1),
  1790                     new 
internal::type_to_key_function_body_leaf<T2, K, Body2>(body2),
  1791                     new 
internal::type_to_key_function_body_leaf<T3, K, Body3>(body3),
  1792                     new 
internal::type_to_key_function_body_leaf<T4, K, Body4>(body4),
  1793                     new 
internal::type_to_key_function_body_leaf<T5, K, Body5>(body5),
  1794                     new 
internal::type_to_key_function_body_leaf<T6, K, Body6>(body6)
  1798         unfolded_join_node(
const unfolded_join_node &other) : base_type(other) {}
  1802 #if __TBB_VARIADIC_MAX >= 8  1803     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1804     class unfolded_join_node<8,key_matching_port,OutputTuple,key_matching<K,KHash> > : 
public  1805             join_base<8,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1815         typedef typename wrap_key_tuple_elements<8,key_matching_port,key_matching<K,KHash>,OutputTuple>
::type input_ports_type;
  1816         typedef OutputTuple output_type;
  1818         typedef join_node_base<key_matching<K,KHash> , input_ports_type, output_type > base_type;
  1827         typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p > func_initializer_type;
  1829 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1830         unfolded_join_node(graph &g) : base_type(g,
  1831                 func_initializer_type(
  1832                     new 
internal::type_to_key_function_body_leaf<T0, K, key_from_message_body<K,T0> >(key_from_message_body<K,T0>()),
  1833                     new 
internal::type_to_key_function_body_leaf<T1, K, key_from_message_body<K,T1> >(key_from_message_body<K,T1>()),
  1834                     new 
internal::type_to_key_function_body_leaf<T2, K, key_from_message_body<K,T2> >(key_from_message_body<K,T2>()),
  1835                     new 
internal::type_to_key_function_body_leaf<T3, K, key_from_message_body<K,T3> >(key_from_message_body<K,T3>()),
  1836                     new 
internal::type_to_key_function_body_leaf<T4, K, key_from_message_body<K,T4> >(key_from_message_body<K,T4>()),
  1837                     new 
internal::type_to_key_function_body_leaf<T5, K, key_from_message_body<K,T5> >(key_from_message_body<K,T5>()),
  1838                     new 
internal::type_to_key_function_body_leaf<T6, K, key_from_message_body<K,T6> >(key_from_message_body<K,T6>()),
  1839                     new 
internal::type_to_key_function_body_leaf<T7, K, key_from_message_body<K,T7> >(key_from_message_body<K,T7>())
  1843         template<
typename Body0, 
typename Body1, 
typename Body2, 
typename Body3, 
typename Body4,
  1844                  typename Body5, 
typename Body6, 
typename Body7>
  1845         unfolded_join_node(graph &g, Body0 body0, Body1 body1, Body2 body2, Body3 body3, Body4 body4,
  1846                 Body5 body5, Body6 body6, Body7 body7) : base_type(g, func_initializer_type(
  1847                     new 
internal::type_to_key_function_body_leaf<T0, K, Body0>(body0),
  1848                     new 
internal::type_to_key_function_body_leaf<T1, K, Body1>(body1),
  1849                     new 
internal::type_to_key_function_body_leaf<T2, K, Body2>(body2),
  1850                     new 
internal::type_to_key_function_body_leaf<T3, K, Body3>(body3),
  1851                     new 
internal::type_to_key_function_body_leaf<T4, K, Body4>(body4),
  1852                     new 
internal::type_to_key_function_body_leaf<T5, K, Body5>(body5),
  1853                     new 
internal::type_to_key_function_body_leaf<T6, K, Body6>(body6),
  1854                     new 
internal::type_to_key_function_body_leaf<T7, K, Body7>(body7)
  1858         unfolded_join_node(
const unfolded_join_node &other) : base_type(other) {}
  1862 #if __TBB_VARIADIC_MAX >= 9  1863     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1864     class unfolded_join_node<9,key_matching_port,OutputTuple,key_matching<K,KHash> > : 
public  1865             join_base<9,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1876         typedef typename wrap_key_tuple_elements<9,key_matching_port,key_matching<K,KHash>,OutputTuple>
::type input_ports_type;
  1877         typedef OutputTuple output_type;
  1879         typedef join_node_base<key_matching<K,KHash> , input_ports_type, output_type > base_type;
  1889         typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p > func_initializer_type;
  1891 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1892         unfolded_join_node(graph &g) : base_type(g,
  1893                 func_initializer_type(
  1894                     new 
internal::type_to_key_function_body_leaf<T0, K, key_from_message_body<K,T0> >(key_from_message_body<K,T0>()),
  1895                     new 
internal::type_to_key_function_body_leaf<T1, K, key_from_message_body<K,T1> >(key_from_message_body<K,T1>()),
  1896                     new 
internal::type_to_key_function_body_leaf<T2, K, key_from_message_body<K,T2> >(key_from_message_body<K,T2>()),
  1897                     new 
internal::type_to_key_function_body_leaf<T3, K, key_from_message_body<K,T3> >(key_from_message_body<K,T3>()),
  1898                     new 
internal::type_to_key_function_body_leaf<T4, K, key_from_message_body<K,T4> >(key_from_message_body<K,T4>()),
  1899                     new 
internal::type_to_key_function_body_leaf<T5, K, key_from_message_body<K,T5> >(key_from_message_body<K,T5>()),
  1900                     new 
internal::type_to_key_function_body_leaf<T6, K, key_from_message_body<K,T6> >(key_from_message_body<K,T6>()),
  1901                     new 
internal::type_to_key_function_body_leaf<T7, K, key_from_message_body<K,T7> >(key_from_message_body<K,T7>()),
  1902                     new 
internal::type_to_key_function_body_leaf<T8, K, key_from_message_body<K,T8> >(key_from_message_body<K,T8>())
  1906         template<
typename Body0, 
typename Body1, 
typename Body2, 
typename Body3, 
typename Body4,
  1907                  typename Body5, 
typename Body6, 
typename Body7, 
typename Body8>
  1908         unfolded_join_node(graph &g, Body0 body0, Body1 body1, Body2 body2, Body3 body3, Body4 body4,
  1909                 Body5 body5, Body6 body6, Body7 body7, Body8 body8) : base_type(g, func_initializer_type(
  1910                     new 
internal::type_to_key_function_body_leaf<T0, K, Body0>(body0),
  1911                     new 
internal::type_to_key_function_body_leaf<T1, K, Body1>(body1),
  1912                     new 
internal::type_to_key_function_body_leaf<T2, K, Body2>(body2),
  1913                     new 
internal::type_to_key_function_body_leaf<T3, K, Body3>(body3),
  1914                     new 
internal::type_to_key_function_body_leaf<T4, K, Body4>(body4),
  1915                     new 
internal::type_to_key_function_body_leaf<T5, K, Body5>(body5),
  1916                     new 
internal::type_to_key_function_body_leaf<T6, K, Body6>(body6),
  1917                     new 
internal::type_to_key_function_body_leaf<T7, K, Body7>(body7),
  1918                     new 
internal::type_to_key_function_body_leaf<T8, K, Body8>(body8)
  1922         unfolded_join_node(
const unfolded_join_node &other) : base_type(other) {}
  1926 #if __TBB_VARIADIC_MAX >= 10  1927     template<
typename OutputTuple, 
typename K, 
typename KHash>
  1928     class unfolded_join_node<10,key_matching_port,OutputTuple,key_matching<K,KHash> > : 
public  1929             join_base<10,key_matching_port,OutputTuple,key_matching<K,KHash> >
::type {
  1941         typedef typename wrap_key_tuple_elements<10,key_matching_port,key_matching<K,KHash>,OutputTuple>
::type input_ports_type;
  1942         typedef OutputTuple output_type;
  1944         typedef join_node_base<key_matching<K,KHash> , input_ports_type, output_type > base_type;
  1955         typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p, f9_p > func_initializer_type;
  1957 #if __TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING  1958         unfolded_join_node(graph &g) : base_type(g,
  1959                 func_initializer_type(
  1960                     new 
internal::type_to_key_function_body_leaf<T0, K, key_from_message_body<K,T0> >(key_from_message_body<K,T0>()),
  1961                     new 
internal::type_to_key_function_body_leaf<T1, K, key_from_message_body<K,T1> >(key_from_message_body<K,T1>()),
  1962                     new 
internal::type_to_key_function_body_leaf<T2, K, key_from_message_body<K,T2> >(key_from_message_body<K,T2>()),
  1963                     new 
internal::type_to_key_function_body_leaf<T3, K, key_from_message_body<K,T3> >(key_from_message_body<K,T3>()),
  1964                     new 
internal::type_to_key_function_body_leaf<T4, K, key_from_message_body<K,T4> >(key_from_message_body<K,T4>()),
  1965                     new 
internal::type_to_key_function_body_leaf<T5, K, key_from_message_body<K,T5> >(key_from_message_body<K,T5>()),
  1966                     new 
internal::type_to_key_function_body_leaf<T6, K, key_from_message_body<K,T6> >(key_from_message_body<K,T6>()),
  1967                     new 
internal::type_to_key_function_body_leaf<T7, K, key_from_message_body<K,T7> >(key_from_message_body<K,T7>()),
  1968                     new 
internal::type_to_key_function_body_leaf<T8, K, key_from_message_body<K,T8> >(key_from_message_body<K,T8>()),
  1969                     new 
internal::type_to_key_function_body_leaf<T9, K, key_from_message_body<K,T9> >(key_from_message_body<K,T9>())
  1973         template<
typename Body0, 
typename Body1, 
typename Body2, 
typename Body3, 
typename Body4,
  1974             typename Body5, 
typename Body6, 
typename Body7, 
typename Body8, 
typename Body9>
  1975         unfolded_join_node(graph &g, Body0 body0, Body1 body1, Body2 body2, Body3 body3, Body4 body4,
  1976                 Body5 body5, Body6 body6, Body7 body7, Body8 body8, Body9 body9) : base_type(g, func_initializer_type(
  1977                     new 
internal::type_to_key_function_body_leaf<T0, K, Body0>(body0),
  1978                     new 
internal::type_to_key_function_body_leaf<T1, K, Body1>(body1),
  1979                     new 
internal::type_to_key_function_body_leaf<T2, K, Body2>(body2),
  1980                     new 
internal::type_to_key_function_body_leaf<T3, K, Body3>(body3),
  1981                     new 
internal::type_to_key_function_body_leaf<T4, K, Body4>(body4),
  1982                     new 
internal::type_to_key_function_body_leaf<T5, K, Body5>(body5),
  1983                     new 
internal::type_to_key_function_body_leaf<T6, K, Body6>(body6),
  1984                     new 
internal::type_to_key_function_body_leaf<T7, K, Body7>(body7),
  1985                     new 
internal::type_to_key_function_body_leaf<T8, K, Body8>(body8),
  1986                     new 
internal::type_to_key_function_body_leaf<T9, K, Body9>(body9)
  1990         unfolded_join_node(
const unfolded_join_node &other) : base_type(other) {}
  1995     template<
size_t N, 
typename JNT>
  1997         return tbb::flow::get<N>(jn.input_ports());
  2001 #endif // __TBB__flow_graph_join_impl_H 
A cache of successors that are put in a round-robin fashion.
 
const K & operator()(const table_item_type &v)
 
tbb::flow::tuple_element< 0, OutputTuple >::type T0
 
static void release_my_reservation(TupleType &my_input)
 
reserving_port_operation(op_type t)
 
hash_buffer< key_type, input_type, type_to_key_func_type, hash_compare_type > buffer_type
 
key_matching_FE_operation(output_type *p, op_type t)
 
static bool get_my_item(InputTuple &my_input, OutputTuple &out)
 
bool remove_predecessor(predecessor_type &src) __TBB_override
Remove a predecessor.
 
void handle_operations(key_matching_port_operation *op_list)
 
join_node_base_operation(op_type t)
 
tbb::flow::tuple_element< 3, OutputTuple >::type T3
 
graph & graph_reference() const __TBB_override
 
join_node_base(graph &g, FunctionTuple f)
 
internal::aggregating_functor< class_type, queueing_port_operation > handler_type
 
join_node_base_operation(const output_type &e, op_type t)
 
join_node_FE(graph &g, FunctionTuple &TtoK_funcs)
 
static void consume_reservations(TupleType &my_input)
 
internal::join_node_base< JP, typename wrap_tuple_elements< N, PT, OutputTuple >::type, OutputTuple > type
 
internal::join_node_base< key_traits_type, typename wrap_key_tuple_elements< N, key_matching_port, key_traits_type, OutputTuple >::type, OutputTuple > type
 
tbb::internal::strip< key_type >::type noref_key_type
 
void set_my_node(base_node_type *new_my_node)
 
join_node_base< JP, InputTuple, OutputTuple > class_type
 
tbb::flow::tuple_element< 0, OutputTuple >::type T0
 
const item_type & front() const
 
void set_join_node_pointer(forwarding_base *join)
record parent for tallying available items
 
join_node_FE(const join_node_FE &other)
 
join_node_base< JP, input_ports_type, output_type > base_type
 
TraitsType::TtoK * get_key_func()
 
task * increment_key_count(unref_key_type const &t, bool handle_task) __TBB_override
 
static void reset_my_port(InputTuple &my_input)
 
task * try_put_task(const input_type &v) __TBB_override
Put item to successor; return task to run the successor if possible.
 
task * try_put_task(const T &v) __TBB_override
 
atomic< size_t > ports_with_no_inputs
 
virtual task * increment_key_count(current_key_type const &, bool)=0
 
internal::type_to_key_function_body< T4, K > * f4_p
 
reservable_predecessor_cache< T, null_mutex > my_predecessors
 
unfolded_join_node(const unfolded_join_node &other)
 
unfolded_join_node(graph &g)
 
key_matching_FE_operation(const unref_key_type &e, bool q_task, op_type t)
 
tbb::flow::tuple_element< 4, OutputTuple >::type T4
 
static void set_join_node_pointer(TupleType &my_input, PortType *port)
 
void set_join_node_pointer(forwarding_base *join)
 
static bool get_items(InputTuple &my_input, OutputTuple &out)
 
queueing_port(const queueing_port &)
copy constructor
 
key_matching_port(const key_matching_port &)
 
unfolded_join_node(const unfolded_join_node &other)
 
static void reset_my_port(InputTuple &my_input)
 
bool get_item(input_type &v)
 
aggregator< handler_type, reserving_port_operation > my_aggregator
 
static void reset_inputs(InputTuple &my_input, reset_flags f)
 
void increment_port_count() __TBB_override
 
void spawn_in_graph_arena(tbb::flow::interface10::graph &g, tbb::task &arena_task)
Spawns a task inside graph arena.
 
tbb::flow::tuple_element< N, typename JNT::input_ports_type >::type & input_port(JNT &jn)
templated function to refer to input ports of the join node
 
atomic< size_t > ports_with_no_items
 
tbb::internal::strip< K >::type current_key_type
 
key_matching_FE_operation(op_type t)
 
void set_my_node(base_node_type *new_my_node)
 
static void set_key_functors(InputTuple &my_input, KeyFuncTuple &my_key_funcs)
 
void reset_node(reset_flags f) __TBB_override
 
void reset_receiver(reset_flags f) __TBB_override
 
uintptr_t status
Zero value means "wait" status, all other values are "user" specified values and are defined into the...
 
wrap_key_tuple_elements< 3, key_matching_port, key_matching< K, KHash >, OutputTuple >::type input_ports_type
 
join_node_FE(const join_node_FE &other)
 
static void set_join_node_pointer(TupleType &my_input, PortType *port)
 
Base class for types that should not be assigned.
 
internal::aggregating_functor< class_type, reserving_port_operation > handler_type
 
tbb::flow::tuple_element< 2, OutputTuple >::type T2
 
bool push_back(item_type &v)
 
tbb::internal::strip< KeyType >::type current_key_type
 
count_element< K > table_item_type
 
reserving_port< T > class_type
 
queueing_port()
Constructor.
 
unfolded_join_node(graph &g, Body0 body0, Body1 body1, Body2 body2)
 
tbb::flow::tuple_element< 1, OutputTuple >::type T1
 
A task that calls a node's forward_task function.
 
item_buffer< output_type > output_buffer_type
 
TraitsType::TtoK type_to_key_func_type
 
reserving_port_operation(const predecessor_type &s, op_type t)
 
key_matching< K, KHash > key_traits_type
 
unfolded_join_node(const unfolded_join_node &other)
 
unfolded_join_node(graph &g, Body0 body0, Body1 body1, Body2 body2, Body3 body3)
 
internal::type_to_key_function_body_leaf< count_element_type, unref_key_type &, key_to_count_func > TtoK_function_body_leaf_type
 
reserving_port(const reserving_port &)
 
tbb::flow::tuple_element< 2, OutputTuple >::type T2
 
internal::aggregating_functor< class_type, key_matching_FE_operation > handler_type
 
key_matching_port_operation(const input_type &e, op_type t)
 
internal::type_to_key_function_body< T1, K > * f1_p
 
void reset_receiver(reset_flags f) __TBB_override
 
tbb::flow::tuple_element< 0, OutputTuple >::type T0
 
join_node_base< key_matching< K, KHash >, input_ports_type, output_type > base_type
 
void set_join_node_pointer(forwarding_base *join)
 
key_matching_port_operation(op_type t)
 
void reset(reset_flags f)
 
internal::type_to_key_function_body< T0, K > * f0_p
 
bool insert_with_key(const value_type &v)
 
queueing_port< T > class_type
 
internal::type_to_key_function_body< T3, K > * f3_p
 
hash_buffer< unref_key_type &, count_element_type, TtoK_function_body_type, key_hash_compare > key_to_count_buffer_type
 
aggregator< handler_type, queueing_port_operation > my_aggregator
 
static void reset_ports(InputTuple &my_input)
 
static void set_key_functors(InputTuple &my_input, KeyFuncTuple &my_key_funcs)
 
matching_forwarding_base(graph &g)
 
void suppress_unused_warning(const T1 &)
Utility template function to prevent "unused" warnings by various compilers.
 
bool register_successor(successor_type &r) __TBB_override
Add a new successor to this node.
 
tbb::flow::tuple_element< 1, OutputTuple >::type T1
 
join_node_FE : implements input port policy
 
tbb::flow::tuple< f0_p, f1_p > func_initializer_type
 
join_node_base_operation(const successor_type &s, op_type t)
 
broadcast_cache< output_type, null_rw_mutex > my_successors
 
void __TBB_store_with_release(volatile T &location, V value)
 
unfolded_join_node : passes input_ports_type to join_node_base. We build the input port type
 
join_node_FE(const join_node_FE &other)
 
queueing_port_operation(const T *p, op_type t)
 
bool is_graph_active(tbb::flow::interface10::graph &g)
 
key_matching_port_operation(const input_type *p, op_type t)
 
unfolded_join_node(graph &g, Body0 body0, Body1 body1, Body2 body2, Body3 body3, Body4 body4)
 
tbb::flow::tuple_element< 3, OutputTuple >::type T3
 
predecessor_type * my_pred
 
#define __TBB_STATIC_ASSERT(condition, msg)
 
void consume()
Complete use of the port.
 
bool buffer_empty() const
 
unfolded_join_node(const unfolded_join_node &other)
 
aggregator< handler_type, key_matching_port_operation > my_aggregator
 
graph & graph_reference() const __TBB_override
 
sender< output_type >::successor_type successor_type
 
TraitsType::KHash hash_compare_type
 
void increment_port_count() __TBB_override
 
unfolded_join_node(const unfolded_join_node &other)
 
task * fill_output_buffer(unref_key_type &t, bool should_enqueue, bool handle_task)
 
tbb::flow::tuple< f0_p, f1_p, f2_p > func_initializer_type
 
reserving_port()
Constructor.
 
void handle_operations(key_matching_FE_operation *op_list)
 
void execute(operation_type *op)
 
join_node_base< reserving, InputTuple, OutputTuple > base_node_type
 
current_key_type current_key
 
matching_forwarding_base< key_type > forwarding_base_type
 
bool tuple_build_may_succeed()
 
void set_key_func(TraitsType::TtoK *vtk)
 
join_node_base< key_matching< K, KHash >, input_ports_type, output_type > base_type
 
tbb::flow::tuple_element< 0, OutputTuple >::type T0
 
void const char const char int ITT_FORMAT __itt_group_sync p
 
input_type & input_ports()
 
bool reserve(T &v)
Reserve an item from the port.
 
friend class run_and_put_task
 
matching_forwarding_base< key_type > * my_join
 
internal::type_to_key_function_body< T2, K > * f2_p
 
friend class run_and_put_task
 
A cache of successors that are broadcast to.
 
void handle_operations(reserving_port_operation *op_list)
 
unfolded_join_node(graph &g, Body0 body0, Body1 body1)
 
internal::type_to_key_function_body< T1, K > * f1_p
 
bool try_reserve(output_type &v)
 
static tbb::task *const SUCCESSFULLY_ENQUEUED
 
input_type & input_ports()
 
void release()
Release the port.
 
task * decrement_port_count(bool) __TBB_override
 
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task * task
 
bool find_with_key(const Knoref &k, value_type &v)
 
join_node_FE< key_matching< key_type, key_hash_compare >, InputTuple, OutputTuple > class_type
 
bool try_to_make_tuple(output_type &out)
 
bool my_item_valid(size_type i) const
 
bool tuple_build_may_succeed()
 
wrap_tuple_elements< N, PT, OutputTuple >::type input_ports_type
 
internal::type_to_key_function_body< T0, K > * f0_p
 
reserving_port_operation(const T &e, op_type t)
 
bool try_to_make_tuple(output_type &out)
 
key_matching_port< traits > class_type
 
bool register_predecessor(predecessor_type &src) __TBB_override
Add a predecessor.
 
join_node_base(const join_node_base &other)
 
internal::aggregating_functor< class_type, key_matching_port_operation > handler_type
 
wrap_key_tuple_elements< 4, key_matching_port, key_matching< K, KHash >, OutputTuple >::type input_ports_type
 
aggregated_operation base class
 
static bool reserve(InputTuple &my_input, OutputTuple &out)
 
void initialize_handler(handler_type h)
 
internal::type_to_key_function_body< T0, K > * f0_p
 
friend class run_and_put_task
 
queueing_port_operation(op_type t)
 
input_type & input_ports()
 
graph & graph_reference() const __TBB_override
 
static void release_reservations(TupleType &my_input)
 
void set_my_node(base_node_type *new_my_node)
 
internal::type_to_key_function_body< T2, K > * f2_p
 
task * decrement_port_count(bool handle_task) __TBB_override
 
tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p > func_initializer_type
 
static void copy_key_functors(KeyFuncTuple &my_inputs, KeyFuncTuple &other_inputs)
 
virtual task * decrement_port_count(bool handle_task)=0
 
type_to_key_func_type * get_my_key_func()
 
void delete_with_key(const Knoref &k)
 
bool try_to_make_tuple(output_type &out)
 
void const char const char int ITT_FORMAT __itt_group_sync s
 
static void release_my_reservation(TupleType &my_input)
 
static void release_reservations(TupleType &my_input)
 
tbb::flow::tuple_element< 2, OutputTuple >::type T2
 
field of type K being used for matching.
 
key_to_count_functor< unref_key_type > key_to_count_func
 
join_node_base< queueing, InputTuple, OutputTuple > base_node_type
 
count_element< unref_key_type > count_element_type
 
internal::type_to_key_function_body< T0, K > * f0_p
 
internal::type_to_key_function_body< T1, K > * f1_p
 
void reset_receiver(reset_flags f) __TBB_override
 
virtual void increment_port_count()=0
 
tbb::flow::tuple_element< 1, OutputTuple >::type T1
 
task * try_put_task(const T &) __TBB_override
 
static bool reserve(InputTuple &my_input, OutputTuple &out)
 
untyped_sender predecessor_type
The predecessor type for this node.
 
tbb::internal::strip< key_type >::type unref_key_type
 
bool remove_successor(successor_type &r) __TBB_override
Removes a successor from this node.
 
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
 
internal::type_to_key_function_body< T1, K > * f1_p
 
wrap_key_tuple_elements< 5, key_matching_port, key_matching< K, KHash >, OutputTuple >::type input_ports_type
 
void reset(reset_flags f)
 
internal::type_to_key_function_body< count_element_type, unref_key_type & > TtoK_function_body_type
 
static bool get_my_item(InputTuple &my_input, OutputTuple &out)
 
join_node_base< key_matching< key_type, key_hash_compare >, InputTuple, OutputTuple > base_node_type
 
join_node_base< key_matching< K, KHash >, input_ports_type, output_type > base_type
 
forwarding_base(graph &g)
 
bool tuple_build_may_succeed()
 
void set_owner(successor_type *owner)
 
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
 
aggregator< handler_type, key_matching_FE_operation > my_aggregator
 
internal::type_to_key_function_body< T2, K > * f2_p
 
virtual ~forwarding_base()
 
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
 
internal::type_to_key_function_body< T3, K > * f3_p
 
static void consume_reservations(TupleType &my_input)
 
receiver< input_type >::predecessor_type predecessor_type
 
static void copy_key_functors(KeyFuncTuple &my_inputs, KeyFuncTuple &other_inputs)
 
void reset(reset_flags f)
 
join_node_FE< JP, InputTuple, OutputTuple > input_ports_type
 
join_node_base< key_matching< K, KHash >, input_ports_type, output_type > base_type
 
static tbb::task * combine_tasks(graph &g, tbb::task *left, tbb::task *right)
 
internal::aggregating_functor< class_type, join_node_base_operation > handler_type
 
tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p > func_initializer_type
 
void increment_port_count() __TBB_override
 
void handle_operations(queueing_port_operation *op_list)
 
receiver< input_type >::predecessor_type predecessor_type
 
static void reset_ports(InputTuple &my_input)
 
tbb::flow::tuple_element< 1, OutputTuple >::type T1
 
queueing_port_operation(const T &e, op_type t)
 
wrap_key_tuple_elements< 2, key_matching_port, key_matching< K, KHash >, OutputTuple >::type input_ports_type
 
receiver< input_type >::predecessor_type predecessor_type
 
forwarding_base * my_join
 
void handle_operations(join_node_base_operation *op_list)
 
static void reset_inputs(InputTuple &my_input, reset_flags f)
 
void set_my_key_func(type_to_key_func_type *f)
 
aggregator< handler_type, join_node_base_operation > my_aggregator
 
bool try_get(output_type &v) __TBB_override
Request an item from the sender.
 
K key_from_message(const T &t)
 
forwarding_base * my_join
 
static bool get_items(InputTuple &my_input, OutputTuple &out)
 
task * decrement_port_count(bool handle_task) __TBB_override