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_>
60 struct sbo_poly_traits
62 using size_type = size_t;
63 static constexpr size_type nSBOSize = nSBOSize_ - 2 *
sizeof(
void*);
64 static constexpr
bool bShrinkToFitWhenSmall =
true;
65 static constexpr
bool bPreserveContents =
false;
66 static constexpr size_type growth_strategy(size_type nOldCapacity) noexcept
74 using base_type = base_t;
82 template<sbo_poly_assignable_c<base_t> derived_t>
94 template<sbo_poly_assignable_c<base_t> derived_t>
95 sbo_poly& operator=(derived_t
object) noexcept;
104 template<sbo_poly_assignable_c<base_t> derived_t>
105 void assign(derived_t
object) noexcept;
108 base_t* operator->() noexcept;
109 const base_t* operator->()
const noexcept;
115 base_t& get() noexcept;
121 const base_t& get()
const noexcept;
124 sbo_bytes_type m_Data;
125 void (*m_Assigner)(sbo_bytes_type& from, sbo_bytes_type& to) =
nullptr;
126 void (*m_Deleter)(sbo_bytes_type& object) =
nullptr;
A type erased small buffer object that works with raw data.
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.