| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- //
- // traits.h
- // serializer
- //
- // Created by Sam Jaffe on 3/15/23.
- //
- #pragma once
- namespace serializer::detail {
- template <typename> struct always_false : std::false_type {};
- // Don't capture Aggregate objects lol...
- template <typename, typename = void> struct is_tuple : std::false_type {};
- template <typename K, typename V>
- struct is_tuple<std::pair<K, V>> : std::true_type {};
- template <typename T, size_t N>
- struct is_tuple<std::array<T, N>> : std::true_type {};
- template <typename... Ts>
- struct is_tuple<std::tuple<Ts...>> : 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, typename = void>
- struct is_associative_container : std::false_type {};
- template <typename T>
- struct is_associative_container<T, std::void_t<typename T::mapped_type>>
- : std::true_type {};
- template <typename, typename = void>
- struct has_serial_type : std::false_type {};
- template <typename T>
- struct has_serial_type<T, std::void_t<typename T::serial_type>>
- : std::true_type {};
- template <typename, typename = void>
- struct is_dereferencable : std::false_type {};
- template <typename T>
- struct is_dereferencable<T, std::enable_if_t<!std::is_void_v<decltype(*T())>>> : std::true_type {};
- template <typename T> constexpr bool is_tuple_v = is_tuple<T>{};
- template <typename T> constexpr bool is_container_v = is_container<T>{};
- template <typename T>
- constexpr bool is_associative_container_v =
- is_container_v<T> && is_associative_container<T>{};
- template <typename T> constexpr bool has_serial_type_v = has_serial_type<T>{};
- template <typename T> constexpr bool is_dereferencable_v = is_dereferencable<T>{};
- }
|