48 enum class Type : uint8_t {
115 if constexpr (std::is_trivially_copyable_v<T>) {
119 if (dst_is_uninitialized) {
135 const bool dst_is_uninitialized)
const
137 if constexpr (std::is_trivially_copyable_v<T>) {
141 if (dst_is_uninitialized) {
181 src.
data(), this->size_,
const_cast<T *
>(
static_cast<const T *
>(info.
data)));
186 this->
set(
i, src[
i]);
224 data_[index] = value;
234 if constexpr (std::is_trivially_copyable_v<T>) {
238 if (dst_is_uninitialized) {
249 const bool dst_is_uninitialized)
const override
251 if constexpr (std::is_trivially_copyable_v<T>) {
256 if (dst_is_uninitialized) {
298template<
typename Container,
typename T =
typename Container::value_type>
301 Container container_;
307 this->
data_ =
const_cast<T *
>(container_.data());
339 if constexpr (std::is_trivially_copyable_v<T>) {
340 mask.foreach_index([&](
const int64_t i) { dst[
i] = value_; });
343 if (dst_is_uninitialized) {
344 mask.foreach_index([&](
const int64_t i) {
new (dst +
i)
T(value_); });
347 mask.foreach_index([&](
const int64_t i) { dst[
i] = value_; });
354 const bool dst_is_uninitialized)
const override
356 if constexpr (std::is_trivially_copyable_v<T>) {
360 if (dst_is_uninitialized) {
388 T get(
const int64_t index)
const override
390 return get_func_(index);
393 void materialize(
const IndexMask &
mask,
T *dst,
const bool dst_is_uninitialized)
const override
395 if constexpr (std::is_trivially_copyable_v<T>) {
396 mask.foreach_index([&](
const int64_t i) { dst[
i] = get_func_(
i); });
399 if (dst_is_uninitialized) {
400 mask.foreach_index([&](
const int64_t i) {
new (dst +
i)
T(get_func_(
i)); });
403 mask.foreach_index([&](
const int64_t i) { dst[
i] = get_func_(
i); });
408 void materialize_compressed(
const IndexMask &
mask,
410 const bool dst_is_uninitialized)
const override
412 if constexpr (std::is_trivially_copyable_v<T>) {
416 if (dst_is_uninitialized) {
430template<
typename StructT,
432 ElemT (*GetFunc)(
const StructT &),
433 void (*SetFunc)(StructT &, ElemT) =
nullptr>
444 template<
typename OtherStructT,
446 OtherElemT (*OtherGetFunc)(
const OtherStructT &),
447 void (*OtherSetFunc)(OtherStructT &, OtherElemT)>
451 ElemT get(
const int64_t index)
const override
453 return GetFunc(data_[index]);
456 void set(
const int64_t index, ElemT value)
override
458 SetFunc(data_[index], std::move(value));
463 const bool dst_is_uninitialized)
const override
465 if constexpr (std::is_trivially_copyable_v<ElemT>) {
469 if (dst_is_uninitialized) {
471 [&](
const int64_t i) {
new (dst +
i) ElemT(GetFunc(data_[
i])); });
475 [&](
const int64_t i) { dst[
i] = GetFunc(data_[
i]); });
482 const bool dst_is_uninitialized)
const override
484 if constexpr (std::is_trivially_copyable_v<ElemT>) {
489 if (dst_is_uninitialized) {
501template<
typename StructT,
503 ElemT (*GetFunc)(
const StructT &),
504 void (*SetFunc)(StructT &, ElemT)>
524 std::is_base_of_v<VArrayImpl<T>, StorageT> ||
529 if constexpr (std::is_base_of_v<VArrayImpl<T>, StorageT>) {
530 return {[](
const void *buffer) {
531 return static_cast<const VArrayImpl<T> *
>((
const StorageT *)buffer);
534 else if constexpr (std::is_same_v<StorageT, const VArrayImpl<T> *>) {
535 return {[](
const void *buffer) {
return *(
const StorageT *)buffer; }};
537 else if constexpr (std::is_same_v<StorageT, std::shared_ptr<const VArrayImpl<T>>>) {
538 return {[](
const void *buffer) {
return ((
const StorageT *)buffer)->get(); }};
592 other.storage_.reset();
593 other.impl_ =
nullptr;
618 template<
typename ImplT,
typename... Args>
void emplace(Args &&...args)
621 static_assert(std::is_base_of_v<VArrayImpl<T>, ImplT>);
622 if constexpr (std::is_copy_constructible_v<ImplT> && Storage::template is_inline_v<ImplT>) {
630 std::shared_ptr<const VArrayImpl<T>>
ptr = std::make_shared<ImplT>(
631 std::forward<Args>(args)...);
640 if (
this == &other) {
650 if (
this == &other) {
653 storage_ = std::move(other.storage_);
655 other.storage_.reset();
656 other.impl_ =
nullptr;
671 operator bool()
const
673 return impl_ !=
nullptr;
686 return impl_->get(index);
695 return (*
this)[index];
704 if (
impl_ ==
nullptr) {
707 return impl_->size();
721 return (*
this)[this->
size() - 1 - n];
727 return this->
size() == 0;
738 return impl_->common_info();
757 return Span<T>(
static_cast<const T *
>(info.
data), this->size());
776 return *
static_cast<const T *
>(info.
data);
788 return *
static_cast<const T *
>(info.
data);
829 return impl_->try_assign_GVArray(varray);
838template<
typename T>
class VMutableArray;
883 template<
typename ImplT,
typename... Args>
static VArray from(Args &&...args)
885 static_assert(std::is_base_of_v<VArrayImpl<T>, ImplT>);
930 template<
typename StructT, T (*GetFunc)(const StructT &)>
983 static_assert(std::is_base_of_v<VMutableArrayImpl<T>, ImplT>);
1001 template<
typename StructT, T (*GetFunc)(const StructT &),
void (*SetFunc)(StructT &, T)>
1063 this->get_impl()->set(index, std::move(value));
1072 this->get_impl()->set_all(src);
1078 return this->get_impl()->try_assign_GVMutableArray(varray);
1123 this->
size_ = varray_.size();
1126 this->data_ = static_cast<const T *>(info.data);
1129 owned_data_.~Array();
1130 new (&owned_data_) Array<T>(varray_.size(), NoInitialization{});
1131 varray_.materialize_to_uninitialized(owned_data_);
1132 this->data_ = owned_data_.
data();
1137 : varray_(std::move(other.varray_)), owned_data_(std::move(other.owned_data_))
1142 this->
size_ = varray_.size();
1145 this->data_ = static_cast<const T *>(info.data);
1148 this->data_ = owned_data_.data();
1150 other.data_ =
nullptr;
1156 if (
this == &other) {
1159 std::destroy_at(
this);
1166void print_mutable_varray_span_warning();
1180 bool save_has_been_called_ =
false;
1181 bool show_not_saved_warning_ =
true;
1195 this->
size_ = varray_.size();
1198 this->data_ = const_cast<T *>(static_cast<const T *>(info.data));
1201 if (copy_values_to_span) {
1202 owned_data_.~Array();
1203 new (&owned_data_) Array<T>(varray_.size(), NoInitialization{});
1204 varray_.materialize_to_uninitialized(owned_data_);
1207 owned_data_.reinitialize(varray_.size());
1209 this->data_ = owned_data_.
data();
1214 : varray_(std::move(other.varray_)),
1215 owned_data_(std::move(other.owned_data_)),
1216 show_not_saved_warning_(other.show_not_saved_warning_)
1222 this->
size_ = varray_.size();
1225 this->data_ = static_cast<T *>(const_cast<void *>(info.data));
1228 this->data_ = owned_data_.data();
1230 other.data_ =
nullptr;
1237 if (show_not_saved_warning_) {
1238 if (!save_has_been_called_) {
1247 if (
this == &other) {
1250 std::destroy_at(
this);
1263 save_has_been_called_ =
true;
1264 if (this->data_ != owned_data_.data()) {
1267 varray_.set_all(owned_data_);
1272 show_not_saved_warning_ =
false;
1321 if constexpr (UseSingle) {
1326 if constexpr (UseSpan) {
1343template<
typename T,
typename Func>
1361template<
typename T1,
typename T2,
typename Func>
#define BLI_assert_unreachable()
#define UNUSED_VARS_NDEBUG(...)
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
constexpr MutableSpan()=default
constexpr T * data() const
MutableVArraySpan()=default
const VMutableArray< T > & varray() const
void disable_not_applied_warning()
MutableVArraySpan & operator=(MutableVArraySpan &&other)
MutableVArraySpan(MutableVArraySpan &&other)
MutableVArraySpan(VMutableArray< T > varray, const bool copy_values_to_span=true)
SingleAsSpan(const VArray< T > &varray)
const T & operator[](const int64_t index) const
SingleAsSpan(T value, int64_t size)
constexpr const T * data() const
constexpr int64_t size() const
std::optional< T > get_if_single() const
IndexRange index_range() const
VArrayCommon(std::shared_ptr< const VArrayImpl< T > > impl)
void materialize(MutableSpan< T > r_span) const
T operator[](const int64_t index) const
T last(const int64_t n=0) const
VArrayCommon(const VArrayImpl< T > *impl)
void copy_from(const VArrayCommon &other)
void materialize_compressed_to_uninitialized(const IndexMask &mask, MutableSpan< T > r_span) const
VArrayCommon(const VArrayCommon &other)
const VArrayImpl< T > * impl_from_storage() const
T get_internal_single() const
const VArrayImpl< T > * impl_
void materialize(const IndexMask &mask, MutableSpan< T > r_span) const
VArrayCommon(VArrayCommon &&other) noexcept
void move_from(VArrayCommon &&other) noexcept
T get(const int64_t index) const
void materialize_to_uninitialized(const IndexMask &mask, MutableSpan< T > r_span) const
const VArrayImpl< T > * get_implementation() const
bool try_assign_GVArray(GVArray &varray) const
void materialize_to_uninitialized(MutableSpan< T > r_span) const
void materialize_compressed(const IndexMask &mask, MutableSpan< T > r_span) const
CommonVArrayInfo common_info() const
Span< T > get_internal_span() const
void emplace(Args &&...args)
Any< blender::detail::VArrayAnyExtraInfo< T >, 24, 8 > Storage
VArrayImpl_For_ArrayContainer(Container container)
friend class VArrayImpl_For_DerivedSpan
VArrayImpl_For_DerivedSpan(const MutableSpan< StructT > data)
VArrayImpl_For_Func(const int64_t size, GetFunc get_func)
void materialize_compressed(const IndexMask &mask, T *dst, const bool dst_is_uninitialized) const override
VArrayImpl_For_Single(T value, const int64_t size)
void materialize(const IndexMask &mask, T *dst, const bool dst_is_uninitialized) const override
CommonVArrayInfo common_info() const override
T get(const int64_t) const override
VArrayImpl_For_Span_final(const Span< T > data)
CommonVArrayInfo common_info() const override
void set(const int64_t index, T value) final
VArrayImpl_For_Span(const int64_t size)
void materialize(const IndexMask &mask, T *dst, const bool dst_is_uninitialized) const override
T get(const int64_t index) const final
VArrayImpl_For_Span(const MutableSpan< T > data)
void materialize_compressed(const IndexMask &mask, T *dst, const bool dst_is_uninitialized) const override
virtual bool try_assign_GVArray(GVArray &) const
virtual void materialize(const IndexMask &mask, T *dst, const bool dst_is_uninitialized) const
virtual CommonVArrayInfo common_info() const
virtual void materialize_compressed(const IndexMask &mask, T *dst, const bool dst_is_uninitialized) const
virtual T get(int64_t index) const =0
VArrayImpl(const int64_t size)
virtual ~VArrayImpl()=default
VArrayRef(const VArray< T > &ref)
T operator[](const int64_t index) const
VArraySpan(VArray< T > &&varray)
VArraySpan(VArraySpan &&other)
VArraySpan(const VArray< T > &varray)
VArraySpan & operator=(VArraySpan &&other)
static VArray from_derived_span(Span< StructT > values)
VArray(const VArrayImpl< T > *impl)
VArray(const VArray &other)=default
static VArray from(Args &&...args)
VArray(varray_tag::single, T value, const int64_t size)
static VArray from_std_func(const int64_t size, std::function< T(int64_t index)> get_func)
VArray(VArray &&other) noexcept=default
static VArray from_single(T value, const int64_t size)
VArray & operator=(const VArray &other)
static VArray from_func(const int64_t size, GetFunc get_func)
VArray(varray_tag::span, Span< T > span)
VArray(std::shared_ptr< const VArrayImpl< T > > impl)
static VArray from_span(Span< T > values)
static VArray from_container(ContainerT container)
VArray & operator=(VArray &&other) noexcept
virtual void set(int64_t index, T value)=0
virtual bool try_assign_GVMutableArray(GVMutableArray &) const
virtual void set_all(Span< T > src)
static VMutableArray from_derived_span(MutableSpan< StructT > values)
void set(const int64_t index, T value)
VMutableArray(std::shared_ptr< const VMutableArrayImpl< T > > impl)
static VMutableArray from_container(ContainerT container)
VMutableArray & operator=(const VMutableArray &other)
static VMutableArray from(Args &&...args)
bool try_assign_GVMutableArray(GVMutableArray &varray) const
VMutableArray & operator=(VMutableArray &&other) noexcept
VMutableArray(VMutableArray &&other) noexcept=default
VMutableArray(const VMutableArray &other)=default
MutableSpan< T > get_internal_span() const
VMutableArray(const VMutableArrayImpl< T > *impl)
static VMutableArray from_span(MutableSpan< T > values)
void set_all(Span< T > src)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
void print_mutable_varray_span_warning()
constexpr bool is_same_any_v
void devirtualize_varray(const VArray< T > &varray, const Func &func, bool enable=true)
void devirtualize_varray2(const VArray< T1 > &varray1, const VArray< T2 > &varray2, const Func &func, bool enable=true)
static constexpr bool is_VArray_v
void initialized_fill_n(T *dst, int64_t n, const T &value)
bool call_with_devirtualized_parameters(const std::tuple< Devirtualizers... > &devis, const Fn &fn)
static constexpr bool is_VMutableArray_v
void uninitialized_fill_n(T *dst, int64_t n, const T &value)
void initialized_copy_n(const T *src, int64_t n, T *dst)
constexpr bool is_trivial_extended_v
CommonVArrayInfo(const Type _type, const bool _may_have_ownership, const void *_data)
CommonVArrayInfo()=default
bool devirtualize(const Fn &fn) const
const VArray< T > & varray