16 #ifndef BLOOMBERG_QUANTUM_STL_IMPL_H 17 #define BLOOMBERG_QUANTUM_STL_IMPL_H 21 #include <type_traits> 24 #if (__cplusplus == 201103L) 26 template<
bool B,
class T =
void >
27 using enable_if_t =
typename std::enable_if<B,T>::type;
30 using decay_t =
typename std::decay<T>::type;
33 using is_same_v =
typename std::decay<T>::type;
36 using remove_reference_t =
typename std::remove_reference<T>::type;
38 template<
typename _Tp, _Tp... _Idx>
39 struct integer_sequence
41 using value_type = _Tp;
42 static constexpr
size_t size() {
return sizeof...(_Idx); }
45 template<
typename _Tp, _Tp _Num,
46 typename _ISeq =
typename _Build_index_tuple<_Num>::__type>
47 struct _Make_integer_sequence;
49 template<
typename _Tp, _Tp _Num,
size_t... _Idx>
50 struct _Make_integer_sequence<_Tp, _Num, _Index_tuple<_Idx...>>
52 static_assert( _Num >= 0,
"Cannot make integer sequence of negative length" );
53 using __type = integer_sequence<_Tp, static_cast<_Tp>(_Idx)...>;
56 template<
typename _Tp, _Tp _Num>
57 using make_integer_sequence =
typename _Make_integer_sequence<_Tp, _Num>::__type;
59 template<
size_t... _Idx>
60 using index_sequence = integer_sequence<size_t, _Idx...>;
63 using make_index_sequence = make_integer_sequence<size_t, _Num>;
65 template<
typename... _Types>
66 using index_sequence_for = make_index_sequence<
sizeof...(_Types)>;
73 #if (__cplusplus <= 201402L) 74 template <
typename FUNC,
typename...ARGS>
77 using Type =
typename std::result_of<FUNC(ARGS...)>::type;
80 template <
typename FUNC,
typename...ARGS>
83 using Type = std::invoke_result_t<FUNC, ARGS...>;
87 template <
typename RET,
typename FUNC,
typename... ARGS,
size_t...I,
typename...T>
88 RET
apply_impl(FUNC&& func, std::tuple<ARGS...>&& tuple, std::index_sequence<I...>, T&&...t)
90 return std::forward<FUNC>(func)(std::forward<T>(t)..., std::forward<ARGS>(std::get<I>(std::move(tuple)))...);
93 template <
typename RET,
typename FUNC,
typename... ARGS,
typename...T>
94 RET
apply(FUNC&& func, std::tuple<ARGS...>&& tuple, T&&...t)
96 return apply_impl<RET>(std::forward<FUNC>(func), std::move(tuple), std::index_sequence_for<ARGS...>{}, std::forward<T>(t)...);
102 #endif //BLOOMBERG_QUANTUM_STL_IMPL_H Definition: quantum_buffer_impl.h:22
Definition: quantum_stl_impl.h:75
Definition: quantum_stl_impl.h:23
RET apply_impl(FUNC &&func, std::tuple< ARGS... > &&tuple, std::index_sequence< I... >, T &&...t)
Definition: quantum_stl_impl.h:88
RET apply(FUNC &&func, std::tuple< ARGS... > &&tuple, T &&...t)
Definition: quantum_stl_impl.h:94
typename std::result_of< FUNC(ARGS...)>::type Type
Definition: quantum_stl_impl.h:77