open62541pp 0.18.0
C++ wrapper of open62541
Loading...
Searching...
No Matches
traits.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <iterator> // data, iterator_traits, size
4#include <type_traits>
5
6namespace opcua::detail {
7
8template <typename... Ts>
9struct Overload : Ts... {
10 using Ts::operator()...;
11};
12
13template <typename... Ts>
14Overload(Ts...) -> Overload<Ts...>;
15
16template <typename...>
17struct AlwaysFalse : std::false_type {};
18
19template <typename T, typename... Ts>
20using IsOneOf = std::disjunction<std::is_same<T, Ts>...>;
21
22/// Derive member type from member pointer
23template <typename T>
24struct MemberType;
25
26template <typename C, typename T>
27struct MemberType<T C::*> {
28 using type = T;
29};
30
31template <typename T>
32using MemberTypeT = typename MemberType<T>::type;
33
34template <typename T>
35using RangeIteratorT = decltype(std::begin(std::declval<T&>()));
36
37template <typename T>
38using RangeValueT = typename std::iterator_traits<RangeIteratorT<T>>::value_type;
39
40template <typename, typename = void>
41struct HasBegin : std::false_type {};
42
43template <typename T>
44struct HasBegin<T, std::void_t<decltype(std::begin(std::declval<T&>()))>> : std::true_type {};
45
46template <typename, typename = void>
47struct HasEnd : std::false_type {};
48
49template <typename T>
50struct HasEnd<T, std::void_t<decltype(std::end(std::declval<T&>()))>> : std::true_type {};
51
52template <typename, typename = void>
53struct HasData : std::false_type {};
54
55template <typename T>
56struct HasData<T, std::void_t<decltype(std::data(std::declval<T&>()))>> : std::true_type {};
57
58template <typename, typename = void>
59struct HasDataPointer : std::false_type {};
60
61template <typename T>
62struct HasDataPointer<T, std::void_t<decltype(std::data(std::declval<T&>()))>>
63 : std::is_pointer<decltype(std::data(std::declval<T&>()))> {};
64
65template <typename, typename = void>
66struct HasSize : std::false_type {};
67
68template <typename T>
69struct HasSize<T, std::void_t<decltype(std::size(std::declval<T&>()))>> : std::true_type {};
70
71template <typename T>
72struct IsRange : std::conjunction<HasBegin<T>, HasEnd<T>> {};
73
74template <typename T>
75struct IsContiguousRange : std::conjunction<IsRange<T>, HasDataPointer<T>, HasSize<T>> {};
76
77} // namespace opcua::detail