qxLib
sbo_poly.h
Go to the documentation of this file.
1 /**
2 
3  @file sbo_poly.h
4  @author Khrapov
5  @date 20.12.2025
6  @copyright © Nick Khrapov, 2025. All right reserved.
7 
8 **/
9 #pragma once
10 
11 #include <qx/sbo/sbo_bytes.h>
12 
13 #include <type_traits>
14 
15 namespace qx
16 {
17 
18 template<class T, class base_t>
19 concept sbo_poly_assignable_c = std::is_base_of_v<base_t, T> && std::is_move_constructible_v<T>;
20 
21 /**
22 
23  @class sbo_poly
24  @brief Small Buffer Object for polymorphic classes.
25  @details If the inherited class fits into the specified buffer, it stores it in place;
26  if not, it allocates memory for it.
27  Allows you to increase cache locality when storing in containers.
28  @tparam base_t - base class type, you'll be able to work with each element through its interface
29  @tparam nSBOSize_ - the size of the whole SBO type, including internal data
30  @author Khrapov
31  @date 24.12.2025
32 
33 **/
34 template<class base_t, size_t nSBOSize_>
35 class sbo_poly
36 {
37  struct sbo_poly_traits
38  {
39  using size_type = size_t;
40  static_assert(nSBOSize_ > sizeof(void*));
41  static constexpr size_type nSBOSize = nSBOSize_ - sizeof(void*);
42  static constexpr bool bShrinkToFitWhenSmall = true;
43  };
44 
45 public:
47 
48 public:
49  /**
50  @brief sbo_poly object constructor
51  @tparam derived_t - type inherited from base_t
52  @param object - an object to store
53  **/
54  template<sbo_poly_assignable_c<base_t> derived_t>
55  sbo_poly(derived_t object) noexcept;
56 
57  sbo_poly(sbo_poly&& other) noexcept;
58  ~sbo_poly() noexcept;
59 
60  /**
61  @brief operator=
62  @tparam derived_t - type inherited from base_t
63  @param object - an object to store
64  @retval - this object reference
65  **/
66  template<sbo_poly_assignable_c<base_t> derived_t>
67  sbo_poly& operator=(derived_t object) noexcept;
68 
69  sbo_poly& operator=(sbo_poly&& other) noexcept;
70 
71  /**
72  @brief Assign a new object to this SBO
73  @tparam derived_t - type inherited from base_t
74  @param object - an object to store
75  **/
76  template<sbo_poly_assignable_c<base_t> derived_t>
77  void assign(derived_t object) noexcept;
78 
79 
80  base_t* operator->() noexcept;
81  const base_t* operator->() const noexcept;
82 
83  /**
84  @brief Get object reference. Always valid.
85  @retval - object reference
86  **/
87  base_t& get() noexcept;
88 
89  /**
90  @brief Get object reference. Always valid.
91  @retval - object reference
92  **/
93  const base_t& get() const noexcept;
94 
95 private:
96  sbo_bytes_type m_Data;
97  void (*m_Assigner)(sbo_bytes_type& from, sbo_bytes_type& to) = nullptr;
98 };
99 
100 } // namespace qx
101 
102 #include <qx/sbo/sbo_poly.inl>
Small Buffer Object for polymorphic classes.
Definition: sbo_poly.h:36
base_t & get() noexcept
Get object reference. Always valid.
Definition: sbo_poly.inl:119
sbo_poly(derived_t object) noexcept
sbo_poly object constructor
Definition: sbo_poly.inl:15
sbo_poly & operator=(derived_t object) noexcept
operator=
void assign(derived_t object) noexcept
Assign a new object to this SBO.
Definition: sbo_poly.inl:91