24 template <
template<
typename...>
typename Trait,
typename Enabler,
typename... Args>
28 template <
template<
typename...>
typename Trait,
typename... Args>
29 struct is_detected<Trait, std::void_t<Trait<Args...>>, Args...>
37 using begin_member =
decltype(declval<T>().begin());
42 using end_member =
decltype(declval<T>().end());
47 using resize_member =
decltype(declval<T>().resize(declval<uint32_t>()));
52 using size_member =
decltype(declval<T>().size());
56 template <
typename T,
typename = void_t<>>
65 template<
typename P,
typename T,
typename = std::void_t<>>
69 template<
typename P,
typename T>
71 decltype(declval<P>().pup_impl(declval<T&>(), declval<
const Meta&>()))>>
82 return detect::has_begin<T>::value
83 &&
detect::has_end<T>::value
84 &&
detect::has_resize<T>::value
85 &&
detect::has_size<T>::value;
90 return is_pup_iterable<T>()
91 && !std::is_same<std::string, T>::value;
94 template<
typename P,
typename T>
101 return std::is_integral<T>()
102 || std::is_floating_point<T>()
103 || std::is_same<std::string, T>();
106 template <
typename T>
107 using enable_if_pup_iterable =
typename std::enable_if_t<is_pup_iterable<T>()>;
109 template <
typename T>
110 using enable_if_puppable_container =
typename std::enable_if_t<is_pup_container<T>()>;
113 using enable_if_puppable =
typename std::enable_if_t<is_puppable<T>()>;
116 using enable_if_not_puppable =
typename std::enable_if_t<!is_puppable<T>()>;
119 using enable_if_puppable_map =
typename std::enable_if_t<is_map<T>()>;
constexpr bool is_pup_iterable()
constexpr bool is_puppable()
constexpr bool is_pup_container()
constexpr bool is_pup_impl()