13 template<
class base_t,
size_t nSBOSize_>
14 template<sbo_poly_assignable_c<base_t> derived_t>
17 assign(std::move(
object));
20 template<
class base_t,
size_t nSBOSize_>
23 *
this = std::move(other);
26 template<
class base_t,
size_t nSBOSize_>
27 sbo_poly<base_t, nSBOSize_>::~sbo_poly() noexcept
32 template<
class base_t,
size_t nSBOSize_>
33 template<sbo_poly_assignable_c<base_t> derived_t>
36 assign(std::move(
object));
40 template<
class base_t,
size_t nSBOSize_>
43 if (!m_Data.is_small() && !other.m_Data.is_small())
46 std::swap(m_Data, other.m_Data);
54 sbo_bytes<sbo_poly_traits> temp;
56 if (m_Data.is_small() && other.m_Data.is_small())
59 m_Assigner(m_Data, temp);
61 other.m_Assigner(other.m_Data, m_Data);
64 m_Assigner(temp, other.m_Data);
66 else if (m_Data.is_small())
69 m_Assigner(m_Data, temp);
71 other.m_Data = std::move(m_Data);
74 m_Assigner(temp, other.m_Data);
78 other.m_Assigner(other.m_Data, temp);
79 m_Data = std::move(other.m_Data);
80 other.m_Assigner(temp, m_Data);
84 std::swap(m_Assigner, other.m_Assigner);
89 template<
class base_t,
size_t nSBOSize_>
90 template<sbo_poly_assignable_c<base_t> derived_t>
93 if (m_Data.size() > 0)
96 m_Data.resize(
sizeof(derived_t), std::alignment_of_v<derived_t>, sbo_resize_type::common,
false);
97 new (m_Data.data()) derived_t(std::move(
object));
101 to.resize(
sizeof(derived_t), std::alignment_of_v<derived_t>, sbo_resize_type::common,
false);
102 new (to.data()) derived_t(std::move(*
reinterpret_cast<derived_t*
>(from.
data())));
106 template<
class base_t,
size_t nSBOSize_>
112 template<
class base_t,
size_t nSBOSize_>
113 const base_t* sbo_poly<base_t, nSBOSize_>::operator->() const noexcept
118 template<
class base_t,
size_t nSBOSize_>
121 return *
reinterpret_cast<base_t*
>(m_Data.data());
124 template<
class base_t,
size_t nSBOSize_>
std::byte * data() noexcept
Get SBO data: from a buffer or from a heap.
Small Buffer Object for polymorphic classes.
base_t & get() noexcept
Get object reference. Always valid.
sbo_poly(derived_t object) noexcept
sbo_poly object constructor
sbo_poly & operator=(derived_t object) noexcept
operator=
void assign(derived_t object) noexcept
Assign a new object to this SBO.
#define QX_CONST_CAST_THIS()
This macro is made for situations where you have a const method, and you need exactly the same method...