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 tUNChe License.
kenjiArai 1:9db0e321a9f4 16 */
kenjiArai 1:9db0e321a9f4 17 #ifndef MSTD_FUNCTIONAL_
kenjiArai 1:9db0e321a9f4 18 #define MSTD_FUNCTIONAL_
kenjiArai 1:9db0e321a9f4 19
kenjiArai 1:9db0e321a9f4 20 /* <mstd_functional>
kenjiArai 1:9db0e321a9f4 21 *
kenjiArai 1:9db0e321a9f4 22 * - includes toolchain's <functional>
kenjiArai 1:9db0e321a9f4 23 * - For ARM C 5, standard C++11/14 features:
kenjiArai 1:9db0e321a9f4 24 * - std::mem_fn,
kenjiArai 1:9db0e321a9f4 25 * - std::reference_wrapper, std::ref, std::cref
kenjiArai 1:9db0e321a9f4 26 * - transparent std::plus<> etc
kenjiArai 1:9db0e321a9f4 27 * - std::bit_and, std::bit_or, std::bit_xor, std::bit_not
kenjiArai 1:9db0e321a9f4 28 * - For all toolchains, C++17/20 backports:
kenjiArai 1:9db0e321a9f4 29 * - mstd::not_fn (C++17)
kenjiArai 1:9db0e321a9f4 30 * - mstd::invoke (C++17)
kenjiArai 1:9db0e321a9f4 31 * - mstd::unwrap_reference, mstd::unwrap_ref_decay (C++20)
kenjiArai 1:9db0e321a9f4 32 */
kenjiArai 1:9db0e321a9f4 33
kenjiArai 1:9db0e321a9f4 34 #include <functional>
kenjiArai 1:9db0e321a9f4 35
kenjiArai 1:9db0e321a9f4 36 #include <mstd_memory> // addressof
kenjiArai 1:9db0e321a9f4 37 #include <mstd_utility> // forward
kenjiArai 1:9db0e321a9f4 38 #include <mstd_type_traits>
kenjiArai 1:9db0e321a9f4 39
kenjiArai 1:9db0e321a9f4 40 #ifdef __CC_ARM
kenjiArai 1:9db0e321a9f4 41
kenjiArai 1:9db0e321a9f4 42 namespace std
kenjiArai 1:9db0e321a9f4 43 {
kenjiArai 1:9db0e321a9f4 44 // [func.memfn]
kenjiArai 1:9db0e321a9f4 45 namespace impl {
kenjiArai 1:9db0e321a9f4 46 template <typename R, typename T>
kenjiArai 1:9db0e321a9f4 47 class mem_fn_t {
kenjiArai 1:9db0e321a9f4 48 R T::* pm;
kenjiArai 1:9db0e321a9f4 49 public:
kenjiArai 1:9db0e321a9f4 50 mem_fn_t(R T::* pm) : pm(pm) { }
kenjiArai 1:9db0e321a9f4 51 template <typename... Args>
kenjiArai 1:9db0e321a9f4 52 invoke_result_t<R T::*, Args...> operator()(Args&&... args) const
kenjiArai 1:9db0e321a9f4 53 {
kenjiArai 1:9db0e321a9f4 54 return std::invoke(pm, std::forward<Args>(args)...);
kenjiArai 1:9db0e321a9f4 55 }
kenjiArai 1:9db0e321a9f4 56 };
kenjiArai 1:9db0e321a9f4 57 }
kenjiArai 1:9db0e321a9f4 58
kenjiArai 1:9db0e321a9f4 59 template <class R, class T>
kenjiArai 1:9db0e321a9f4 60 impl::mem_fn_t<R, T> mem_fn(R T::* pm)
kenjiArai 1:9db0e321a9f4 61 {
kenjiArai 1:9db0e321a9f4 62 return impl::mem_fn_t<R, T>(pm);
kenjiArai 1:9db0e321a9f4 63 }
kenjiArai 1:9db0e321a9f4 64
kenjiArai 1:9db0e321a9f4 65 } // namespace std
kenjiArai 1:9db0e321a9f4 66
kenjiArai 1:9db0e321a9f4 67 #endif // __CC_ARM
kenjiArai 1:9db0e321a9f4 68
kenjiArai 1:9db0e321a9f4 69 namespace mstd {
kenjiArai 1:9db0e321a9f4 70
kenjiArai 1:9db0e321a9f4 71 // [func.invoke]
kenjiArai 1:9db0e321a9f4 72 #if __cpp_lib_invoke >= 201411
kenjiArai 1:9db0e321a9f4 73 using std::invoke;
kenjiArai 1:9db0e321a9f4 74 #else
kenjiArai 1:9db0e321a9f4 75 template <typename F, typename... Args>
kenjiArai 1:9db0e321a9f4 76 invoke_result_t<F, Args...> invoke(F&& f, Args&&... args)
kenjiArai 1:9db0e321a9f4 77 {
kenjiArai 1:9db0e321a9f4 78 return impl::INVOKE(std::forward<F>(f), std::forward<Args>(args)...);
kenjiArai 1:9db0e321a9f4 79 }
kenjiArai 1:9db0e321a9f4 80 #endif // __cpp_lib_invoke
kenjiArai 1:9db0e321a9f4 81
kenjiArai 1:9db0e321a9f4 82 } // namespace mstd
kenjiArai 1:9db0e321a9f4 83
kenjiArai 1:9db0e321a9f4 84 #ifdef __CC_ARM
kenjiArai 1:9db0e321a9f4 85 namespace std {
kenjiArai 1:9db0e321a9f4 86
kenjiArai 1:9db0e321a9f4 87 using mstd::invoke;
kenjiArai 1:9db0e321a9f4 88
kenjiArai 1:9db0e321a9f4 89 // [refwrap]
kenjiArai 1:9db0e321a9f4 90 template <typename T>
kenjiArai 1:9db0e321a9f4 91 class reference_wrapper {
kenjiArai 1:9db0e321a9f4 92 T *ptr;
kenjiArai 1:9db0e321a9f4 93 public:
kenjiArai 1:9db0e321a9f4 94 using type = T;
kenjiArai 1:9db0e321a9f4 95 // [refwrap.const]
kenjiArai 1:9db0e321a9f4 96 // LWG 2993 version of constructor does not seem to work in ARM C 5, so stick with
kenjiArai 1:9db0e321a9f4 97 // this original version.
kenjiArai 1:9db0e321a9f4 98 reference_wrapper(T &x) noexcept : ptr(addressof(x)) { }
kenjiArai 1:9db0e321a9f4 99 reference_wrapper(T &&x) = delete;
kenjiArai 1:9db0e321a9f4 100
kenjiArai 1:9db0e321a9f4 101 reference_wrapper(const reference_wrapper &) noexcept = default;
kenjiArai 1:9db0e321a9f4 102 // [refwrap.assign]
kenjiArai 1:9db0e321a9f4 103 reference_wrapper &operator=(const reference_wrapper &) noexcept = default;
kenjiArai 1:9db0e321a9f4 104
kenjiArai 1:9db0e321a9f4 105 // [refwrap.access]
kenjiArai 1:9db0e321a9f4 106 operator T &() const noexcept { return *ptr; }
kenjiArai 1:9db0e321a9f4 107 T &get() const noexcept { return *ptr; }
kenjiArai 1:9db0e321a9f4 108
kenjiArai 1:9db0e321a9f4 109 // [refwrap.invoke]
kenjiArai 1:9db0e321a9f4 110 template <typename... ArgTypes>
kenjiArai 1:9db0e321a9f4 111 invoke_result_t<T &, ArgTypes...> operator()(ArgTypes&&... args) const
kenjiArai 1:9db0e321a9f4 112 {
kenjiArai 1:9db0e321a9f4 113 return std::invoke(get(), forward<ArgTypes>(args)...);
kenjiArai 1:9db0e321a9f4 114 }
kenjiArai 1:9db0e321a9f4 115 };
kenjiArai 1:9db0e321a9f4 116
kenjiArai 1:9db0e321a9f4 117 // [refwrap.helpers]
kenjiArai 1:9db0e321a9f4 118 template <typename T>
kenjiArai 1:9db0e321a9f4 119 reference_wrapper<T> ref(T &t) noexcept
kenjiArai 1:9db0e321a9f4 120 {
kenjiArai 1:9db0e321a9f4 121 return reference_wrapper<T>(t);
kenjiArai 1:9db0e321a9f4 122 }
kenjiArai 1:9db0e321a9f4 123
kenjiArai 1:9db0e321a9f4 124 template <typename T>
kenjiArai 1:9db0e321a9f4 125 reference_wrapper<T> ref(reference_wrapper<T> &t) noexcept
kenjiArai 1:9db0e321a9f4 126 {
kenjiArai 1:9db0e321a9f4 127 return ref(t.get());
kenjiArai 1:9db0e321a9f4 128 }
kenjiArai 1:9db0e321a9f4 129
kenjiArai 1:9db0e321a9f4 130 template <typename T>
kenjiArai 1:9db0e321a9f4 131 void ref(const T &&) = delete;
kenjiArai 1:9db0e321a9f4 132
kenjiArai 1:9db0e321a9f4 133 template <typename T>
kenjiArai 1:9db0e321a9f4 134 reference_wrapper<const T> cref(const T &t) noexcept
kenjiArai 1:9db0e321a9f4 135 {
kenjiArai 1:9db0e321a9f4 136 return reference_wrapper<const T>(t);
kenjiArai 1:9db0e321a9f4 137 }
kenjiArai 1:9db0e321a9f4 138
kenjiArai 1:9db0e321a9f4 139 template <typename T>
kenjiArai 1:9db0e321a9f4 140 reference_wrapper<const T> cref(reference_wrapper<T> &t) noexcept
kenjiArai 1:9db0e321a9f4 141 {
kenjiArai 1:9db0e321a9f4 142 return cref(t.get());
kenjiArai 1:9db0e321a9f4 143 }
kenjiArai 1:9db0e321a9f4 144
kenjiArai 1:9db0e321a9f4 145 template <typename T>
kenjiArai 1:9db0e321a9f4 146 void cref(const T &&) = delete;
kenjiArai 1:9db0e321a9f4 147
kenjiArai 1:9db0e321a9f4 148 // ARMC5 has basic plus<T> etc - we can add plus<void> specialisations;
kenjiArai 1:9db0e321a9f4 149 // and the language rules allow us to add the default void arguments missing
kenjiArai 1:9db0e321a9f4 150 // from its header.
kenjiArai 1:9db0e321a9f4 151
kenjiArai 1:9db0e321a9f4 152 template <typename T = void> struct plus;
kenjiArai 1:9db0e321a9f4 153 template <typename T = void> struct minus;
kenjiArai 1:9db0e321a9f4 154 template <typename T = void> struct multiplies;
kenjiArai 1:9db0e321a9f4 155 template <typename T = void> struct divides;
kenjiArai 1:9db0e321a9f4 156 template <typename T = void> struct modulus;
kenjiArai 1:9db0e321a9f4 157 template <typename T = void> struct negate;
kenjiArai 1:9db0e321a9f4 158 template <typename T = void> struct equal_to;
kenjiArai 1:9db0e321a9f4 159 template <typename T = void> struct not_equal_to;
kenjiArai 1:9db0e321a9f4 160 template <typename T = void> struct greater;
kenjiArai 1:9db0e321a9f4 161 template <typename T = void> struct less;
kenjiArai 1:9db0e321a9f4 162 template <typename T = void> struct greater_equal;
kenjiArai 1:9db0e321a9f4 163 template <typename T = void> struct less_equal;
kenjiArai 1:9db0e321a9f4 164 template <typename T = void> struct logical_and;
kenjiArai 1:9db0e321a9f4 165 template <typename T = void> struct logical_or;
kenjiArai 1:9db0e321a9f4 166 template <typename T = void> struct logical_not;
kenjiArai 1:9db0e321a9f4 167
kenjiArai 1:9db0e321a9f4 168 // [arithmetic.operations.plus]
kenjiArai 1:9db0e321a9f4 169 template <>
kenjiArai 1:9db0e321a9f4 170 struct plus<void> {
kenjiArai 1:9db0e321a9f4 171 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 172 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 173 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) + std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 174 {
kenjiArai 1:9db0e321a9f4 175 return std::forward<T>(t) + std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 176 }
kenjiArai 1:9db0e321a9f4 177 };
kenjiArai 1:9db0e321a9f4 178
kenjiArai 1:9db0e321a9f4 179 // [arithmetic.operations.minus]
kenjiArai 1:9db0e321a9f4 180 template <>
kenjiArai 1:9db0e321a9f4 181 struct minus<void> {
kenjiArai 1:9db0e321a9f4 182 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 183 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 184 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) - std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 185 {
kenjiArai 1:9db0e321a9f4 186 return std::forward<T>(t) - std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 187 }
kenjiArai 1:9db0e321a9f4 188 };
kenjiArai 1:9db0e321a9f4 189
kenjiArai 1:9db0e321a9f4 190 // [arithmetic.operations.multiplies]
kenjiArai 1:9db0e321a9f4 191 template <>
kenjiArai 1:9db0e321a9f4 192 struct multiplies<void> {
kenjiArai 1:9db0e321a9f4 193 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 194 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 195 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) * std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 196 {
kenjiArai 1:9db0e321a9f4 197 return std::forward<T>(t) * std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 198 }
kenjiArai 1:9db0e321a9f4 199 };
kenjiArai 1:9db0e321a9f4 200
kenjiArai 1:9db0e321a9f4 201 // [arithmetic.operations.divides]
kenjiArai 1:9db0e321a9f4 202 template <>
kenjiArai 1:9db0e321a9f4 203 struct divides<void> {
kenjiArai 1:9db0e321a9f4 204 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 205 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 206 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) / std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 207 {
kenjiArai 1:9db0e321a9f4 208 return std::forward<T>(t) / std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 209 }
kenjiArai 1:9db0e321a9f4 210 };
kenjiArai 1:9db0e321a9f4 211
kenjiArai 1:9db0e321a9f4 212 // [arithmetic.operations.modulus]
kenjiArai 1:9db0e321a9f4 213 template <>
kenjiArai 1:9db0e321a9f4 214 struct modulus<void> {
kenjiArai 1:9db0e321a9f4 215 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 216 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 217 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) % std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 218 {
kenjiArai 1:9db0e321a9f4 219 return std::forward<T>(t) % std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 220 }
kenjiArai 1:9db0e321a9f4 221 };
kenjiArai 1:9db0e321a9f4 222
kenjiArai 1:9db0e321a9f4 223 // [arithmetic.operations.negate]
kenjiArai 1:9db0e321a9f4 224 template <>
kenjiArai 1:9db0e321a9f4 225 struct negate<void> {
kenjiArai 1:9db0e321a9f4 226 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 227 template <typename T>
kenjiArai 1:9db0e321a9f4 228 constexpr auto operator()(T&& t) const -> decltype(-std::forward<T>(t))
kenjiArai 1:9db0e321a9f4 229 {
kenjiArai 1:9db0e321a9f4 230 return -std::forward<T>(t);
kenjiArai 1:9db0e321a9f4 231 }
kenjiArai 1:9db0e321a9f4 232 };
kenjiArai 1:9db0e321a9f4 233
kenjiArai 1:9db0e321a9f4 234 // [comparisons.equal_to]
kenjiArai 1:9db0e321a9f4 235 template <>
kenjiArai 1:9db0e321a9f4 236 struct equal_to<void> {
kenjiArai 1:9db0e321a9f4 237 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 238 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 239 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) == std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 240 {
kenjiArai 1:9db0e321a9f4 241 return std::forward<T>(t) == std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 242 }
kenjiArai 1:9db0e321a9f4 243 };
kenjiArai 1:9db0e321a9f4 244
kenjiArai 1:9db0e321a9f4 245 // [comparisons.not_equal_to]
kenjiArai 1:9db0e321a9f4 246 template <>
kenjiArai 1:9db0e321a9f4 247 struct not_equal_to<void> {
kenjiArai 1:9db0e321a9f4 248 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 249 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 250 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) != std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 251 {
kenjiArai 1:9db0e321a9f4 252 return std::forward<T>(t) != std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 253 }
kenjiArai 1:9db0e321a9f4 254 };
kenjiArai 1:9db0e321a9f4 255
kenjiArai 1:9db0e321a9f4 256 // [comparisons.greater]
kenjiArai 1:9db0e321a9f4 257 template <>
kenjiArai 1:9db0e321a9f4 258 struct greater<void> {
kenjiArai 1:9db0e321a9f4 259 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 260 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 261 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) > std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 262 {
kenjiArai 1:9db0e321a9f4 263 return std::forward<T>(t) > std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 264 }
kenjiArai 1:9db0e321a9f4 265 };
kenjiArai 1:9db0e321a9f4 266
kenjiArai 1:9db0e321a9f4 267 // [comparisons.less]
kenjiArai 1:9db0e321a9f4 268 template <>
kenjiArai 1:9db0e321a9f4 269 struct less<void> {
kenjiArai 1:9db0e321a9f4 270 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 271 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 272 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) < std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 273 {
kenjiArai 1:9db0e321a9f4 274 return std::forward<T>(t) < std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 275 }
kenjiArai 1:9db0e321a9f4 276 };
kenjiArai 1:9db0e321a9f4 277
kenjiArai 1:9db0e321a9f4 278 // [comparisons.greater_equal]
kenjiArai 1:9db0e321a9f4 279 template <>
kenjiArai 1:9db0e321a9f4 280 struct greater_equal<void> {
kenjiArai 1:9db0e321a9f4 281 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 282 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 283 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) >= std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 284 {
kenjiArai 1:9db0e321a9f4 285 return std::forward<T>(t) >= std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 286 }
kenjiArai 1:9db0e321a9f4 287 };
kenjiArai 1:9db0e321a9f4 288
kenjiArai 1:9db0e321a9f4 289 // [comparisons.less_equal]
kenjiArai 1:9db0e321a9f4 290 template <>
kenjiArai 1:9db0e321a9f4 291 struct less_equal<void> {
kenjiArai 1:9db0e321a9f4 292 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 293 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 294 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) <= std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 295 {
kenjiArai 1:9db0e321a9f4 296 return std::forward<T>(t) <= std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 297 }
kenjiArai 1:9db0e321a9f4 298 };
kenjiArai 1:9db0e321a9f4 299
kenjiArai 1:9db0e321a9f4 300 // [logical.operations.and]
kenjiArai 1:9db0e321a9f4 301 template <>
kenjiArai 1:9db0e321a9f4 302 struct logical_and<void> {
kenjiArai 1:9db0e321a9f4 303 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 304 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 305 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) && std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 306 {
kenjiArai 1:9db0e321a9f4 307 return std::forward<T>(t) && std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 308 }
kenjiArai 1:9db0e321a9f4 309 };
kenjiArai 1:9db0e321a9f4 310
kenjiArai 1:9db0e321a9f4 311 // [logical.operations.or]
kenjiArai 1:9db0e321a9f4 312 template <>
kenjiArai 1:9db0e321a9f4 313 struct logical_or<void> {
kenjiArai 1:9db0e321a9f4 314 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 315 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 316 constexpr auto operator()(T&& t, U&& u) const -> decltype(std::forward<T>(t) || std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 317 {
kenjiArai 1:9db0e321a9f4 318 return std::forward<T>(t) || std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 319 }
kenjiArai 1:9db0e321a9f4 320 };
kenjiArai 1:9db0e321a9f4 321
kenjiArai 1:9db0e321a9f4 322 // [logical.operations.not]
kenjiArai 1:9db0e321a9f4 323 template <>
kenjiArai 1:9db0e321a9f4 324 struct logical_not<void> {
kenjiArai 1:9db0e321a9f4 325 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 326 template <typename T>
kenjiArai 1:9db0e321a9f4 327 constexpr auto operator()(T&& t) const -> decltype(!std::forward<T>(t))
kenjiArai 1:9db0e321a9f4 328 {
kenjiArai 1:9db0e321a9f4 329 return !std::forward<T>(t);
kenjiArai 1:9db0e321a9f4 330 }
kenjiArai 1:9db0e321a9f4 331 };
kenjiArai 1:9db0e321a9f4 332
kenjiArai 1:9db0e321a9f4 333 // [bitwise.operations.and]
kenjiArai 1:9db0e321a9f4 334 template <typename T = void>
kenjiArai 1:9db0e321a9f4 335 struct bit_and {
kenjiArai 1:9db0e321a9f4 336 constexpr T operator()(const T &x, const T &y) const
kenjiArai 1:9db0e321a9f4 337 {
kenjiArai 1:9db0e321a9f4 338 return x & y;
kenjiArai 1:9db0e321a9f4 339 }
kenjiArai 1:9db0e321a9f4 340 };
kenjiArai 1:9db0e321a9f4 341
kenjiArai 1:9db0e321a9f4 342 template <>
kenjiArai 1:9db0e321a9f4 343 struct bit_and<void> {
kenjiArai 1:9db0e321a9f4 344 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 345 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 346 constexpr auto operator()(T&& t,U&& u) const -> decltype(std::forward<T>(t) & std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 347 {
kenjiArai 1:9db0e321a9f4 348 return std::forward<T>(t) & std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 349 }
kenjiArai 1:9db0e321a9f4 350 };
kenjiArai 1:9db0e321a9f4 351
kenjiArai 1:9db0e321a9f4 352 // [bitwise.operations.or]
kenjiArai 1:9db0e321a9f4 353 template <typename T = void>
kenjiArai 1:9db0e321a9f4 354 struct bit_or {
kenjiArai 1:9db0e321a9f4 355 constexpr T operator()(const T &x, const T &y) const
kenjiArai 1:9db0e321a9f4 356 {
kenjiArai 1:9db0e321a9f4 357 return x & y;
kenjiArai 1:9db0e321a9f4 358 }
kenjiArai 1:9db0e321a9f4 359 };
kenjiArai 1:9db0e321a9f4 360
kenjiArai 1:9db0e321a9f4 361 template <>
kenjiArai 1:9db0e321a9f4 362 struct bit_or<void> {
kenjiArai 1:9db0e321a9f4 363 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 364 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 365 constexpr auto operator()(T&& t,U&& u) const -> decltype(std::forward<T>(t) | std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 366 {
kenjiArai 1:9db0e321a9f4 367 return std::forward<T>(t) | std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 368 }
kenjiArai 1:9db0e321a9f4 369 };
kenjiArai 1:9db0e321a9f4 370
kenjiArai 1:9db0e321a9f4 371 // [bitwise.operations.xor]
kenjiArai 1:9db0e321a9f4 372 template <typename T = void>
kenjiArai 1:9db0e321a9f4 373 struct bit_xor {
kenjiArai 1:9db0e321a9f4 374 constexpr T operator()(const T &x, const T &y) const
kenjiArai 1:9db0e321a9f4 375 {
kenjiArai 1:9db0e321a9f4 376 return x ^ y;
kenjiArai 1:9db0e321a9f4 377 }
kenjiArai 1:9db0e321a9f4 378 };
kenjiArai 1:9db0e321a9f4 379
kenjiArai 1:9db0e321a9f4 380 template <>
kenjiArai 1:9db0e321a9f4 381 struct bit_xor<void> {
kenjiArai 1:9db0e321a9f4 382 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 383 template <typename T, typename U>
kenjiArai 1:9db0e321a9f4 384 constexpr auto operator()(T&& t,U&& u) const -> decltype(std::forward<T>(t) ^ std::forward<U>(u))
kenjiArai 1:9db0e321a9f4 385 {
kenjiArai 1:9db0e321a9f4 386 return std::forward<T>(t) ^ std::forward<U>(u);
kenjiArai 1:9db0e321a9f4 387 }
kenjiArai 1:9db0e321a9f4 388 };
kenjiArai 1:9db0e321a9f4 389
kenjiArai 1:9db0e321a9f4 390 // [bitwise.operations.not]
kenjiArai 1:9db0e321a9f4 391 template <typename T = void>
kenjiArai 1:9db0e321a9f4 392 struct bit_not {
kenjiArai 1:9db0e321a9f4 393 constexpr T operator()(const T &arg) const
kenjiArai 1:9db0e321a9f4 394 {
kenjiArai 1:9db0e321a9f4 395 return ~arg;
kenjiArai 1:9db0e321a9f4 396 }
kenjiArai 1:9db0e321a9f4 397 };
kenjiArai 1:9db0e321a9f4 398
kenjiArai 1:9db0e321a9f4 399 template <>
kenjiArai 1:9db0e321a9f4 400 struct bit_not<void> {
kenjiArai 1:9db0e321a9f4 401 using is_transparent = true_type;
kenjiArai 1:9db0e321a9f4 402 template <typename T>
kenjiArai 1:9db0e321a9f4 403 constexpr auto operator()(T&& arg) const -> decltype(~std::forward<T>(arg))
kenjiArai 1:9db0e321a9f4 404 {
kenjiArai 1:9db0e321a9f4 405 return ~std::forward<T>(arg);
kenjiArai 1:9db0e321a9f4 406 }
kenjiArai 1:9db0e321a9f4 407 };
kenjiArai 1:9db0e321a9f4 408
kenjiArai 1:9db0e321a9f4 409 } // namespace std
kenjiArai 1:9db0e321a9f4 410
kenjiArai 1:9db0e321a9f4 411 #endif // __CC_ARM
kenjiArai 1:9db0e321a9f4 412
kenjiArai 1:9db0e321a9f4 413 namespace mstd {
kenjiArai 1:9db0e321a9f4 414 using std::reference_wrapper;
kenjiArai 1:9db0e321a9f4 415 using std::ref;
kenjiArai 1:9db0e321a9f4 416 using std::cref;
kenjiArai 1:9db0e321a9f4 417 using std::plus;
kenjiArai 1:9db0e321a9f4 418 using std::minus;
kenjiArai 1:9db0e321a9f4 419 using std::multiplies;
kenjiArai 1:9db0e321a9f4 420 using std::divides;
kenjiArai 1:9db0e321a9f4 421 using std::modulus;
kenjiArai 1:9db0e321a9f4 422 using std::negate;
kenjiArai 1:9db0e321a9f4 423 using std::equal_to;
kenjiArai 1:9db0e321a9f4 424 using std::not_equal_to;
kenjiArai 1:9db0e321a9f4 425 using std::greater;
kenjiArai 1:9db0e321a9f4 426 using std::less;
kenjiArai 1:9db0e321a9f4 427 using std::greater_equal;
kenjiArai 1:9db0e321a9f4 428 using std::less_equal;
kenjiArai 1:9db0e321a9f4 429 using std::logical_and;
kenjiArai 1:9db0e321a9f4 430 using std::logical_or;
kenjiArai 1:9db0e321a9f4 431 using std::logical_not;
kenjiArai 1:9db0e321a9f4 432 using std::bit_and;
kenjiArai 1:9db0e321a9f4 433 using std::bit_or;
kenjiArai 1:9db0e321a9f4 434 using std::bit_xor;
kenjiArai 1:9db0e321a9f4 435 using std::bit_not;
kenjiArai 1:9db0e321a9f4 436
kenjiArai 1:9db0e321a9f4 437 #if __cpp_lib_not_fn >= 201603
kenjiArai 1:9db0e321a9f4 438 using std::not_fn;
kenjiArai 1:9db0e321a9f4 439 #else
kenjiArai 1:9db0e321a9f4 440 namespace impl {
kenjiArai 1:9db0e321a9f4 441 // [func.not_fn]
kenjiArai 1:9db0e321a9f4 442 template <typename F>
kenjiArai 1:9db0e321a9f4 443 class not_fn_t {
kenjiArai 1:9db0e321a9f4 444 std::decay_t<F> fn;
kenjiArai 1:9db0e321a9f4 445 public:
kenjiArai 1:9db0e321a9f4 446 explicit not_fn_t(F&& f) : fn(std::forward<F>(f)) { }
kenjiArai 1:9db0e321a9f4 447 not_fn_t(const not_fn_t &other) = default;
kenjiArai 1:9db0e321a9f4 448 not_fn_t(not_fn_t &&other) = default;
kenjiArai 1:9db0e321a9f4 449
kenjiArai 1:9db0e321a9f4 450 template<typename... Args>
kenjiArai 1:9db0e321a9f4 451 auto operator()(Args&&... args) & -> decltype(!std::declval<invoke_result_t<std::decay_t<F> &, Args...>>())
kenjiArai 1:9db0e321a9f4 452 {
kenjiArai 1:9db0e321a9f4 453 return !mstd::invoke(fn, std::forward<Args>(args)...);
kenjiArai 1:9db0e321a9f4 454 }
kenjiArai 1:9db0e321a9f4 455
kenjiArai 1:9db0e321a9f4 456 template<typename... Args>
kenjiArai 1:9db0e321a9f4 457 auto operator()(Args&&... args) const & -> decltype(!std::declval<invoke_result_t<std::decay_t<F> const &, Args...>>())
kenjiArai 1:9db0e321a9f4 458 {
kenjiArai 1:9db0e321a9f4 459 return !mstd::invoke(fn, std::forward<Args>(args)...);
kenjiArai 1:9db0e321a9f4 460 }
kenjiArai 1:9db0e321a9f4 461
kenjiArai 1:9db0e321a9f4 462 template<typename... Args>
kenjiArai 1:9db0e321a9f4 463 auto operator()(Args&&... args) && -> decltype(!std::declval<invoke_result_t<std::decay_t<F>, Args...>>())
kenjiArai 1:9db0e321a9f4 464 {
kenjiArai 1:9db0e321a9f4 465 return !mstd::invoke(std::move(fn), std::forward<Args>(args)...);
kenjiArai 1:9db0e321a9f4 466 }
kenjiArai 1:9db0e321a9f4 467
kenjiArai 1:9db0e321a9f4 468 template<typename... Args>
kenjiArai 1:9db0e321a9f4 469 auto operator()(Args&&... args) const && -> decltype(!std::declval<invoke_result_t<std::decay_t<F> const, Args...>>())
kenjiArai 1:9db0e321a9f4 470 {
kenjiArai 1:9db0e321a9f4 471 return !mstd::invoke(std::move(fn), std::forward<Args>(args)...);
kenjiArai 1:9db0e321a9f4 472 }
kenjiArai 1:9db0e321a9f4 473 };
kenjiArai 1:9db0e321a9f4 474 }
kenjiArai 1:9db0e321a9f4 475
kenjiArai 1:9db0e321a9f4 476 template <typename F>
kenjiArai 1:9db0e321a9f4 477 impl::not_fn_t<F> not_fn(F&& f)
kenjiArai 1:9db0e321a9f4 478 {
kenjiArai 1:9db0e321a9f4 479 return impl::not_fn_t<F>(std::forward<F>(f));
kenjiArai 1:9db0e321a9f4 480 }
kenjiArai 1:9db0e321a9f4 481 #endif
kenjiArai 1:9db0e321a9f4 482
kenjiArai 1:9db0e321a9f4 483 /* C++20 unwrap_reference */
kenjiArai 1:9db0e321a9f4 484 template <typename T>
kenjiArai 1:9db0e321a9f4 485 struct unwrap_reference : type_identity<T> { };
kenjiArai 1:9db0e321a9f4 486 template <typename T>
kenjiArai 1:9db0e321a9f4 487 struct unwrap_reference<std::reference_wrapper<T>> : type_identity<T &> { };
kenjiArai 1:9db0e321a9f4 488 template <typename T>
kenjiArai 1:9db0e321a9f4 489 using unwrap_reference_t = typename unwrap_reference<T>::type;
kenjiArai 1:9db0e321a9f4 490
kenjiArai 1:9db0e321a9f4 491 /* C++20 unwrap_ref_decay */
kenjiArai 1:9db0e321a9f4 492 template <typename T>
kenjiArai 1:9db0e321a9f4 493 struct unwrap_ref_decay : unwrap_reference<std::decay_t<T>> { };
kenjiArai 1:9db0e321a9f4 494 template <typename T>
kenjiArai 1:9db0e321a9f4 495 using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type;
kenjiArai 1:9db0e321a9f4 496
kenjiArai 1:9db0e321a9f4 497 }
kenjiArai 1:9db0e321a9f4 498
kenjiArai 1:9db0e321a9f4 499 #endif // MSTD_FUNCTIONAL_