traits.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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_wrapper : std::false_type {};
  19. template <typename T>
  20. struct is_wrapper<T, std::void_t<typename T::value_type>> : std::true_type {};
  21. template <typename, typename = void> struct is_container : std::false_type {};
  22. template <typename T>
  23. struct is_container<T, std::void_t<decltype(std::begin(std::declval<T>()))>>
  24. : is_wrapper<T> {};
  25. template <typename, typename = void>
  26. struct is_associative_container : std::false_type {};
  27. template <typename T>
  28. struct is_associative_container<T, std::void_t<typename T::mapped_type>>
  29. : std::true_type {};
  30. template <typename, typename = void>
  31. struct has_serial_type : std::false_type {};
  32. template <typename T>
  33. struct has_serial_type<T, std::void_t<typename T::serial_type>>
  34. : std::true_type {};
  35. template <typename, typename = void>
  36. struct is_dereferencable : std::false_type {};
  37. template <typename T>
  38. struct is_dereferencable<T, std::enable_if_t<!std::is_void_v<decltype(*T())>>>
  39. : std::true_type {};
  40. template <typename T> constexpr bool is_tuple_v = is_tuple<T>{};
  41. template <typename T> constexpr bool is_wrapper_v = is_wrapper<T>{};
  42. template <typename T> constexpr bool is_container_v = is_container<T>{};
  43. template <typename T>
  44. constexpr bool is_associative_container_v =
  45. is_container_v<T> && is_associative_container<T>{};
  46. template <typename T> constexpr bool has_serial_type_v = has_serial_type<T>{};
  47. template <typename T>
  48. constexpr bool is_dereferencable_v = is_dereferencable<T>{};
  49. }