traits.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //
  2. // traits.h
  3. // serializer
  4. //
  5. // Created by Sam Jaffe on 3/15/23.
  6. //
  7. #pragma once
  8. namespace serializer::detail {
  9. template <typename> struct always_false : std::false_type {};
  10. // Don't capture Aggregate objects lol...
  11. template <typename, typename = void> struct is_tuple : std::false_type {};
  12. template <typename K, typename V>
  13. struct is_tuple<std::pair<K, V>> : std::true_type {};
  14. template <typename T, size_t N>
  15. struct is_tuple<std::array<T, N>> : std::true_type {};
  16. template <typename... Ts>
  17. struct is_tuple<std::tuple<Ts...>> : std::true_type {};
  18. template <typename, typename = void> struct is_container : std::false_type {};
  19. template <typename T>
  20. struct is_container<T, std::void_t<typename T::value_type>> : std::true_type {};
  21. template <typename, typename = void>
  22. struct is_associative_container : std::false_type {};
  23. template <typename T>
  24. struct is_associative_container<T, std::void_t<typename T::mapped_type>>
  25. : std::true_type {};
  26. template <typename, typename = void>
  27. struct has_serial_type : std::false_type {};
  28. template <typename T>
  29. struct has_serial_type<T, std::void_t<typename T::serial_type>>
  30. : std::true_type {};
  31. template <typename, typename = void>
  32. struct is_dereferencable : std::false_type {};
  33. template <typename T>
  34. struct is_dereferencable<T, std::enable_if_t<!std::is_void_v<decltype(*T())>>> : std::true_type {};
  35. template <typename T> constexpr bool is_tuple_v = is_tuple<T>{};
  36. template <typename T> constexpr bool is_container_v = is_container<T>{};
  37. template <typename T>
  38. constexpr bool is_associative_container_v =
  39. is_container_v<T> && is_associative_container<T>{};
  40. template <typename T> constexpr bool has_serial_type_v = has_serial_type<T>{};
  41. template <typename T> constexpr bool is_dereferencable_v = is_dereferencable<T>{};
  42. }