Zserio C++17 runtime library  0.5.0
Built for Zserio 2.17.0
GenericAccessor.h
Go to the documentation of this file.
1 #ifndef ZSERIO_GENERIC_ACCESSOR_INC_H
2 #define ZSERIO_GENERIC_ACCESSOR_INC_H
3 
4 #include "zserio/Extended.h"
5 #include "zserio/Optional.h"
6 #include "zserio/Traits.h"
7 
8 namespace zserio
9 {
10 
11 namespace detail
12 {
13 
14 template <typename T, typename = void>
15 struct generic_accessor;
16 
17 template <typename T>
18 struct generic_accessor<T, std::enable_if_t<std::is_enum_v<T>>>
19 {
20  using type = T;
21 };
22 
23 template <typename T>
24 struct generic_accessor<T, std::enable_if_t<is_bitmask_v<T>>>
25 {
26  using type = typename T::Values;
27 };
28 
29 template <typename T, typename U>
30 void setGenericOffset(T& offsetField, U bytesOffset)
31 {
32  offsetField = static_cast<typename T::ValueType>(bytesOffset);
33 }
34 
35 } // namespace detail
36 
37 template <typename T>
38 using generic_accessor_t = typename detail::generic_accessor<T>::type;
39 
40 template <typename T>
41 const T& genericAccessor(const T& value)
42 {
43  return value;
44 }
45 
46 template <typename ALLOC, typename T>
47 const auto& genericAccessor(const BasicOptional<ALLOC, T>& optionalValue)
48 {
49  return optionalValue.value();
50 }
51 
52 template <typename T>
53 const auto& genericAccessor(const Extended<T>& extendedValue)
54 {
55  return genericAccessor(extendedValue.value());
56 }
57 
58 template <typename T>
59 T& genericAccessor(T& value)
60 {
61  return value;
62 }
63 
64 template <typename ALLOC, typename T>
66 {
67  return optionalValue.value();
68 }
69 
70 template <typename T>
71 auto& genericAccessor(Extended<T>& extendedValue)
72 {
73  return genericAccessor(extendedValue.value());
74 }
75 
76 } // namespace zserio
77 
78 #endif // ZSERIO_GENERIC_ACCESSOR_INC_H
constexpr T & value()
Definition: Optional.h:488
constexpr const T & value() const noexcept
Definition: Extended.h:71
Definition: BitBuffer.h:602
const T & genericAccessor(const T &value)
typename detail::generic_accessor< T >::type generic_accessor_t