6namespace opcua::detail {
8template <
typename... Ts>
9struct Overload : Ts... {
10 using Ts::operator()...;
13template <
typename... Ts>
14Overload(Ts...) -> Overload<Ts...>;
17struct AlwaysFalse : std::false_type {};
19template <
typename T,
typename... Ts>
20using IsOneOf = std::disjunction<std::is_same<T, Ts>...>;
26template <
typename C,
typename T>
27struct MemberType<T C::*> {
32using MemberTypeT =
typename MemberType<T>::type;
35using IterCategoryT =
typename std::iterator_traits<T>::iterator_category;
38using IterValueT =
typename std::iterator_traits<T>::value_type;
41using RangeIteratorT =
decltype(std::begin(std::declval<T&>()));
44using RangeValueT =
typename std::iterator_traits<RangeIteratorT<T>>::value_type;
46template <
typename,
typename =
void>
47struct HasBegin : std::false_type {};
50struct HasBegin<T, std::void_t<decltype(std::begin(std::declval<T&>()))>> : std::true_type {};
52template <
typename,
typename =
void>
53struct HasEnd : std::false_type {};
56struct HasEnd<T, std::void_t<decltype(std::end(std::declval<T&>()))>> : std::true_type {};
58template <
typename,
typename =
void>
59struct HasData : std::false_type {};
62struct HasData<T, std::void_t<decltype(std::data(std::declval<T&>()))>> : std::true_type {};
64template <
typename,
typename =
void>
65struct HasDataPointer : std::false_type {};
68struct HasDataPointer<T, std::void_t<decltype(std::data(std::declval<T&>()))>>
69 : std::is_pointer<decltype(std::data(std::declval<T&>()))> {};
71template <
typename,
typename =
void>
72struct HasSize : std::false_type {};
75struct HasSize<T, std::void_t<decltype(std::size(std::declval<T&>()))>> : std::true_type {};
78struct IsRange : std::conjunction<HasBegin<T>, HasEnd<T>> {};
81struct IsContiguousRange : std::conjunction<IsRange<T>, HasDataPointer<T>, HasSize<T>> {};
83template <
typename T,
typename =
void>
84struct IsStringLike : std::false_type {};
87struct IsStringLike<T, std::enable_if_t<IsRange<T>::value>>
90 std::is_same<RangeValueT<T>, char>,
91 std::is_constructible<std::remove_reference_t<T>, const char*>,
92 std::is_constructible<std::remove_reference_t<T>, const char*, size_t>> {};