21 #ifndef __TBB_template_helpers_H 22 #define __TBB_template_helpers_H 27 namespace tbb {
namespace internal {
30 template<
bool Condition,
typename T =
void>
struct enable_if {};
34 template<
typename T>
struct strip {
typedef T
type; };
35 template<
typename T>
struct strip<const T> {
typedef T
type; };
36 template<
typename T>
struct strip<volatile T> {
typedef T
type; };
37 template<
typename T>
struct strip<const volatile T> {
typedef T
type; };
38 template<
typename T>
struct strip<T&> {
typedef T
type; };
39 template<
typename T>
struct strip<const T&> {
typedef T
type; };
40 template<
typename T>
struct strip<volatile T&> {
typedef T
type; };
41 template<
typename T>
struct strip<const volatile T&> {
typedef T
type; };
43 template<
typename T>
struct strip<T(&)()> {
typedef T(*
type)(); };
44 #if __TBB_CPP11_RVALUE_REF_PRESENT 45 template<
typename T>
struct strip<T&&> {
typedef T
type; };
46 template<
typename T>
struct strip<const T&&> {
typedef T
type; };
47 template<
typename T>
struct strip<volatile T&&> {
typedef T
type; };
48 template<
typename T>
struct strip<const volatile T&&> {
typedef T
type; };
50 template<
typename T, std::
size_t N>
struct strip<T(&)[N]> {
typedef T*
type; };
52 template<
typename T, std::
size_t N>
struct strip<const T(&)[N]> {
typedef const T*
type; };
53 template<
typename T, std::
size_t N>
struct strip<volatile T(&)[N]> {
typedef volatile T*
type; };
54 template<
typename T, std::
size_t N>
struct strip<const volatile T(&)[N]> {
typedef const volatile T*
type; };
60 template<
typename T>
struct is_ref {
static const bool value =
false; };
61 template<
typename U>
struct is_ref<U&> {
static const bool value =
true; };
63 #if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 64 template<
typename...>
struct void_t {
typedef void type; };
68 #if __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 71 template<
typename... Types >
81 template<
typename F,
typename Pack >
friend void call( F&& f, Pack&&
p );
82 template<
typename Ret,
typename F,
typename Pack >
friend Ret
call_and_return( F&& f, Pack&&
p );
87 template<
typename Ret,
typename F,
typename... Preceding >
89 return std::forward<F>(f)( std::forward<Preceding>(params)... );
91 template<
typename Ret,
typename F,
typename... Preceding >
93 return std::forward<F>(f)( std::forward<Preceding>(params)... );
97 template<
typename T,
typename... Types >
109 :
pack_remainder(std::forward<Types>(types)...), leftmost_value(std::forward<T>(t)) {}
112 template<
typename F,
typename Pack >
friend void call( F&& f, Pack&&
p );
113 template<
typename Ret,
typename F,
typename Pack >
friend Ret
call_and_return( F&& f, Pack&&
p );
116 template<
typename Ret,
typename F,
typename... Preceding >
118 return pack_remainder::template call<Ret>(
119 std::forward<F>(f), static_cast<pack_remainder&>(pack),
123 template<
typename Ret,
typename F,
typename... Preceding >
125 return pack_remainder::template call<Ret>(
126 std::forward<F>(f), static_cast<const pack_remainder&>(pack),
130 template<
typename Ret,
typename F,
typename... Preceding >
132 return pack_remainder::template call<Ret>(
133 std::forward<F>(f), static_cast<pack_remainder&&>(pack),
134 std::forward<Preceding>(params)... ,
std::move(pack.leftmost_value)
140 template<
typename F,
typename Pack >
145 template<
typename Ret,
typename F,
typename Pack >
150 template<
typename... Types >
152 return stored_pack<Types...>( std::forward<Types>(types)... );
157 #if __TBB_CPP14_INTEGER_SEQUENCE_PRESENT 159 using std::index_sequence;
162 #elif __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_TEMPLATE_ALIASES_PRESENT 166 template<std::size_t N, std::size_t...
S>
169 template<std::size_t...
S>
174 template<std::
size_t N>
Ret call_and_return(F &&f, Pack &&p)
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_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark 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 __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_id __itt_string_handle __itt_metadata_type type
strip< T >::type leftmost_value
stored_pack< T, Types... > pack_type
Detects whether two given types are the same.
static Ret call(F &&f, pack_type &&, Preceding &&... params)
stored_pack(T &&t, Types &&... types)
static Ret call(F &&f, const pack_type &, Preceding &&... params)
Strips its template type argument from cv- and ref-qualifiers.
Allows to store a function parameter pack as a variable and later pass it to another function.
void const char const char int ITT_FORMAT __itt_group_sync p
stored_pack< Types... > pack_remainder
std::void_t internal implementation (to avoid GCC < 4.7 "template aliases" absence)
void move(tbb_thread &t1, tbb_thread &t2)
static Ret call(F &&f, pack_type &pack, Preceding &&... params)
static Ret call(F &&f, pack_type &&pack, Preceding &&... params)
void call(F &&f, Pack &&p)
Calls the given function with arguments taken from a stored_pack.
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
typename tbb::internal::make_index_sequence_impl< N >::type make_index_sequence
static Ret call(F &&f, const pack_type &pack, Preceding &&... params)
Enables one or the other code branches.
stored_pack< Types... > save_pack(Types &&... types)