17#ifndef __TBB_template_helpers_H
18#define __TBB_template_helpers_H
22#include "../tbb_config.h"
23#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_TEMPLATE_ALIASES_PRESENT
26#if __TBB_CPP11_PRESENT
34template<
bool Condition,
typename T =
void>
struct enable_if {};
38template<
typename T>
struct strip {
typedef T
type; };
39template<
typename T>
struct strip<const T> {
typedef T
type; };
40template<
typename T>
struct strip<volatile T> {
typedef T
type; };
41template<
typename T>
struct strip<const volatile T> {
typedef T
type; };
42template<
typename T>
struct strip<T&> {
typedef T
type; };
43template<
typename T>
struct strip<const T&> {
typedef T
type; };
44template<
typename T>
struct strip<volatile T&> {
typedef T
type; };
45template<
typename T>
struct strip<const volatile T&> {
typedef T
type; };
47template<
typename T>
struct strip<T(&)()> {
typedef T(*
type)(); };
48#if __TBB_CPP11_RVALUE_REF_PRESENT
49template<
typename T>
struct strip<T&&> {
typedef T
type; };
50template<
typename T>
struct strip<const T&&> {
typedef T
type; };
51template<
typename T>
struct strip<volatile T&&> {
typedef T
type; };
52template<
typename T>
struct strip<const volatile T&&> {
typedef T
type; };
55template<
typename T, std::
size_t N>
struct strip<T(&)[N]> {
typedef T*
type; };
56template<
typename T, std::
size_t N>
struct strip<const T(&)[N]> {
typedef const T*
type; };
57template<
typename T, std::
size_t N>
struct strip<volatile T(&)[N]> {
typedef volatile T*
type; };
58template<
typename T, std::
size_t N>
struct strip<const volatile T(&)[N]> {
typedef const volatile T*
type; };
64template<
typename T>
struct is_ref {
static const bool value =
false; };
65template<
typename U>
struct is_ref<U&> {
static const bool value =
true; };
71#if __TBB_CPP11_PRESENT
84#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT
86template<
typename...>
struct void_t {
typedef void type; };
89#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_TEMPLATE_ALIASES_PRESENT
92template<
typename T,
typename,
template<
typename>
class... Checks>
94template<
typename T,
template<
typename>
class... Checks>
97template<
typename T,
template<
typename>
class... Checks>
102#if __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT
105template<
typename... Types >
115 template<
typename F,
typename Pack >
friend void call( F&& f, Pack&&
p );
116 template<
typename Ret,
typename F,
typename Pack >
friend Ret
call_and_return( F&& f, Pack&&
p );
121 template<
typename Ret,
typename F,
typename... Preceding >
123 return std::forward<F>(f)( std::forward<Preceding>(params)... );
125 template<
typename Ret,
typename F,
typename... Preceding >
127 return std::forward<F>(f)( std::forward<Preceding>(params)... );
131template<
typename T,
typename... Types >
146 template<
typename F,
typename Pack >
friend void call( F&& f, Pack&&
p );
147 template<
typename Ret,
typename F,
typename Pack >
friend Ret
call_and_return( F&& f, Pack&&
p );
150 template<
typename Ret,
typename F,
typename... Preceding >
152 return pack_remainder::template call<Ret>(
157 template<
typename Ret,
typename F,
typename... Preceding >
159 return pack_remainder::template call<Ret>(
164 template<
typename Ret,
typename F,
typename... Preceding >
166 return pack_remainder::template call<Ret>(
168 std::forward<Preceding>(params)... ,
std::move(pack.leftmost_value)
174template<
typename F,
typename Pack >
179template<
typename Ret,
typename F,
typename Pack >
184template<
typename... Types >
186 return stored_pack<Types...>( std::forward<Types>(types)... );
191#if __TBB_CPP14_INTEGER_SEQUENCE_PRESENT
193using std::index_sequence;
196#elif __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_TEMPLATE_ALIASES_PRESENT
200template<std::size_t N, std::size_t...
S>
203template<std::size_t...
S>
208template<std::
size_t N>
213#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT
214template<
typename... Args>
217template<
typename First,
typename... Args>
219 : std::conditional<bool(First::value), conjunction<Args...>, First>
::type {};
229#if __TBB_CPP11_PRESENT
231template<
typename Iter >
232using iterator_value_t =
typename std::iterator_traits<Iter>::value_type;
234template<
typename Iter >
235using iterator_key_t =
typename std::remove_const<typename iterator_value_t<Iter>::first_type>
::type;
237template<
typename Iter >
238using iterator_mapped_t =
typename iterator_value_t<Iter>::second_type;
240template<
typename A >
using value_type =
typename A::value_type;
241template<
typename A >
using alloc_ptr_t =
typename std::allocator_traits<A>::pointer;
242template<
typename A >
using has_allocate =
decltype(std::declval<alloc_ptr_t<A>&>() = std::declval<A>().allocate(0));
243template<
typename A >
using has_deallocate =
decltype(std::declval<A>().deallocate(std::declval<alloc_ptr_t<A>>(), 0));
246template<
typename T >
249#if __TBB_CPP14_VARIABLE_TEMPLATES_PRESENT
251template<
typename T >
256template< std::size_t N,
typename... Args >
261template< std::size_t N,
typename T,
typename... Args >
262struct pack_element<N, T, Args...> {
263 using type =
typename pack_element<N - 1, Args...>
::type;
266template<
typename T,
typename... Args >
267struct pack_element<0, T, Args...> {
271template< std::size_t N,
typename... Args >
272using pack_element_t =
typename pack_element<N, Args...>
::type;
277template <
typename Comp,
typename K>
278using is_transparent =
typename std::conditional<true, Comp, K>::type::is_transparent;
285template <
typename Callable,
typename ReturnType,
typename T>
290template <
typename Callable,
typename ReturnType,
typename T>
295#if __TBB_CPP11_PRESENT
296using std::conditional;
298template <
bool C,
typename T,
typename U>
303template <
typename T,
typename U>
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 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 value
void const char const char int ITT_FORMAT __itt_group_sync 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_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 d int
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 move(tbb_thread &t1, tbb_thread &t2)
stored_pack< Types... > save_pack(Types &&... types)
typename supports_impl< T, void, Checks... >::type supports
Ret call_and_return(F &&f, Pack &&p)
void call(F &&f, Pack &&p)
Calls the given function with arguments taken from a stored_pack.
bool_constant< false > false_type
typename tbb::internal::make_index_sequence_impl< N >::type make_index_sequence
bool_constant< true > true_type
Enables one or the other code branches.
Strips its template type argument from cv- and ref-qualifiers.
Detects whether two given types are the same.
Partial support for std::is_integral.
std::void_t internal implementation (to avoid GCC < 4.7 "template aliases" absence)
Allows to store a function parameter pack as a variable and later pass it to another function.
static Ret call(F &&f, const pack_type &, Preceding &&... params)
static Ret call(F &&f, pack_type &&, Preceding &&... params)
strip< T >::type leftmost_value
stored_pack(T &&t, Types &&... types)
static Ret call(F &&f, pack_type &pack, Preceding &&... params)
stored_pack< T, Types... > pack_type
static Ret call(F &&f, pack_type &&pack, Preceding &&... params)
static Ret call(F &&f, const pack_type &pack, Preceding &&... params)
stored_pack< Types... > pack_remainder