13 template<
class base_t,
size_t nSBOSize_>
15 template<sbo_poly_assignable_c<base_t> derived_t>
18 assign(std::forward<derived_t>(
object));
21 template<
class base_t,
size_t nSBOSize_>
25 *
this = std::move(other);
28 template<
class base_t,
size_t nSBOSize_>
34 m_Operations->Destroy(m_Data);
37 template<
class base_t,
size_t nSBOSize_>
39 template<sbo_poly_assignable_c<base_t> derived_t>
42 assign(std::forward<derived_t>(
object));
46 template<
class base_t,
size_t nSBOSize_>
56 m_Operations->Destroy(m_Data);
59 m_Operations =
nullptr;
63 if (!other.m_Operations)
66 if (other.m_Data.is_small())
68 other.m_Operations->Move(other.m_Data, m_Data);
69 other.m_Operations->Destroy(other.m_Data);
74 m_Data = std::move(other.m_Data);
77 m_Operations = other.m_Operations;
78 other.m_Operations =
nullptr;
83 template<
class base_t,
size_t nSBOSize_>
85 template<sbo_poly_assignable_c<base_t> derived_t>
88 using stored_t = std::remove_cvref_t<derived_t>;
91 m_Operations->Destroy(m_Data);
93 m_Operations =
nullptr;
95 if (!m_Data.resize(get_storage_size<stored_t>()))
96 throw std::bad_alloc();
98 new (get_object<stored_t>(m_Data)) stored_t(std::forward<derived_t>(
object));
99 m_Operations = &get_operations<stored_t>();
102 template<
class base_t,
size_t nSBOSize_>
104 template<sbo_poly_assignable_c<base_t> derived_t>
107 if constexpr (
alignof(derived_t) <=
alignof(sbo_bytes_type))
108 return sizeof(derived_t);
110 return sizeof(derived_t) +
alignof(derived_t) - 1;
113 template<
class base_t,
size_t nSBOSize_>
115 template<sbo_poly_assignable_c<base_t> derived_t>
118 void* pObject = data.data();
119 size_t nSpace = data.size();
120 return static_cast<derived_t*
>(std::align(
alignof(derived_t),
sizeof(derived_t), pObject, nSpace));
123 template<
class base_t,
size_t nSBOSize_>
125 template<sbo_poly_assignable_c<base_t> derived_t>
128 static constexpr operations table { [](sbo_bytes_type& object) noexcept -> base_t*
130 return static_cast<base_t*
>(get_object<derived_t>(
object));
132 [](sbo_bytes_type& from, sbo_bytes_type& to) noexcept
134 if (!to.resize(get_storage_size<derived_t>()))
137 new (get_object<derived_t>(to))
138 derived_t(std::move(*get_object<derived_t>(from)));
140 [](sbo_bytes_type& object) noexcept
142 get_object<derived_t>(
object)->~derived_t();
148 template<
class base_t,
size_t nSBOSize_>
155 template<
class base_t,
size_t nSBOSize_>
162 template<
class base_t,
size_t nSBOSize_>
166 return *m_Operations->Get(m_Data);
169 template<
class base_t,
size_t nSBOSize_>
Small Buffer Object for polymorphic classes.
requires(same_variadic_args_v< args_t... >) const expr auto coalesce(args_t &&... args)
Coalesce function, C# a ?? b analogue.
#define QX_CONST_CAST_THIS()
This macro is made for situations where you have a const method, and you need exactly the same method...