13 template<
class base_t,
size_t nSBOSize_>
14 requires(nSBOSize_ > 2 *
sizeof(
void*))
15 template<sbo_poly_assignable_c<base_t> derived_t>
18 assign(std::move(
object));
21 template<
class base_t,
size_t nSBOSize_>
22 requires(nSBOSize_ > 2 *
sizeof(
void*))
25 *
this = std::move(other);
28 template<
class base_t,
size_t nSBOSize_>
29 requires(nSBOSize_ > 2 *
sizeof(
void*))
37 template<
class base_t,
size_t nSBOSize_>
38 requires(nSBOSize_ > 2 *
sizeof(
void*))
39 template<sbo_poly_assignable_c<base_t> derived_t>
42 assign(std::move(
object));
46 template<
class base_t,
size_t nSBOSize_>
47 requires(nSBOSize_ > 2 *
sizeof(
void*))
50 if (!m_Data.is_small() && !other.m_Data.is_small())
53 std::swap(m_Data, other.m_Data);
61 sbo_bytes<sbo_poly_traits> temp;
63 if (m_Data.is_small() && other.m_Data.is_small())
66 m_Assigner(m_Data, temp);
68 other.m_Assigner(other.m_Data, m_Data);
71 m_Assigner(temp, other.m_Data);
73 else if (m_Data.is_small())
76 m_Assigner(m_Data, temp);
78 other.m_Data = std::move(m_Data);
81 m_Assigner(temp, other.m_Data);
85 other.m_Assigner(other.m_Data, temp);
86 m_Data = std::move(other.m_Data);
87 other.m_Assigner(temp, m_Data);
91 std::swap(m_Assigner, other.m_Assigner);
92 std::swap(m_Deleter, other.m_Deleter);
97 template<
class base_t,
size_t nSBOSize_>
98 requires(nSBOSize_ > 2 *
sizeof(
void*))
99 template<sbo_poly_assignable_c<base_t> derived_t>
102 if (m_Data.size() > 0)
105 m_Data.resize(
sizeof(derived_t));
106 new (m_Data.data()) derived_t(std::move(
object));
108 m_Assigner = [](sbo_bytes_type& from, sbo_bytes_type& to)
110 to.resize(
sizeof(derived_t));
111 new (to.data()) derived_t(std::move(*
reinterpret_cast<derived_t*
>(from.data())));
114 m_Deleter = [](sbo_bytes_type& object)
116 reinterpret_cast<derived_t*
>(
object.data())->~derived_t();
120 template<
class base_t,
size_t nSBOSize_>
121 requires(nSBOSize_ > 2 *
sizeof(
void*))
127 template<
class base_t,
size_t nSBOSize_>
128 requires(nSBOSize_ > 2 *
sizeof(
void*))
134 template<
class base_t,
size_t nSBOSize_>
135 requires(nSBOSize_ > 2 *
sizeof(
void*))
138 return *
reinterpret_cast<base_t*
>(m_Data.data());
141 template<
class base_t,
size_t nSBOSize_>
142 requires(nSBOSize_ > 2 *
sizeof(
void*))
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...