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