38#include <initializer_list>
43#if !defined(PTL_FOLD_EXPRESSION)
44# define PTL_FOLD_EXPRESSION(...) \
45 ::PTL::mpl::consume_parameters( \
46 ::std::initializer_list<int>{ (__VA_ARGS__, 0)... })
49#if !defined(PTL_NO_SANITIZE_THREAD)
51# if defined(__has_attribute)
52# if __has_attribute(no_sanitize)
53# define PTL_NO_SANITIZE_THREAD __attribute__((no_sanitize("thread")))
55# define PTL_NO_SANITIZE_THREAD
57# elif defined(__clang__) || defined(__GNUC__)
58# define PTL_NO_SANITIZE_THREAD __attribute__((no_sanitize("thread")))
61# define PTL_NO_SANITIZE_THREAD
68using decay_t =
typename std::decay<T>::type;
70template <
bool B,
typename T =
void>
78template <
typename... Args>
90template <
size_t... Indexes>
95template <
typename Itup1,
typename Itup2>
98template <
size_t... Ind1,
size_t... Ind2>
105template <
size_t NumT>
107:
Itup_cat<typename Build_index_tuple<NumT / 2>::__type,
108 typename Build_index_tuple<NumT - NumT / 2>::__type>
124template <
typename Tp, Tp... Idx>
128 static constexpr size_t size() noexcept {
return sizeof...(Idx); }
131template <typename Tp, Tp NumT, typename ISeq = typename Build_index_tuple<NumT>::__type>
134template <
typename Tp, Tp NumT,
size_t... Idx>
137 static_assert(NumT >= 0,
"Cannot make integer sequence of negative length");
143template <
typename Tp, Tp NumT>
147template <
size_t... Idx>
151template <
size_t NumT>
155template <
typename... Types>
158template <
size_t Idx,
typename Tup>
161template <
typename FnT,
typename TupleT,
size_t... Idx>
164 ->
decltype(std::forward<FnT>(_func)(std::get<Idx>(std::move(_args))...))
167#if defined(__GNUC__) && (__GNUC__ < 6)
168 if(
sizeof...(Idx) == 0)
173 return std::forward<FnT>(_func)(std::get<Idx>(std::move(_args))...);
183template <
size_t... Idx>
187template <
size_t NumT>
191template <
typename... Types>
194template <
typename FnT,
typename TupleT>
198 using tuple_type =
typename std::decay<TupleT>::type;
199 constexpr auto N = std::tuple_size<tuple_type>::value;
200 impl::apply(std::forward<FnT>(_func), std::forward<TupleT>(_args),
typename Make_integer_sequence< Tp, NumT >::__type make_integer_sequence
Alias template make_integer_sequence.
make_integer_sequence< size_t, NumT > make_index_sequence
Alias template make_index_sequence.
decay_t< decltype(std::get< Idx >(std::declval< Tup >()))> index_type_t
make_index_sequence< sizeof...(Types)> index_sequence_for
Alias template index_sequence_for.
static auto apply(FnT &&_func, TupleT _args, impl::index_sequence< Idx... >) -> decltype(std::forward< FnT >(_func)(std::get< Idx >(std::move(_args))...))
void consume_parameters(Args &&...)
static void apply(FnT &&_func, TupleT &&_args)
impl::make_integer_sequence< size_t, NumT > make_index_sequence
Alias template make_index_sequence.
impl::make_index_sequence< sizeof...(Types)> index_sequence_for
Alias template index_sequence_for.
static const short PARTIAL
static const short NONINIT
static const short STOPPED
static const short STARTED
typename std::decay< T >::type decay_t
typename std::enable_if< B, T >::type enable_if_t
integer_sequence< Tp, static_cast< Tp >(Idx)... > __type
Class template integer_sequence.
static constexpr size_t size() noexcept