17#ifndef __TBB__flow_graph_body_impl_H
18#define __TBB__flow_graph_body_impl_H
22#ifndef __TBB_flow_graph_H
23#error Do not #include this internal file directly; use public TBB headers instead.
34#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT
36template<
typename ... Policies>
struct Policy {};
40template<
typename ExpectedPolicy,
typename FirstPolicy,
typename ...Policies>
41struct has_policy<ExpectedPolicy, FirstPolicy, Policies...> :
43 has_policy<ExpectedPolicy, Policies...>::value> {};
45template<
typename ExpectedPolicy,
typename SinglePolicy>
49template<
typename ExpectedPolicy,
typename ...Policies>
54template<
typename P1,
typename P2 =
void>
struct Policy {};
56template<
typename ExpectedPolicy,
typename SinglePolicy>
59template<
typename ExpectedPolicy,
typename P>
60struct has_policy<ExpectedPolicy, Policy<P> > : has_policy<ExpectedPolicy, P> {};
62template<
typename ExpectedPolicy,
typename P1,
typename P2>
63struct has_policy<ExpectedPolicy, Policy<P1, P2> > :
68namespace graph_policy_namespace {
78 template<typename K, typename KHash=tbb_hash_compare<typename strip<K>::type > >
96template<
typename Output >
101#if TBB_DEPRECATED_INPUT_NODE_BODY
109template <
typename Body>
112 "TBB Warning: input_node body requirements have been changed."
113 "To temporarily enforce deprecated API specify TBB_DEPRECATED_INPUT_NODE_BODY.");
116template <
typename Body>
121template <
typename ReturnType,
typename T>
124 "TBB Warning: input_node body requirements have been changed."
125 "To temporarily enforce deprecated API specify TBB_DEPRECATED_INPUT_NODE_BODY.");
129template<
typename Output,
typename Body>
134#if TBB_DEPRECATED_INPUT_NODE_BODY
150template<
typename Output >
159template<
typename Output,
typename Body>
176template<
typename Input,
typename Output >
185template <
typename Input,
typename Output,
typename B>
216template <
typename Input,
typename B>
222 return continue_msg();
233template <
typename Output,
typename B>
249template<
typename Input,
typename OutputSet>
259template<
typename Input,
typename OutputSet,
typename B >
277template<
typename Input,
typename Output>
286template<
typename Input,
typename Output>
294template <
typename Input,
typename Output,
typename B>
307template <
typename Input,
typename Output,
typename B>
327template<
typename NodeType >
336 , node_priority_t node_priority = no_priority
337 ) : graph_task(node_priority),
345 if (new_task == SUCCESSFULLY_ENQUEUED) new_task = NULL;
352template<
typename NodeType,
typename Input >
362 , node_priority_t node_priority = no_priority
363 ) : graph_task(node_priority),
371 if(next_task == SUCCESSFULLY_ENQUEUED) next_task = NULL;
377template<
typename NodeType >
388 if(new_task == SUCCESSFULLY_ENQUEUED)
return NULL;
396template<
typename Input,
typename Output >
398 Output
operator()(
const Input & )
const {
return Output(); }
401template<
typename T,
typename DecrementType,
typename DummyType =
void>
404template<
typename T,
typename DecrementType>
406 typename
tbb::internal::enable_if<
407 tbb::internal::is_integral<DecrementType>::value, void>
::type
413 task* result = my_node->decrement_counter(
value );
415 result = SUCCESSFULLY_ENQUEUED;
420 return my_node->my_graph;
425#if TBB_DEPRECATED_FLOW_NODE_EXTRACTION
426 if (f & rf_clear_edges)
427 my_built_predecessors.clear();
440#if TBB_DEPRECATED_FLOW_NODE_EXTRACTION
443 typedef typename receiver<DecrementType>::predecessor_type predecessor_type;
445 typedef internal::edge_container<predecessor_type> built_predecessors_type;
446 typedef typename built_predecessors_type::edge_list_type predecessor_list_type;
447 built_predecessors_type &built_predecessors()
__TBB_override {
return my_built_predecessors; }
449 void internal_add_built_predecessor( predecessor_type &
s)
__TBB_override {
450 spin_mutex::scoped_lock l(my_mutex);
451 my_built_predecessors.add_edge(
s );
454 void internal_delete_built_predecessor( predecessor_type &
s)
__TBB_override {
455 spin_mutex::scoped_lock l(my_mutex);
456 my_built_predecessors.delete_edge(
s);
459 void copy_predecessors( predecessor_list_type &v)
__TBB_override {
460 spin_mutex::scoped_lock l(my_mutex);
461 my_built_predecessors.copy_edges(v);
465 spin_mutex::scoped_lock l(my_mutex);
466 return my_built_predecessors.edge_count();
469 built_predecessors_type my_built_predecessors;
479 return my_node->decrement_counter( 1 );
485 return my_node->my_graph;
#define __TBB_FLOW_GRAPH_PRIORITY_ARG1(arg1, priority)
#define __TBB_STATIC_ASSERT(condition, msg)
#define __TBB_PREVIEW_FLOW_GRAPH_PRIORITIES
void const char const char int ITT_FORMAT __itt_group_sync s
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
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
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
void suppress_unused_warning(const T1 &)
Utility template function to prevent "unused" warnings by various compilers.
void check_input_node_body_input_type(Body)
void check_input_node_body_input_type_impl(Body)
tbb::internal::uint64_t tag_value
key_matching< tag_value > tag_matching
interface11::internal::Policy< rejecting, lightweight > rejecting_lightweight
interface11::internal::Policy< queueing, lightweight > queueing_lightweight
Forwards messages only if the threshold has not been reached.
field of type K being used for matching.
strip< K >::type base_key_type
A functor that takes no input and generates a value of type Output.
virtual Output operator()(flow_control &fc)=0
virtual input_body * clone()=0
input_body_leaf * clone() __TBB_override
input_body_leaf(const Body &_body)
Output operator()(flow_control &fc) __TBB_override
virtual source_body * clone()=0
virtual bool operator()(Output &output)=0
The leaf for source_body.
bool operator()(Output &output) __TBB_override
source_body_leaf(const Body &_body)
source_body_leaf * clone() __TBB_override
A functor that takes an Input and generates an Output.
virtual function_body * clone()=0
virtual Output operator()(const Input &input)=0
the leaf for function_body
Output operator()(const Input &i) __TBB_override
function_body_leaf * clone() __TBB_override
function_body_leaf(const B &_body)
the leaf for function_body specialized for Input and output of continue_msg
function_body_leaf * clone() __TBB_override
continue_msg operator()(const continue_msg &i) __TBB_override
function_body_leaf(const B &_body)
the leaf for function_body specialized for Output of continue_msg
function_body_leaf * clone() __TBB_override
continue_msg operator()(const Input &i) __TBB_override
function_body_leaf(const B &_body)
the leaf for function_body specialized for Input of continue_msg
Output operator()(const continue_msg &i) __TBB_override
function_body_leaf(const B &_body)
function_body_leaf * clone() __TBB_override
function_body that takes an Input and a set of output ports
virtual void * get_body_ptr()=0
virtual ~multifunction_body()
virtual multifunction_body * clone()=0
virtual void operator()(const Input &, OutputSet &)=0
leaf for multifunction. OutputSet can be a std::tuple or a vector.
void * get_body_ptr() __TBB_override
void operator()(const Input &input, OutputSet &oset) __TBB_override
multifunction_body_leaf * clone() __TBB_override
multifunction_body_leaf(const B &_body)
virtual type_to_key_function_body * clone()=0
virtual Output operator()(const Input &input)=0
virtual ~type_to_key_function_body()
virtual type_to_key_function_body * clone()=0
virtual ~type_to_key_function_body()
virtual const Output & operator()(const Input &input)=0
Output operator()(const Input &i) __TBB_override
type_to_key_function_body_leaf * clone() __TBB_override
type_to_key_function_body_leaf(const B &_body)
type_to_key_function_body_leaf(const B &_body)
const Output & operator()(const Input &i) __TBB_override
type_to_key_function_body_leaf * clone() __TBB_override
A task that calls a node's forward_task function.
task * execute() __TBB_override
forward_task_bypass(NodeType &n)
A task that calls a node's apply_body_bypass function, passing in an input of type Input.
task * execute() __TBB_override
apply_body_task_bypass(NodeType &n, const Input &i)
A task that calls a node's apply_body_bypass function with no input.
source_task_bypass(NodeType &n)
task * execute() __TBB_override
An empty functor that takes an Input and returns a default constructed Output.
Output operator()(const Input &) const
graph & graph_reference() const __TBB_override
void reset_receiver(reset_flags f) __TBB_override
task * try_put_task(const DecrementType &value) __TBB_override
graph & graph_reference() const __TBB_override
decrementer(int number_of_predecessors=0)
task * execute() __TBB_override
Strips its template type argument from cv- and ref-qualifiers.
Detects whether two given types are the same.
Base class for types that should not be assigned.
Base class for types that should not be copied or assigned.