mbed-os5 only for TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 1:9db0e321a9f4 1 /* mbed Microcontroller Library
kenjiArai 1:9db0e321a9f4 2 * Copyright (c) 2019 ARM Limited
kenjiArai 1:9db0e321a9f4 3 * SPDX-License-Identifier: Apache-2.0
kenjiArai 1:9db0e321a9f4 4 *
kenjiArai 1:9db0e321a9f4 5 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 1:9db0e321a9f4 6 * you may not use this file except in compliance with the License.
kenjiArai 1:9db0e321a9f4 7 * You may obtain a copy of the License at
kenjiArai 1:9db0e321a9f4 8 *
kenjiArai 1:9db0e321a9f4 9 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 1:9db0e321a9f4 10 *
kenjiArai 1:9db0e321a9f4 11 * Unless required by applicable law or agreed to in writing, software
kenjiArai 1:9db0e321a9f4 12 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 1:9db0e321a9f4 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 1:9db0e321a9f4 14 * See the License for the specific language governing permissions and
kenjiArai 1:9db0e321a9f4 15 * limitations under the License.
kenjiArai 1:9db0e321a9f4 16 */
kenjiArai 1:9db0e321a9f4 17 #ifndef MSTD_UTILITY_
kenjiArai 1:9db0e321a9f4 18 #define MSTD_UTILITY_
kenjiArai 1:9db0e321a9f4 19
kenjiArai 1:9db0e321a9f4 20 /* <mstd_utility>
kenjiArai 1:9db0e321a9f4 21 *
kenjiArai 1:9db0e321a9f4 22 * - includes toolchain's <utility>
kenjiArai 1:9db0e321a9f4 23 * - For ARM C 5, standard C++11/14 features:
kenjiArai 1:9db0e321a9f4 24 * - include <initializer_list>
kenjiArai 1:9db0e321a9f4 25 * - std::move, std::forward, std::exchange
kenjiArai 1:9db0e321a9f4 26 * - std::declval
kenjiArai 1:9db0e321a9f4 27 * - std::integer_sequence
kenjiArai 1:9db0e321a9f4 28 * - include <algorithm> to get default std::swap
kenjiArai 1:9db0e321a9f4 29 * - mstd::swap - substitute for std::swap that can move
kenjiArai 1:9db0e321a9f4 30 * - std::swap(array)
kenjiArai 1:9db0e321a9f4 31 * - Swap assistance, to ensure moves happen on ARM C 5
kenjiArai 1:9db0e321a9f4 32 * - mstd::swap - alias for std::swap, or a local moving implementation for ARM C 5
kenjiArai 1:9db0e321a9f4 33 * - For all toolchains, C++17/20 backports:
kenjiArai 1:9db0e321a9f4 34 * - mstd::as_const
kenjiArai 1:9db0e321a9f4 35 */
kenjiArai 1:9db0e321a9f4 36
kenjiArai 1:9db0e321a9f4 37 #include <utility>
kenjiArai 1:9db0e321a9f4 38
kenjiArai 1:9db0e321a9f4 39 #ifdef __CC_ARM
kenjiArai 1:9db0e321a9f4 40 #include <_move.h>
kenjiArai 1:9db0e321a9f4 41 #include <algorithm> // to get std::swap
kenjiArai 1:9db0e321a9f4 42 #include <cstddef>
kenjiArai 1:9db0e321a9f4 43 #include <initializer_list>
kenjiArai 1:9db0e321a9f4 44 #include <cstdint> // uintmax_t
kenjiArai 1:9db0e321a9f4 45 #include <mstd_type_traits>
kenjiArai 1:9db0e321a9f4 46 #endif
kenjiArai 1:9db0e321a9f4 47
kenjiArai 1:9db0e321a9f4 48
kenjiArai 1:9db0e321a9f4 49 namespace mstd {
kenjiArai 1:9db0e321a9f4 50 // [utility.swap] - ARMC5's std::swap is not C++11, so make sure mstd::swap is
kenjiArai 1:9db0e321a9f4 51 // So to get ADL-aware lookup with good default swap, users should do `using mstd::swap; swap(x, y);`.
kenjiArai 1:9db0e321a9f4 52 #ifdef __CC_ARM
kenjiArai 1:9db0e321a9f4 53 template <class _TypeT>
kenjiArai 1:9db0e321a9f4 54 void swap(_TypeT &__a, _TypeT &__b)
kenjiArai 1:9db0e321a9f4 55 noexcept(__is_nothrow_constructible(_TypeT, _TypeT &&) && __is_nothrow_assignable(_TypeT &, _TypeT &&))
kenjiArai 1:9db0e321a9f4 56 {
kenjiArai 1:9db0e321a9f4 57 _TypeT __tmp = std::move(__a);
kenjiArai 1:9db0e321a9f4 58 __a = std::move(__b);
kenjiArai 1:9db0e321a9f4 59 __b = std::move(__tmp);
kenjiArai 1:9db0e321a9f4 60 }
kenjiArai 1:9db0e321a9f4 61
kenjiArai 1:9db0e321a9f4 62 template <class _TypeT, std::size_t _Size>
kenjiArai 1:9db0e321a9f4 63 void swap(_TypeT (&__a)[_Size], _TypeT (&__b)[_Size])
kenjiArai 1:9db0e321a9f4 64 noexcept(noexcept(swap(*__a, *__b)))
kenjiArai 1:9db0e321a9f4 65 {
kenjiArai 1:9db0e321a9f4 66 _TypeT *__ptr_a = __a, *__ptr_b = __b;
kenjiArai 1:9db0e321a9f4 67 const _TypeT * const __end_a = __a + _Size;
kenjiArai 1:9db0e321a9f4 68 for (; __ptr_a != __end_a; ++__ptr_a, ++__ptr_b) {
kenjiArai 1:9db0e321a9f4 69 swap(*__ptr_a, *__ptr_b);
kenjiArai 1:9db0e321a9f4 70 }
kenjiArai 1:9db0e321a9f4 71 }
kenjiArai 1:9db0e321a9f4 72 #else
kenjiArai 1:9db0e321a9f4 73 using std::swap;
kenjiArai 1:9db0e321a9f4 74 #endif
kenjiArai 1:9db0e321a9f4 75
kenjiArai 1:9db0e321a9f4 76 } // namespace mstd
kenjiArai 1:9db0e321a9f4 77
kenjiArai 1:9db0e321a9f4 78
kenjiArai 1:9db0e321a9f4 79 #ifdef __CC_ARM
kenjiArai 1:9db0e321a9f4 80
kenjiArai 1:9db0e321a9f4 81 namespace std {
kenjiArai 1:9db0e321a9f4 82
kenjiArai 1:9db0e321a9f4 83 template <typename _TypeT>
kenjiArai 1:9db0e321a9f4 84 constexpr conditional_t<!is_nothrow_move_constructible<_TypeT>::value && is_copy_constructible<_TypeT>::value,
kenjiArai 1:9db0e321a9f4 85 const _TypeT &, _TypeT &&>
kenjiArai 1:9db0e321a9f4 86 move_if_noexcept(_TypeT &__t) noexcept
kenjiArai 1:9db0e321a9f4 87 {
kenjiArai 1:9db0e321a9f4 88 return std::move(__t);
kenjiArai 1:9db0e321a9f4 89 }
kenjiArai 1:9db0e321a9f4 90
kenjiArai 1:9db0e321a9f4 91 // [declval]
kenjiArai 1:9db0e321a9f4 92 // is provided by mstd_type_traits, which we include
kenjiArai 1:9db0e321a9f4 93
kenjiArai 1:9db0e321a9f4 94 // [utility.swap] - ARMC5's basic swap in <algorithm> does not move, but
kenjiArai 1:9db0e321a9f4 95 // we can add this std overload for arrays, and send it to our mstd moving version
kenjiArai 1:9db0e321a9f4 96 template <class _TypeT, std::size_t _Size>
kenjiArai 1:9db0e321a9f4 97 void swap(_TypeT (&__a)[_Size], _TypeT (&__b)[_Size])
kenjiArai 1:9db0e321a9f4 98 noexcept(noexcept(mstd::swap(*__a, *__b)))
kenjiArai 1:9db0e321a9f4 99 {
kenjiArai 1:9db0e321a9f4 100 mstd::swap(__a, __b);
kenjiArai 1:9db0e321a9f4 101 }
kenjiArai 1:9db0e321a9f4 102
kenjiArai 1:9db0e321a9f4 103 // [intseq.intseq]
kenjiArai 1:9db0e321a9f4 104 template <typename T, T... I>
kenjiArai 1:9db0e321a9f4 105 struct integer_sequence {
kenjiArai 1:9db0e321a9f4 106 using value_type = T;
kenjiArai 1:9db0e321a9f4 107 static constexpr size_t size() noexcept { return sizeof...(I); }
kenjiArai 1:9db0e321a9f4 108 };
kenjiArai 1:9db0e321a9f4 109
kenjiArai 1:9db0e321a9f4 110 template <size_t... I>
kenjiArai 1:9db0e321a9f4 111 using index_sequence = integer_sequence<size_t, I...>;
kenjiArai 1:9db0e321a9f4 112
kenjiArai 1:9db0e321a9f4 113 // [intseq.make]
kenjiArai 1:9db0e321a9f4 114 namespace impl {
kenjiArai 1:9db0e321a9f4 115
kenjiArai 1:9db0e321a9f4 116 template <typename seq1, typename seq2>
kenjiArai 1:9db0e321a9f4 117 struct combine_umax_sequences;
kenjiArai 1:9db0e321a9f4 118
kenjiArai 1:9db0e321a9f4 119 template <uintmax_t... seq1, uintmax_t... seq2>
kenjiArai 1:9db0e321a9f4 120 struct combine_umax_sequences<integer_sequence<uintmax_t, seq1...>, integer_sequence<uintmax_t, seq2...>>
kenjiArai 1:9db0e321a9f4 121 : mstd::type_identity<integer_sequence<uintmax_t, seq1..., sizeof...(seq1) + seq2...>> { };
kenjiArai 1:9db0e321a9f4 122
kenjiArai 1:9db0e321a9f4 123 template <uintmax_t N>
kenjiArai 1:9db0e321a9f4 124 struct make_umax_sequence : combine_umax_sequences<typename make_umax_sequence<N / 2>::type,
kenjiArai 1:9db0e321a9f4 125 typename make_umax_sequence<N - N / 2>::type> { };
kenjiArai 1:9db0e321a9f4 126
kenjiArai 1:9db0e321a9f4 127 template <>
kenjiArai 1:9db0e321a9f4 128 struct make_umax_sequence<1> : mstd::type_identity<integer_sequence<uintmax_t, 0>> { };
kenjiArai 1:9db0e321a9f4 129
kenjiArai 1:9db0e321a9f4 130 template <>
kenjiArai 1:9db0e321a9f4 131 struct make_umax_sequence<0> : mstd::type_identity<integer_sequence<uintmax_t>> { };
kenjiArai 1:9db0e321a9f4 132
kenjiArai 1:9db0e321a9f4 133
kenjiArai 1:9db0e321a9f4 134 template <typename T, T N, typename useq = typename make_umax_sequence<N>::type>
kenjiArai 1:9db0e321a9f4 135 struct make_integer_sequence;
kenjiArai 1:9db0e321a9f4 136
kenjiArai 1:9db0e321a9f4 137 template <typename T, T N, uintmax_t... I>
kenjiArai 1:9db0e321a9f4 138 struct make_integer_sequence<T, N, integer_sequence<uintmax_t, I...>> {
kenjiArai 1:9db0e321a9f4 139 static_assert(N >= 0, "negative integer sequence");
kenjiArai 1:9db0e321a9f4 140 using type = integer_sequence<T, static_cast<T>(I)...>;
kenjiArai 1:9db0e321a9f4 141 };
kenjiArai 1:9db0e321a9f4 142 }
kenjiArai 1:9db0e321a9f4 143
kenjiArai 1:9db0e321a9f4 144 template <typename T, T N>
kenjiArai 1:9db0e321a9f4 145 using make_integer_sequence = typename impl::make_integer_sequence<T, N>::type;
kenjiArai 1:9db0e321a9f4 146
kenjiArai 1:9db0e321a9f4 147 template <size_t N>
kenjiArai 1:9db0e321a9f4 148 using make_index_sequence = make_integer_sequence<size_t, N>;
kenjiArai 1:9db0e321a9f4 149
kenjiArai 1:9db0e321a9f4 150 template <typename... T>
kenjiArai 1:9db0e321a9f4 151 using index_sequence_for = make_index_sequence<sizeof...(T)>;
kenjiArai 1:9db0e321a9f4 152
kenjiArai 1:9db0e321a9f4 153
kenjiArai 1:9db0e321a9f4 154 // [pair.astuple]
kenjiArai 1:9db0e321a9f4 155 template <typename>
kenjiArai 1:9db0e321a9f4 156 struct tuple_size;
kenjiArai 1:9db0e321a9f4 157
kenjiArai 1:9db0e321a9f4 158 template <size_t, typename>
kenjiArai 1:9db0e321a9f4 159 struct tuple_element;
kenjiArai 1:9db0e321a9f4 160
kenjiArai 1:9db0e321a9f4 161 template <size_t I, typename T>
kenjiArai 1:9db0e321a9f4 162 using tuple_element_t = typename tuple_element<I, T>::type;
kenjiArai 1:9db0e321a9f4 163
kenjiArai 1:9db0e321a9f4 164 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 165 struct tuple_size<pair<T1, T2>> : integral_constant<size_t, 2> { };
kenjiArai 1:9db0e321a9f4 166
kenjiArai 1:9db0e321a9f4 167 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 168 struct tuple_element<0, pair<T1, T2>> : mstd::type_identity<T1> { };
kenjiArai 1:9db0e321a9f4 169
kenjiArai 1:9db0e321a9f4 170 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 171 struct tuple_element<1, pair<T1, T2>> : mstd::type_identity<T2> { };
kenjiArai 1:9db0e321a9f4 172
kenjiArai 1:9db0e321a9f4 173 namespace impl{
kenjiArai 1:9db0e321a9f4 174
kenjiArai 1:9db0e321a9f4 175 template <size_t I>
kenjiArai 1:9db0e321a9f4 176 struct pair_getter;
kenjiArai 1:9db0e321a9f4 177
kenjiArai 1:9db0e321a9f4 178 template <>
kenjiArai 1:9db0e321a9f4 179 struct pair_getter<0> {
kenjiArai 1:9db0e321a9f4 180 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 181 static T1 &get(pair<T1, T2> &p)
kenjiArai 1:9db0e321a9f4 182 {
kenjiArai 1:9db0e321a9f4 183 return p.first;
kenjiArai 1:9db0e321a9f4 184 }
kenjiArai 1:9db0e321a9f4 185 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 186 static const T1 &cget(const pair<T1, T2> &p)
kenjiArai 1:9db0e321a9f4 187 {
kenjiArai 1:9db0e321a9f4 188 return p.first;
kenjiArai 1:9db0e321a9f4 189 }
kenjiArai 1:9db0e321a9f4 190 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 191 static T1 &&get_move(pair<T1, T2> &&p)
kenjiArai 1:9db0e321a9f4 192 {
kenjiArai 1:9db0e321a9f4 193 return std::forward<T1>(p.first);
kenjiArai 1:9db0e321a9f4 194 }
kenjiArai 1:9db0e321a9f4 195 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 196 static const T1 &&cget_move(const pair<T1, T2> &&p)
kenjiArai 1:9db0e321a9f4 197 {
kenjiArai 1:9db0e321a9f4 198 return std::forward<T1>(p.first);
kenjiArai 1:9db0e321a9f4 199 }
kenjiArai 1:9db0e321a9f4 200 };
kenjiArai 1:9db0e321a9f4 201
kenjiArai 1:9db0e321a9f4 202 template <>
kenjiArai 1:9db0e321a9f4 203 struct pair_getter<1> {
kenjiArai 1:9db0e321a9f4 204 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 205 static T2 &get(pair<T1, T2> &p)
kenjiArai 1:9db0e321a9f4 206 {
kenjiArai 1:9db0e321a9f4 207 return p.second;
kenjiArai 1:9db0e321a9f4 208 }
kenjiArai 1:9db0e321a9f4 209 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 210 static const T2 &cget(const pair<T1, T2> &p)
kenjiArai 1:9db0e321a9f4 211 {
kenjiArai 1:9db0e321a9f4 212 return p.second;
kenjiArai 1:9db0e321a9f4 213 }
kenjiArai 1:9db0e321a9f4 214 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 215 static T2 &&get_move(pair<T1, T2> &&p)
kenjiArai 1:9db0e321a9f4 216 {
kenjiArai 1:9db0e321a9f4 217 return std::forward<T2>(p.second);
kenjiArai 1:9db0e321a9f4 218 }
kenjiArai 1:9db0e321a9f4 219 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 220 static const T2 &&cget_move(const pair<T1, T2> &&p)
kenjiArai 1:9db0e321a9f4 221 {
kenjiArai 1:9db0e321a9f4 222 return std::forward<T2>(p.second);
kenjiArai 1:9db0e321a9f4 223 }
kenjiArai 1:9db0e321a9f4 224 };
kenjiArai 1:9db0e321a9f4 225 }
kenjiArai 1:9db0e321a9f4 226
kenjiArai 1:9db0e321a9f4 227 template <size_t I, typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 228 constexpr tuple_element_t<I, pair<T1, T2>> &get(pair<T1, T2> &p) noexcept
kenjiArai 1:9db0e321a9f4 229 {
kenjiArai 1:9db0e321a9f4 230 return impl::pair_getter<I>::get(p);
kenjiArai 1:9db0e321a9f4 231 }
kenjiArai 1:9db0e321a9f4 232
kenjiArai 1:9db0e321a9f4 233 template <size_t I, typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 234 constexpr const tuple_element_t<I, pair<T1, T2>> &get(const pair<T1, T2> &p) noexcept
kenjiArai 1:9db0e321a9f4 235 {
kenjiArai 1:9db0e321a9f4 236 return impl::pair_getter<I>::cget(p);
kenjiArai 1:9db0e321a9f4 237 }
kenjiArai 1:9db0e321a9f4 238
kenjiArai 1:9db0e321a9f4 239 template <size_t I, typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 240 constexpr tuple_element_t<I, pair<T1, T2>> &&get(pair<T1, T2> &&p) noexcept
kenjiArai 1:9db0e321a9f4 241 {
kenjiArai 1:9db0e321a9f4 242 return impl::pair_getter<I>::get_move(std::move(p));
kenjiArai 1:9db0e321a9f4 243 }
kenjiArai 1:9db0e321a9f4 244
kenjiArai 1:9db0e321a9f4 245 template <size_t I, typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 246 constexpr const tuple_element_t<I, pair<T1, T2>> &&get(const pair<T1, T2> &&p) noexcept
kenjiArai 1:9db0e321a9f4 247 {
kenjiArai 1:9db0e321a9f4 248 return impl::pair_getter<I>::cget_move(std::move(p));
kenjiArai 1:9db0e321a9f4 249 }
kenjiArai 1:9db0e321a9f4 250
kenjiArai 1:9db0e321a9f4 251 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 252 constexpr T1 &get(pair<T1, T2> &p) noexcept
kenjiArai 1:9db0e321a9f4 253 {
kenjiArai 1:9db0e321a9f4 254 return p.first;
kenjiArai 1:9db0e321a9f4 255 }
kenjiArai 1:9db0e321a9f4 256
kenjiArai 1:9db0e321a9f4 257 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 258 constexpr const T1 &get(const pair<T1, T2> &p) noexcept
kenjiArai 1:9db0e321a9f4 259 {
kenjiArai 1:9db0e321a9f4 260 return p.first;
kenjiArai 1:9db0e321a9f4 261 }
kenjiArai 1:9db0e321a9f4 262
kenjiArai 1:9db0e321a9f4 263 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 264 constexpr T1 &&get(pair<T1, T2> &&p) noexcept
kenjiArai 1:9db0e321a9f4 265 {
kenjiArai 1:9db0e321a9f4 266 return p.first;
kenjiArai 1:9db0e321a9f4 267 }
kenjiArai 1:9db0e321a9f4 268
kenjiArai 1:9db0e321a9f4 269 template <typename T1, typename T2>
kenjiArai 1:9db0e321a9f4 270 constexpr const T1 &&get(const pair<T1, T2> &&p) noexcept
kenjiArai 1:9db0e321a9f4 271 {
kenjiArai 1:9db0e321a9f4 272 return p.first;
kenjiArai 1:9db0e321a9f4 273 }
kenjiArai 1:9db0e321a9f4 274
kenjiArai 1:9db0e321a9f4 275 template <typename T2, typename T1>
kenjiArai 1:9db0e321a9f4 276 constexpr T2 &get(pair<T1, T2> &p) noexcept
kenjiArai 1:9db0e321a9f4 277 {
kenjiArai 1:9db0e321a9f4 278 return p.second;
kenjiArai 1:9db0e321a9f4 279 }
kenjiArai 1:9db0e321a9f4 280
kenjiArai 1:9db0e321a9f4 281 template <typename T2, typename T1>
kenjiArai 1:9db0e321a9f4 282 constexpr const T2 &get(const pair<T1, T2> &p) noexcept
kenjiArai 1:9db0e321a9f4 283 {
kenjiArai 1:9db0e321a9f4 284 return p.second;
kenjiArai 1:9db0e321a9f4 285 }
kenjiArai 1:9db0e321a9f4 286
kenjiArai 1:9db0e321a9f4 287 template <typename T2, typename T1>
kenjiArai 1:9db0e321a9f4 288 constexpr T2 &&get(pair<T1, T2> &&p) noexcept
kenjiArai 1:9db0e321a9f4 289 {
kenjiArai 1:9db0e321a9f4 290 return p.second;
kenjiArai 1:9db0e321a9f4 291 }
kenjiArai 1:9db0e321a9f4 292
kenjiArai 1:9db0e321a9f4 293 template <typename T2, typename T1>
kenjiArai 1:9db0e321a9f4 294 constexpr const T2 &&get(const pair<T1, T2> &&p) noexcept
kenjiArai 1:9db0e321a9f4 295 {
kenjiArai 1:9db0e321a9f4 296 return p.second;
kenjiArai 1:9db0e321a9f4 297 }
kenjiArai 1:9db0e321a9f4 298
kenjiArai 1:9db0e321a9f4 299
kenjiArai 1:9db0e321a9f4 300 } // namespace std
kenjiArai 1:9db0e321a9f4 301 #endif
kenjiArai 1:9db0e321a9f4 302
kenjiArai 1:9db0e321a9f4 303 namespace mstd {
kenjiArai 1:9db0e321a9f4 304 namespace rel_ops { using namespace std::rel_ops; }
kenjiArai 1:9db0e321a9f4 305 using std::initializer_list;
kenjiArai 1:9db0e321a9f4 306 using std::exchange;
kenjiArai 1:9db0e321a9f4 307 using std::forward;
kenjiArai 1:9db0e321a9f4 308 using std::move;
kenjiArai 1:9db0e321a9f4 309 // No exceptions in mbed OS
kenjiArai 1:9db0e321a9f4 310 template <typename T>
kenjiArai 1:9db0e321a9f4 311 T &&move_if_noexcept(T &t) noexcept
kenjiArai 1:9db0e321a9f4 312 {
kenjiArai 1:9db0e321a9f4 313 return mstd::move(t);
kenjiArai 1:9db0e321a9f4 314 }
kenjiArai 1:9db0e321a9f4 315 using std::declval;
kenjiArai 1:9db0e321a9f4 316 using std::make_pair;
kenjiArai 1:9db0e321a9f4 317 using std::get;
kenjiArai 1:9db0e321a9f4 318 using std::pair;
kenjiArai 1:9db0e321a9f4 319 using std::integer_sequence;
kenjiArai 1:9db0e321a9f4 320 using std::index_sequence;
kenjiArai 1:9db0e321a9f4 321 using std::make_integer_sequence;
kenjiArai 1:9db0e321a9f4 322 using std::make_index_sequence;
kenjiArai 1:9db0e321a9f4 323 using std::index_sequence_for;
kenjiArai 1:9db0e321a9f4 324
kenjiArai 1:9db0e321a9f4 325 // C++17 [utility.as_const] */
kenjiArai 1:9db0e321a9f4 326 #if __cpp_lib_as_const >= 201510
kenjiArai 1:9db0e321a9f4 327 using std::as_const;
kenjiArai 1:9db0e321a9f4 328 #else
kenjiArai 1:9db0e321a9f4 329 template <typename _TypeT>
kenjiArai 1:9db0e321a9f4 330 constexpr std::add_const_t<_TypeT> &as_const(_TypeT &__t) noexcept
kenjiArai 1:9db0e321a9f4 331 {
kenjiArai 1:9db0e321a9f4 332 return __t;
kenjiArai 1:9db0e321a9f4 333 }
kenjiArai 1:9db0e321a9f4 334
kenjiArai 1:9db0e321a9f4 335 template <typename _TypeT>
kenjiArai 1:9db0e321a9f4 336 void as_const(_TypeT &&) = delete;
kenjiArai 1:9db0e321a9f4 337 #endif
kenjiArai 1:9db0e321a9f4 338
kenjiArai 1:9db0e321a9f4 339 } // namespace mstd
kenjiArai 1:9db0e321a9f4 340
kenjiArai 1:9db0e321a9f4 341 #endif // MSTD_UTILITY_