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