open62541pp 0.17.0
C++ wrapper of open62541
Loading...
Searching...
No Matches
traits.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <type_traits>
4
5namespace opcua::detail {
6
7template <typename... Ts>
8struct Overload : Ts... {
9 using Ts::operator()...;
10};
11
12template <typename... Ts>
13Overload(Ts...) -> Overload<Ts...>;
14
15template <typename...>
16struct AlwaysFalse : std::false_type {};
17
18template <typename T, typename... Ts>
19using IsOneOf = std::disjunction<std::is_same<T, Ts>...>;
20
21/// Derive member type from member pointer
22template <typename T>
23struct MemberType;
24
25template <typename C, typename T>
26struct MemberType<T C::*> {
27 using type = T;
28};
29
30template <typename T>
31using MemberTypeT = typename MemberType<T>::type;
32
33template <typename T, typename = void>
34struct IsContainer : std::false_type {};
35
36template <typename T>
37struct IsContainer<
38 T,
39 std::void_t<decltype(std::declval<T>().begin()), decltype(std::declval<T>().end())>>
40 : std::true_type {};
41
42template <typename T>
43inline constexpr bool isContainer = IsContainer<T>::value;
44
45template <typename T, typename = void>
46struct IsContiguousContainer : std::false_type {};
47
48template <typename T>
49struct IsContiguousContainer<
50 T,
51 std::void_t<
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;
57 // detect vector<bool>::data() void return type
58 static constexpr bool value = std::is_pointer_v<decltype(std::declval<T>().data())>;
59 using type = std::bool_constant<value>;
60};
61
62template <typename T>
63struct IsMutableContainer
64 : std::conjunction<
65 std::is_same<
66 decltype(std::declval<T>().begin()),
67 typename std::remove_reference_t<T>::iterator>,
68 std::is_same<
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>>> {};
74
75} // namespace opcua::detail