| 123456789101112131415161718192021222324252627282930313233343536 |
- //
- // traits.h
- // string-utils
- //
- // Created by Sam Jaffe on 6/12/22.
- // Copyright © 2022 Sam Jaffe. All rights reserved.
- //
- #pragma once
- #include <tuple>
- #include <type_traits>
- namespace string_utils::detail {
- template <typename> struct always_false : std::false_type {};
- template <typename, typename = void> struct has_result : std::false_type {};
- template <typename F>
- struct has_result<F, std::void_t<std::result_of_t<F>>> : std::true_type {};
- template <typename, typename = void> struct is_tuple : std::false_type {};
- template <typename T>
- struct is_tuple<T, std::void_t<typename std::tuple_size<T>::type>> : std::true_type {};
- template <typename, typename = void> struct is_associative : std::false_type {};
- template <typename T>
- struct is_associative<T, std::void_t<typename T::mapped_type>> : std::true_type {};
- template <typename, typename = void> struct is_container : std::false_type {};
- template <typename T>
- struct is_container<T, std::void_t<typename T::value_type>> : std::true_type {};
- template <typename T> struct decay { using type = std::decay_t<T>; };
- template <template <typename...> class C, typename... Ts>
- struct decay<C<Ts...>> { using type = C<std::decay_t<Ts>...>; };
- template <typename T> using decay_t = typename decay<std::decay_t<T>>::type;
- }
|