CppSerdes  1.0
A serialization/deserialization library designed with embedded systems in mind
bitcpy_sized_pointer.h
Go to the documentation of this file.
1 #ifndef _BITCPY_SIZED_POINTER_H_
8 #define _BITCPY_SIZED_POINTER_H_
9 
10 #include <stdint.h>
11 #include <type_traits>
12 
14 namespace serdes
15 {
18  template <typename T_array>
20  {
22  T_array *const value;
23 
25  const size_t size;
26 
30  sized_pointer(T_array *const v, const size_t N) noexcept : value{v}, size{N * static_cast<size_t>(v != nullptr)} {}
31 
35  template <size_t N>
36  sized_pointer(T_array (&v)[N]) noexcept : value{v}, size{N} {}
37 
39  size_t bit_capacity() const noexcept
40  {
41  return size * sizeof(T_array) * 8u;
42  }
43  };
44 
47  template <>
48  struct sized_pointer<void>
49  {
51  void *const value;
52 
54  const size_t size;
55 
57  const uint_fast8_t element_size;
58 
63  template <typename T_array>
64  sized_pointer(const sized_pointer<T_array> &other) noexcept
65  : sized_pointer(other.value, other.size) {}
66 
70  sized_pointer(const sized_pointer<void> &other) noexcept
71  : value{other.value},
72  size{other.size},
73  element_size{other.element_size} {}
74 
79  template <typename T>
80  sized_pointer(T *const v, const size_t N) noexcept
81  : value{const_cast<void *const>(reinterpret_cast<volatile const void *const>(v))},
82  size{N * static_cast<size_t>(v != nullptr)},
83  element_size{sizeof(T)} {}
84 
89  template <typename T, size_t N>
90  sized_pointer(T (&v)[N]) noexcept
91  : value{const_cast<void *const>(reinterpret_cast<volatile const void *const>(v))},
92  size{N},
93  element_size{sizeof(T)}
94  {
95  }
96 
98  size_t bit_capacity() const noexcept
99  {
100  return size * element_size * 8u;
101  }
102  };
103 
104  // implimentation details
105  namespace detail
106  {
107  template <typename>
108  struct is_sized_pointer : std::false_type
109  {
110  };
111 
112  template <typename T>
113  struct is_sized_pointer<sized_pointer<T>> : std::true_type
114  {
115  };
116  } // namespace detail
117 } // namespace serdes
118 
119 #endif // _BITCPY_SIZED_POINTER_H_
serdes::sized_pointer::sized_pointer
sized_pointer(T_array *const v, const size_t N) noexcept
Construct a new sized pointer object from a raw pointer and a passed size.
Definition: bitcpy_sized_pointer.h:30
serdes::sized_pointer< void >
Holds a pointer to a void array (with type information stored as a runtime element size paramenter) w...
Definition: bitcpy_sized_pointer.h:48
serdes::sized_pointer< void >::value
void *const value
the underlying pointer reinterpreted as a void* type
Definition: bitcpy_sized_pointer.h:51
serdes::sized_pointer
Holds a pointer to an array (with its type information) with a constant size.
Definition: bitcpy_sized_pointer.h:19
serdes::sized_pointer< void >::size
const size_t size
size of the array (number of elements in the array)
Definition: bitcpy_sized_pointer.h:54
serdes::sized_pointer< void >::sized_pointer
sized_pointer(T(&v)[N]) noexcept
Construct a new sized pointer object from the array itself.
Definition: bitcpy_sized_pointer.h:90
serdes::sized_pointer::size
const size_t size
size of the array
Definition: bitcpy_sized_pointer.h:25
serdes::sized_pointer::bit_capacity
size_t bit_capacity() const noexcept
returns the number of bits in the array
Definition: bitcpy_sized_pointer.h:39
serdes::sized_pointer::value
T_array *const value
the underlying pointer
Definition: bitcpy_sized_pointer.h:22
serdes::sized_pointer< void >::bit_capacity
size_t bit_capacity() const noexcept
returns the number of bits in the array
Definition: bitcpy_sized_pointer.h:98
serdes::sized_pointer< void >::sized_pointer
sized_pointer(const sized_pointer< void > &other) noexcept
Construct a new sized pointer object from a void typed sized pointer.
Definition: bitcpy_sized_pointer.h:70
serdes::sized_pointer< void >::sized_pointer
sized_pointer(const sized_pointer< T_array > &other) noexcept
Construct a new sized pointer object from another sized pointer object.
Definition: bitcpy_sized_pointer.h:64
serdes
CppSerdes library namespace.
Definition: bitcpy_common.h:68
serdes::sized_pointer< void >::sized_pointer
sized_pointer(T *const v, const size_t N) noexcept
Construct a new sized pointer object from a raw pointer and a passed size.
Definition: bitcpy_sized_pointer.h:80
serdes::sized_pointer::sized_pointer
sized_pointer(T_array(&v)[N]) noexcept
Construct a new sized pointer object from the array itself.
Definition: bitcpy_sized_pointer.h:36
serdes::sized_pointer< void >::element_size
const uint_fast8_t element_size
Number of bytes per element of the original array type, same as sizeof(T_original)
Definition: bitcpy_sized_pointer.h:57