5namespace opcua::detail {
7template <
typename... Ts>
8struct Overload : Ts... {
9 using Ts::operator()...;
12template <
typename... Ts>
13Overload(Ts...) -> Overload<Ts...>;
16struct AlwaysFalse : std::false_type {};
18template <
typename T,
typename... Ts>
19using IsOneOf = std::disjunction<std::is_same<T, Ts>...>;
25template <
typename C,
typename T>
26struct MemberType<T C::*> {
31using MemberTypeT =
typename MemberType<T>::type;
33template <
typename T,
typename =
void>
34struct IsContainer : std::false_type {};
39 std::void_t<decltype(std::declval<T>().begin()), decltype(std::declval<T>().end())>>
43inline constexpr bool isContainer = IsContainer<T>::value;
45template <
typename T,
typename =
void>
46struct IsContiguousContainer : std::false_type {};
49struct IsContiguousContainer<
52 decltype(std::declval<T>().data()),
53 decltype(std::declval<T>().size()),
54 decltype(std::declval<T>().begin()),
55 decltype(std::declval<T>().end())>> : std::true_type {
56 using value_type = bool;
58 static constexpr bool value = std::is_pointer_v<decltype(std::declval<T>().data())>;
59 using type = std::bool_constant<value>;
63struct IsMutableContainer
66 decltype(std::declval<T>().begin()),
67 typename std::remove_reference_t<T>::iterator>,
69 decltype(std::declval<T>().end()),
70 typename std::remove_reference_t<T>::iterator>,
71 std::negation<std::is_same<
72 typename std::remove_reference_t<T>::iterator,
73 typename std::remove_reference_t<T>::const_iterator>>> {};