QuantumLibrary
quantum_stl_impl.h
1 /*
2 ** Copyright 2018 Bloomberg Finance L.P.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 ** http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16 #ifndef BLOOMBERG_QUANTUM_STL_IMPL_H
17 #define BLOOMBERG_QUANTUM_STL_IMPL_H
18 
19 #include <tuple>
20 #include <utility>
21 #include <type_traits>
22 
23 namespace std {
24 #if (__cplusplus == 201103L)
25  // From <utility>
26  template< bool B, class T = void >
27  using enable_if_t = typename std::enable_if<B,T>::type;
28 
29  template<class T>
30  using decay_t = typename std::decay<T>::type;
31 
32  template<class T>
33  using is_same_v = typename std::decay<T>::type;
34 
35  template<typename T>
36  using remove_reference_t = typename std::remove_reference<T>::type;
37 
38  template<typename _Tp, _Tp... _Idx>
39  struct integer_sequence
40  {
41  using value_type = _Tp;
42  static constexpr size_t size() { return sizeof...(_Idx); }
43  };
44 
45  template<typename _Tp, _Tp _Num,
46  typename _ISeq = typename _Build_index_tuple<_Num>::__type>
47  struct _Make_integer_sequence;
48 
49  template<typename _Tp, _Tp _Num, size_t... _Idx>
50  struct _Make_integer_sequence<_Tp, _Num, _Index_tuple<_Idx...>>
51  {
52  static_assert( _Num >= 0, "Cannot make integer sequence of negative length" );
53  using __type = integer_sequence<_Tp, static_cast<_Tp>(_Idx)...>;
54  };
55 
56  template<typename _Tp, _Tp _Num>
57  using make_integer_sequence = typename _Make_integer_sequence<_Tp, _Num>::__type;
58 
59  template<size_t... _Idx>
60  using index_sequence = integer_sequence<size_t, _Idx...>;
61 
62  template<size_t _Num>
63  using make_index_sequence = make_integer_sequence<size_t, _Num>;
64 
65  template<typename... _Types>
66  using index_sequence_for = make_index_sequence<sizeof...(_Types)>;
67 #endif
68 } //std
69 
70 namespace Bloomberg {
71 namespace quantum {
72 
73 #if (__cplusplus <= 201402L)
74  template <typename FUNC, typename...ARGS>
75  struct ReturnOf
76  {
77  using Type = typename std::result_of<FUNC(ARGS...)>::type;
78  };
79 #else
80  template <typename FUNC, typename...ARGS>
81  struct ReturnOf
82  {
83  using Type = std::invoke_result_t<FUNC, ARGS...>;
84  };
85 #endif
86 
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)
89 {
90  return std::forward<FUNC>(func)(std::forward<T>(t)..., std::forward<ARGS>(std::get<I>(std::move(tuple)))...);
91 }
92 
93 template <typename RET, typename FUNC, typename... ARGS, typename...T>
94 RET apply(FUNC&& func, std::tuple<ARGS...>&& tuple, T&&...t)
95 {
96  return apply_impl<RET>(std::forward<FUNC>(func), std::move(tuple), std::index_sequence_for<ARGS...>{}, std::forward<T>(t)...);
97 }
98 
99 } //namespace quantum
100 } //namespace Bloomberg
101 
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