traits.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. //
  2. // traits.h
  3. // string-utils
  4. //
  5. // Created by Sam Jaffe on 6/12/22.
  6. // Copyright © 2022 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <tuple>
  10. #include <type_traits>
  11. namespace string_utils::detail {
  12. template <typename> struct always_false : std::false_type {};
  13. template <typename, typename = void> struct has_result : std::false_type {};
  14. template <typename F>
  15. struct has_result<F, std::void_t<std::result_of_t<F>>> : std::true_type {};
  16. template <typename, typename = void> struct is_tuple : std::false_type {};
  17. template <typename T>
  18. struct is_tuple<T, std::void_t<typename std::tuple_size<T>::type>> : std::true_type {};
  19. template <typename, typename = void> struct is_associative : std::false_type {};
  20. template <typename T>
  21. struct is_associative<T, std::void_t<typename T::mapped_type>> : std::true_type {};
  22. template <typename C>
  23. using insert_t = decltype(std::declval<C>().insert(std::declval<typename C::iterator>(),
  24. std::declval<typename C::value_type>()));
  25. template <typename, typename = void> struct is_container : std::false_type {};
  26. template <typename T>
  27. struct is_container<T, std::void_t<typename T::value_type, insert_t<T>>> : std::true_type {};
  28. template <typename T> struct decay { using type = std::decay_t<T>; };
  29. template <template <typename...> class C, typename... Ts>
  30. struct decay<C<Ts...>> { using type = C<std::decay_t<Ts>...>; };
  31. template <typename T> using decay_t = typename decay<std::decay_t<T>>::type;
  32. }