traits.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. #pragma once
  2. #define _val(type) std::declval<type>()
  3. #define exists(expr) void_t<decltype(expr)>
  4. #include <iterator/iterator_fwd.hpp>
  5. namespace iterator::detail {
  6. template <typename> using void_t = void;
  7. template <typename T, typename = void> struct reference_helper {
  8. using type = decltype(*std::declval<T>());
  9. };
  10. template <typename T>
  11. struct reference_helper<T, void_t<typename T::reference>> {
  12. using type = typename T::reference;
  13. };
  14. template <typename T, typename = void> struct value_type_helper {
  15. using reference = typename reference_helper<T>::type;
  16. using type = std::remove_cv_t<std::remove_reference_t<reference>>;
  17. };
  18. template <typename T>
  19. struct value_type_helper<T, void_t<typename T::value_type>> {
  20. using type = typename T::value_type;
  21. };
  22. template <typename T> using value_type = typename value_type_helper<T>::type;
  23. template <typename T> using reference = typename reference_helper<T>::type;
  24. template <typename C, typename = void> struct is_container : std::false_type {};
  25. template <typename C>
  26. struct is_container<C, void_t<iter<C>>> : std::true_type {};
  27. template <typename C> constexpr bool is_container_v = is_container<C>{};
  28. }