13 #include <type_traits>
19 template<
class T,
class base_t>
20 concept sbo_poly_assignable_c =
21 std::is_base_of_v<base_t, T> && std::is_move_constructible_v<T> && std::is_destructible_v<T>;
24 template<
class sbo_poly_t, sbo_poly_assignable_c<
typename sbo_poly_t::base_type> derived_t>
27 static constexpr
bool value =
sizeof(derived_t) <= sbo_poly_t::sbo_bytes_type::nBufferSize;
30 template<
class sbo_poly_t, sbo_poly_assignable_c<
typename sbo_poly_t::base_type> derived_t>
34 template<
class sbo_poly_t,
class... args_t>
37 static constexpr
bool value = ((sbo_poly_fittable_type_v<sbo_poly_t, args_t>) && ...);
40 template<
class sbo_poly_t,
class... args_t>
56 template<
class base_t,
size_t nSBOSize_>
59 struct sbo_poly_traits
61 using size_type = size_t;
62 static_assert(nSBOSize_ >
sizeof(
void*));
63 static constexpr size_type nSBOSize = nSBOSize_ - 2 *
sizeof(
void*);
64 static constexpr
bool bShrinkToFitWhenSmall =
true;
69 using base_type = base_t;
77 template<sbo_poly_assignable_c<base_t> derived_t>
89 template<sbo_poly_assignable_c<base_t> derived_t>
99 template<sbo_poly_assignable_c<base_t> derived_t>
100 void assign(derived_t
object) noexcept;
103 base_t* operator->() noexcept;
104 const base_t* operator->() const noexcept;
110 base_t&
get() noexcept;
116 const base_t&
get() const noexcept;
126 #include <qx/sbo/sbo_poly.inl>
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.