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
34 template<
class base_t,
size_t nSBOSize_>
35 template<sbo_poly_assignable_c<base_t> derived_t>
38 assign(std::move(
object));
42 template<
class base_t,
size_t nSBOSize_>
45 if (!m_Data.is_small() && !other.m_Data.is_small())
48 std::swap(m_Data, other.m_Data);
56 sbo_bytes<sbo_poly_traits> temp;
58 if (m_Data.is_small() && other.m_Data.is_small())
61 m_Assigner(m_Data, temp);
63 other.m_Assigner(other.m_Data, m_Data);
66 m_Assigner(temp, other.m_Data);
68 else if (m_Data.is_small())
71 m_Assigner(m_Data, temp);
73 other.m_Data = std::move(m_Data);
76 m_Assigner(temp, other.m_Data);
80 other.m_Assigner(other.m_Data, temp);
81 m_Data = std::move(other.m_Data);
82 other.m_Assigner(temp, m_Data);
86 std::swap(m_Assigner, other.m_Assigner);
87 std::swap(m_Deleter, other.m_Deleter);
92 template<
class base_t,
size_t nSBOSize_>
93 template<sbo_poly_assignable_c<base_t> derived_t>
96 if (m_Data.size() > 0)
99 m_Data.resize(
sizeof(derived_t), std::alignment_of_v<derived_t>, sbo_resize_type::common,
false);
100 new (m_Data.data()) derived_t(std::move(
object));
104 to.resize(
sizeof(derived_t), std::alignment_of_v<derived_t>, sbo_resize_type::common,
false);
105 new (to.data()) derived_t(std::move(*
reinterpret_cast<derived_t*
>(from.
data())));
110 reinterpret_cast<derived_t*
>(
object.data())->~derived_t();
114 template<
class base_t,
size_t nSBOSize_>
120 template<
class base_t,
size_t nSBOSize_>
121 const base_t* sbo_poly<base_t, nSBOSize_>::operator->() const noexcept
126 template<
class base_t,
size_t nSBOSize_>
129 return *
reinterpret_cast<base_t*
>(m_Data.data());
132 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...