27 std::is_trivially_destructible_v<T>;
41 std::destroy_n(
ptr, n);
46 std::uninitialized_default_construct_n(
ptr, n);
51 std::copy_n(src, n, dst);
56 std::uninitialized_copy_n(src, n, dst);
59template<
typename From,
typename To>
62 std::uninitialized_copy_n(src, n, dst);
67 std::copy_n(std::make_move_iterator(src), n, dst);
72 std::uninitialized_copy_n(std::make_move_iterator(src), n, dst);
89 std::fill_n(dst, n, value);
94 std::uninitialized_fill_n(dst, n, value);
112template<
typename T>
using destruct_ptr = std::unique_ptr<T, DestructValueAtAddress<T>>;
120 struct alignas(Alignment) Sized {
122 std::byte buffer_[Size > 0 ? Size : 1];
125 using BufferType = std::conditional_t<Size == 0, Empty, Sized>;
134 operator const void *()
const
158 static constexpr size_t get_size()
160 if constexpr (Size == 0) {
164 return sizeof(
T) *
size_t(Size);
169 static constexpr size_t get_alignment()
171 if constexpr (Size == 0) {
184 return static_cast<T *
>(buffer_.ptr());
187 operator const T *()
const
189 return static_cast<const T *
>(buffer_.ptr());
194 return *
static_cast<T *
>(buffer_.ptr());
199 return *
static_cast<const T *
>(buffer_.ptr());
204 return static_cast<T *
>(buffer_.ptr());
209 return static_cast<const T *
>(buffer_.ptr());
214 return *
static_cast<T *
>(buffer_.ptr());
219 return *
static_cast<const T *
>(buffer_.ptr());
229template<
size_t ReservedSize = 64,
size_t ReservedAlignment = 64>
233 char reserved_buffer_[(ReservedSize > 0) ? ReservedSize : 1];
241 if (
size <= ReservedSize && alignment <= ReservedAlignment) {
242 buffer_ = reserved_buffer_;
250 if (buffer_ != reserved_buffer_) {
286template<
typename From,
typename To>
288 std::is_pointer_v<From> && std::is_pointer_v<To>;
296template<
typename From,
typename To>
299 std::is_pointer_v<From> && std::is_pointer_v<To> &&
301 std::is_same_v<From, To> ||
303 std::is_same_v<std::remove_pointer_t<From>, std::remove_const_t<std::remove_pointer_t<To>>> ||
305 (!std::is_const_v<std::remove_pointer_t<From>> && std::is_same_v<To, void *>) ||
307 std::is_same_v<To, const void *>);
312template<
typename T,
typename... Args>
321 return (
int64_t(element_size) < 100) ? 4 : 0;
335 Container container_copy{src};
336 dst = std::move(container_copy);
345template<
typename Container>
347 std::is_nothrow_move_constructible_v<Container>)
354 if constexpr (std::is_nothrow_move_constructible_v<Container>) {
355 new (&dst) Container(std::move(src));
359 new (&dst) Container(std::move(src));
374 if (old_value != new_value) {
375 old_value = std::move(new_value);
383namespace blender::detail {
396#define BLI_SCOPED_DEFER_NAME1(a, b) a##b
397#define BLI_SCOPED_DEFER_NAME2(a, b) BLI_SCOPED_DEFER_NAME1(a, b)
398#define BLI_SCOPED_DEFER_NAME(a) BLI_SCOPED_DEFER_NAME2(_scoped_defer_##a##_, __LINE__)
406#define BLI_SCOPED_DEFER(function_to_defer) \
407 auto BLI_SCOPED_DEFER_NAME(func) = (function_to_defer); \
408 blender::detail::ScopedDeferHelper<decltype(BLI_SCOPED_DEFER_NAME(func))> \
409 BLI_SCOPED_DEFER_NAME(helper){std::move(BLI_SCOPED_DEFER_NAME(func))};
#define BLI_NO_UNIQUE_ADDRESS
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
DynamicStackBuffer & operator=(const DynamicStackBuffer &other)=delete
DynamicStackBuffer & operator=(DynamicStackBuffer &&other)=delete
DynamicStackBuffer(const DynamicStackBuffer &other)=delete
DynamicStackBuffer(const int64_t size, const int64_t alignment)
DynamicStackBuffer(DynamicStackBuffer &&other)=delete
const T & operator*() const
void * MEM_mallocN_aligned(size_t len, size_t alignment, const char *str)
void MEM_freeN(void *vmemh)
constexpr bool is_same_any_v
void default_construct_n(T *ptr, int64_t n)
void initialized_relocate_n(T *src, int64_t n, T *dst)
std::unique_ptr< T, DestructValueAtAddress< T > > destruct_ptr
bool assign_if_different(T &old_value, T new_value)
void initialized_fill_n(T *dst, int64_t n, const T &value)
void initialized_move_n(T *src, int64_t n, T *dst)
Container & copy_assign_container(Container &dst, const Container &src)
constexpr bool is_convertible_pointer_v
constexpr bool is_trivially_move_constructible_extended_v
Container & move_assign_container(Container &dst, Container &&src) noexcept(std::is_nothrow_move_constructible_v< Container >)
constexpr int64_t default_inline_buffer_capacity(size_t element_size)
constexpr bool is_trivially_destructible_extended_v
void uninitialized_fill_n(T *dst, int64_t n, const T &value)
void uninitialized_relocate_n(T *src, int64_t n, T *dst)
void initialized_copy_n(const T *src, int64_t n, T *dst)
void uninitialized_convert_n(const From *src, int64_t n, To *dst)
constexpr bool is_trivially_copy_constructible_extended_v
void destruct_n(T *ptr, int64_t n)
constexpr bool is_span_convertible_pointer_v
void uninitialized_copy_n(const T *src, int64_t n, T *dst)
constexpr bool is_trivial_extended_v
void uninitialized_move_n(T *src, int64_t n, T *dst)
DestructValueAtAddress()=default
DestructValueAtAddress(const U &)