16 #include <type_traits>
23 template<
class T,
class base_t>
24 concept sbo_poly_assignable_c =
25 std::is_base_of_v<base_t, std::remove_cvref_t<T>> && std::is_nothrow_move_constructible_v<std::remove_cvref_t<T>>
26 && std::is_nothrow_destructible_v<std::remove_cvref_t<T>> && std::is_constructible_v<std::remove_cvref_t<T>, T&&>;
29 template<
class sbo_poly_t, sbo_poly_assignable_c<
typename sbo_poly_t::base_type> derived_t>
32 static constexpr
size_t nAlignmentPadding =
33 alignof(derived_t) <=
alignof(
typename sbo_poly_t::sbo_bytes_type) ? 0 :
alignof(derived_t) - 1;
34 static constexpr
bool value =
sizeof(derived_t) + nAlignmentPadding <= sbo_poly_t::sbo_bytes_type::nBufferSize;
37 template<
class sbo_poly_t, sbo_poly_assignable_c<
typename sbo_poly_t::base_type> derived_t>
41 template<
class sbo_poly_t,
class... args_t>
44 static constexpr
bool value = ((sbo_poly_fittable_type_v<sbo_poly_t, args_t>) && ...);
47 template<
class sbo_poly_t,
class... args_t>
63 template<
class base_t,
size_t nSBOSize_>
67 struct sbo_poly_traits
69 using size_type = size_t;
70 static constexpr size_type nSBOSize = nSBOSize_ -
sizeof(
void*);
71 static constexpr
bool bShrinkToFitWhenSmall =
true;
72 static constexpr
bool bPreserveContents =
false;
73 static constexpr size_type growth_strategy(size_type nOldCapacity) noexcept
81 using base_type = base_t;
86 base_t* (*Get)(sbo_bytes_type& object) noexcept;
87 void (*Move)(sbo_bytes_type& from, sbo_bytes_type& to) noexcept;
88 void (*Destroy)(sbo_bytes_type& object) noexcept;
97 template<sbo_poly_assignable_c<base_t> derived_t>
109 template<sbo_poly_assignable_c<base_t> derived_t>
110 sbo_poly& operator=(derived_t&&
object);
119 template<sbo_poly_assignable_c<base_t> derived_t>
120 void assign(derived_t&&
object);
123 base_t* operator->() noexcept;
124 const base_t* operator->()
const noexcept;
130 base_t& get() noexcept;
136 const base_t& get()
const noexcept;
144 template<sbo_poly_assignable_c<base_t> derived_t>
145 static const operations& get_operations() noexcept;
152 template<sbo_poly_assignable_c<base_t> derived_t>
153 static constexpr
size_t get_storage_size() noexcept;
161 template<sbo_poly_assignable_c<base_t> derived_t>
162 static derived_t* get_object(sbo_bytes_type& data) noexcept;
165 sbo_bytes_type m_Data;
166 const operations* m_Operations =
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.