emlabcpp
modern opinionated embedded C++ library
derived_storage.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include "./pmr/util.h"
27 
28 #include <concepts>
29 #include <memory>
30 
31 namespace emlabcpp
32 {
33 
34 template < typename T, std::size_t N >
36 {
37 public:
38  static_assert(
39  std::has_virtual_destructor_v< T >,
40  "Type stored in derived_storage has to have a virtual destructor" );
41 
43 
44  using base_type = T;
45 
47  : ptr_( nullptr )
48  {
49  }
50 
51  template < std::derived_from< T > U >
52  derived_storage( U&& item )
53  : ptr_( &storage_ )
54  {
55  static_assert( is_storable_with_align< U >( N ) );
56  ptr_ = align( ptr_, alignof( U ) );
57  std::construct_at( ptr_, std::forward< U >( item ) );
58  }
59 
60  derived_storage( derived_storage const& ) = delete;
62 
65 
66  T& operator*()
67  {
68  return *ptr_;
69  }
70 
71  T const& operator*() const
72  {
73  return *ptr_;
74  }
75 
77  {
78  return ptr_;
79  }
80 
81  T const* operator->() const
82  {
83  return ptr_;
84  }
85 
86  operator bool() const
87  {
88  return ptr_ != nullptr;
89  }
90 
91  T& get()
92  {
93  return *ptr_;
94  }
95 
96  T const& get() const
97  {
98  return *ptr_;
99  }
100 
102  {
103  std::destroy_at( ptr_ );
104  }
105 
106 private:
107  T* ptr_;
108  storage_type storage_;
109 };
110 
111 } // namespace emlabcpp
Definition: derived_storage.h:36
T * operator->()
Definition: derived_storage.h:76
derived_storage()
Definition: derived_storage.h:46
~derived_storage()
Definition: derived_storage.h:101
T & operator*()
Definition: derived_storage.h:66
T base_type
Definition: derived_storage.h:44
std::byte[N] storage_type
Definition: derived_storage.h:42
T const * operator->() const
Definition: derived_storage.h:81
derived_storage & operator=(derived_storage &&)=delete
T const & operator*() const
Definition: derived_storage.h:71
derived_storage(derived_storage const &)=delete
derived_storage(derived_storage &&)=delete
T & get()
Definition: derived_storage.h:91
derived_storage(U &&item)
Definition: derived_storage.h:52
T const & get() const
Definition: derived_storage.h:96
derived_storage & operator=(derived_storage const &)=delete
void * align(void *const ptr, std::size_t const alignment)
TODO: this needs tests.
Definition: util.h:41
MIT License.
Definition: impl.h:31
N
Definition: static_storage.h:97
physical_quantity< 0, 0, 0, 0, 0, 0, 0, 0, 1 > byte
Definition: physical_quantity.h:118