21 #ifndef __TBB_template_helpers_H 22 #define __TBB_template_helpers_H 26 #include "../tbb_config.h" 27 #if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_TEMPLATE_ALIASES_PRESENT 28 #include <type_traits> 30 #if __TBB_CPP11_PRESENT 35 namespace tbb {
namespace internal {
38 template<
bool Condition,
typename T =
void>
struct enable_if {};
42 template<
typename T>
struct strip {
typedef T
type; };
43 template<
typename T>
struct strip<const T> {
typedef T
type; };
44 template<
typename T>
struct strip<volatile T> {
typedef T
type; };
45 template<
typename T>
struct strip<const volatile T> {
typedef T
type; };
46 template<
typename T>
struct strip<T&> {
typedef T
type; };
47 template<
typename T>
struct strip<const T&> {
typedef T
type; };
48 template<
typename T>
struct strip<volatile T&> {
typedef T
type; };
49 template<
typename T>
struct strip<const volatile T&> {
typedef T
type; };
51 template<
typename T>
struct strip<T(&)()> {
typedef T(*
type)(); };
52 #if __TBB_CPP11_RVALUE_REF_PRESENT 53 template<
typename T>
struct strip<T&&> {
typedef T
type; };
54 template<
typename T>
struct strip<const T&&> {
typedef T
type; };
55 template<
typename T>
struct strip<volatile T&&> {
typedef T
type; };
56 template<
typename T>
struct strip<const volatile T&&> {
typedef T
type; };
58 template<
typename T, std::
size_t N>
struct strip<T(&)[N]> {
typedef T*
type; };
60 template<
typename T, std::
size_t N>
struct strip<const T(&)[N]> {
typedef const T*
type; };
61 template<
typename T, std::
size_t N>
struct strip<volatile T(&)[N]> {
typedef volatile T*
type; };
62 template<
typename T, std::
size_t N>
struct strip<const volatile T(&)[N]> {
typedef const volatile T*
type; };
68 template<
typename T>
struct is_ref {
static const bool value =
false; };
69 template<
typename U>
struct is_ref<U&> {
static const bool value =
true; };
71 #if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 72 template<
typename...>
struct void_t {
typedef void type; };
76 #if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_TEMPLATE_ALIASES_PRESENT 79 template<
typename T,
typename,
template<
typename>
class... Checks>
81 template<
typename T,
template<
typename>
class... Checks>
84 template<
typename T,
template<
typename>
class... Checks>
89 #if __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 92 template<
typename... Types >
102 template<
typename F,
typename Pack >
friend void call( F&& f, Pack&&
p );
103 template<
typename Ret,
typename F,
typename Pack >
friend Ret
call_and_return( F&& f, Pack&&
p );
108 template<
typename Ret,
typename F,
typename... Preceding >
110 return std::forward<F>(f)( std::forward<Preceding>(params)... );
112 template<
typename Ret,
typename F,
typename... Preceding >
114 return std::forward<F>(f)( std::forward<Preceding>(params)... );
118 template<
typename T,
typename... Types >
130 :
pack_remainder(std::forward<Types>(types)...), leftmost_value(std::forward<T>(t)) {}
133 template<
typename F,
typename Pack >
friend void call( F&& f, Pack&&
p );
134 template<
typename Ret,
typename F,
typename Pack >
friend Ret
call_and_return( F&& f, Pack&&
p );
137 template<
typename Ret,
typename F,
typename... Preceding >
139 return pack_remainder::template call<Ret>(
140 std::forward<F>(f), static_cast<pack_remainder&>(pack),
144 template<
typename Ret,
typename F,
typename... Preceding >
146 return pack_remainder::template call<Ret>(
147 std::forward<F>(f), static_cast<const pack_remainder&>(pack),
151 template<
typename Ret,
typename F,
typename... Preceding >
153 return pack_remainder::template call<Ret>(
154 std::forward<F>(f), static_cast<pack_remainder&&>(pack),
155 std::forward<Preceding>(params)... ,
std::move(pack.leftmost_value)
161 template<
typename F,
typename Pack >
166 template<
typename Ret,
typename F,
typename Pack >
171 template<
typename... Types >
173 return stored_pack<Types...>( std::forward<Types>(types)... );
178 #if __TBB_CPP14_INTEGER_SEQUENCE_PRESENT 180 using std::index_sequence;
183 #elif __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_TEMPLATE_ALIASES_PRESENT 187 template<std::size_t N, std::size_t...
S>
190 template<std::size_t...
S>
195 template<std::
size_t N>
200 #if __TBB_CPP11_PRESENT 202 template<
typename Iter >
203 using iterator_value_t =
typename std::iterator_traits<Iter>::value_type;
205 template<
typename Iter >
206 using iterator_key_t =
typename std::remove_const<typename iterator_value_t<Iter>::first_type>
::type;
208 template<
typename Iter >
209 using iterator_mapped_t =
typename iterator_value_t<Iter>::second_type;
211 template<
typename A >
using value_type =
typename A::value_type;
212 template<
typename A >
using alloc_ptr_t =
typename std::allocator_traits<A>::pointer;
213 template<
typename A >
using has_allocate = decltype(std::declval<alloc_ptr_t<A>&>() = std::declval<A>().allocate(0));
214 template<
typename A >
using has_deallocate = decltype(std::declval<A>().deallocate(std::declval<alloc_ptr_t<A>>(), 0));
217 template<
typename T >
220 #if __TBB_CPP14_VARIABLE_TEMPLATES_PRESENT 222 template<
typename T >
227 template< std::size_t N,
typename... Args >
228 struct pack_element {
232 template< std::size_t N,
typename T,
typename... Args >
233 struct pack_element<N, T, Args...> {
234 using type =
typename pack_element<N - 1, Args...>
::type;
237 template<
typename T,
typename... Args >
238 struct pack_element<0, T, Args...> {
242 template< std::size_t N,
typename... Args >
243 using pack_element_t =
typename pack_element<N, Args...>
::type;
Allows to store a function parameter pack as a variable and later pass it to another function.
bool_constant< true > true_type
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
Detects whether two given types are the same.
strip< T >::type leftmost_value
typename supports_impl< T, void, Checks... >::type supports
static Ret call(F &&f, pack_type &pack, Preceding &&... params)
void const char const char int ITT_FORMAT __itt_group_sync p
stored_pack< T, Types... > pack_type
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
static Ret call(F &&f, const pack_type &, Preceding &&... params)
stored_pack< Types... > pack_remainder
stored_pack< Types... > save_pack(Types &&... types)
stored_pack(T &&t, Types &&... types)
static Ret call(F &&f, const pack_type &pack, Preceding &&... params)
Enables one or the other code branches.
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 call(F &&f, Pack &&p)
Calls the given function with arguments taken from a stored_pack.
void move(tbb_thread &t1, tbb_thread &t2)
static Ret call(F &&f, pack_type &&, Preceding &&... params)
static Ret call(F &&f, pack_type &&pack, Preceding &&... params)
bool_constant< false > false_type
Ret call_and_return(F &&f, Pack &&p)
Strips its template type argument from cv- and ref-qualifiers.
std::void_t internal implementation (to avoid GCC < 4.7 "template aliases" absence)
typename tbb::internal::make_index_sequence_impl< N >::type make_index_sequence