47 enum class Type : uint8_t {
174 src.
data(),
this->size_,
const_cast<T *
>(
static_cast<const T *
>(info.
data)));
179 this->
set(
i, src[
i]);
217 data_[index] = value;
278template<
typename Container,
typename T =
typename Container::value_type>
281 Container container_;
287 this->
data_ =
const_cast<T *
>(container_.data());
319 mask.foreach_index([&](
const int64_t i) { dst[
i] = value_; });
324 mask.foreach_index([&](
const int64_t i) {
new (dst +
i)
T(value_); });
356 T get(
const int64_t index)
const override
358 return get_func_(index);
363 mask.foreach_index([&](
const int64_t i) { dst[
i] = get_func_(
i); });
366 void materialize_to_uninitialized(
const IndexMask &
mask,
T *dst)
const override
368 mask.foreach_index([&](
const int64_t i) {
new (dst +
i)
T(get_func_(
i)); });
371 void materialize_compressed(
const IndexMask &
mask,
T *dst)
const override
376 void materialize_compressed_to_uninitialized(
const IndexMask &
mask,
T *dst)
const override
386template<
typename StructT,
388 ElemT (*GetFunc)(
const StructT &),
389 void (*SetFunc)(StructT &, ElemT) =
nullptr>
400 template<
typename OtherStructT,
402 OtherElemT (*OtherGetFunc)(
const OtherStructT &),
403 void (*OtherSetFunc)(OtherStructT &, OtherElemT)>
407 ElemT get(
const int64_t index)
const override
409 return GetFunc(data_[index]);
412 void set(
const int64_t index, ElemT value)
override
414 SetFunc(data_[index], std::move(value));
417 void materialize(
const IndexMask &
mask, ElemT *dst)
const override
422 void materialize_to_uninitialized(
const IndexMask &
mask, ElemT *dst)
const override
425 [&](
const int64_t i) {
new (dst +
i) ElemT(GetFunc(data_[
i])); });
428 void materialize_compressed(
const IndexMask &
mask, ElemT *dst)
const override
434 void materialize_compressed_to_uninitialized(
const IndexMask &
mask, ElemT *dst)
const override
441template<
typename StructT,
443 ElemT (*GetFunc)(
const StructT &),
444 void (*SetFunc)(StructT &, ElemT)>
464 std::is_base_of_v<VArrayImpl<T>, StorageT> ||
469 if constexpr (std::is_base_of_v<VArrayImpl<T>, StorageT>) {
470 return {[](
const void *buffer) {
471 return static_cast<const VArrayImpl<T> *
>((
const StorageT *)buffer);
474 else if constexpr (std::is_same_v<StorageT, const VArrayImpl<T> *>) {
475 return {[](
const void *buffer) {
return *(
const StorageT *)buffer; }};
477 else if constexpr (std::is_same_v<StorageT, std::shared_ptr<const VArrayImpl<T>>>) {
478 return {[](
const void *buffer) {
return ((
const StorageT *)buffer)->get(); }};
532 other.storage_.reset();
533 other.impl_ =
nullptr;
558 template<
typename ImplT,
typename... Args>
void emplace(Args &&...args)
561 static_assert(std::is_base_of_v<VArrayImpl<T>, ImplT>);
562 if constexpr (std::is_copy_constructible_v<ImplT> && Storage::template is_inline_v<ImplT>) {
570 std::shared_ptr<const VArrayImpl<T>>
ptr = std::make_shared<ImplT>(
571 std::forward<Args>(args)...);
580 if (
this == &other) {
590 if (
this == &other) {
593 storage_ = std::move(other.storage_);
595 other.storage_.reset();
596 other.impl_ =
nullptr;
611 operator bool()
const
613 return impl_ !=
nullptr;
626 return impl_->get(index);
635 return (*
this)[index];
644 if (
impl_ ==
nullptr) {
647 return impl_->size();
661 return (*
this)[this->
size() - 1 - n];
667 return this->
size() == 0;
678 return impl_->common_info();
716 return *
static_cast<const T *
>(info.
data);
728 return *
static_cast<const T *
>(info.
data);
763 impl_->materialize_compressed_to_uninitialized(
mask, r_span.
data());
769 return impl_->try_assign_GVArray(varray);
778template<
typename T>
class VMutableArray;
823 template<
typename ImplT,
typename... Args>
static VArray For(Args &&...args)
825 static_assert(std::is_base_of_v<VArrayImpl<T>, ImplT>);
861 template<
typename StructT, T (*GetFunc)(const StructT &)>
914 static_assert(std::is_base_of_v<VMutableArrayImpl<T>, ImplT>);
932 template<
typename StructT, T (*GetFunc)(const StructT &),
void (*SetFunc)(StructT &, T)>
994 this->get_impl()->set(index, std::move(value));
1003 this->get_impl()->set_all(src);
1009 return this->get_impl()->try_assign_GVMutableArray(varray);
1054 this->
size_ = varray_.size();
1057 this->data_ = static_cast<const T *>(info.data);
1060 owned_data_.~Array();
1061 new (&owned_data_) Array<T>(varray_.size(), NoInitialization{});
1062 varray_.materialize_to_uninitialized(owned_data_);
1063 this->data_ = owned_data_.data();
1068 : varray_(std::move(other.varray_)), owned_data_(std::move(other.owned_data_))
1073 this->
size_ = varray_.size();
1076 this->data_ = static_cast<const T *>(info.data);
1079 this->data_ = owned_data_.data();
1081 other.data_ =
nullptr;
1087 if (
this == &other) {
1090 std::destroy_at(
this);
1097void print_mutable_varray_span_warning();
1111 bool save_has_been_called_ =
false;
1112 bool show_not_saved_warning_ =
true;
1126 this->
size_ = varray_.size();
1129 this->data_ = const_cast<T *>(static_cast<const T *>(info.data));
1132 if (copy_values_to_span) {
1133 owned_data_.~Array();
1134 new (&owned_data_) Array<T>(varray_.size(), NoInitialization{});
1135 varray_.materialize_to_uninitialized(owned_data_);
1138 owned_data_.reinitialize(varray_.size());
1140 this->data_ = owned_data_.data();
1145 : varray_(std::move(other.varray_)),
1146 owned_data_(std::move(other.owned_data_)),
1147 show_not_saved_warning_(other.show_not_saved_warning_)
1153 this->
size_ = varray_.size();
1156 this->data_ = static_cast<T *>(const_cast<void *>(info.data));
1159 this->data_ = owned_data_.data();
1161 other.data_ =
nullptr;
1168 if (show_not_saved_warning_) {
1169 if (!save_has_been_called_) {
1178 if (
this == &other) {
1181 std::destroy_at(
this);
1194 save_has_been_called_ =
true;
1195 if (this->data_ != owned_data_.data()) {
1198 varray_.set_all(owned_data_);
1203 show_not_saved_warning_ =
false;
1252 if constexpr (UseSingle) {
1257 if constexpr (UseSpan) {
1274template<
typename T,
typename Func>
1292template<
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 override
VArrayImpl_For_Single(T value, const int64_t size)
void materialize_to_uninitialized(const IndexMask &mask, T *dst) const override
CommonVArrayInfo common_info() const override
T get(const int64_t) const override
void materialize(const IndexMask &mask, T *dst) const override
void materialize_compressed_to_uninitialized(const IndexMask &mask, T *dst) 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_compressed(const IndexMask &mask, T *dst) const override
void materialize_compressed_to_uninitialized(const IndexMask &mask, T *dst) const override
void materialize(const IndexMask &mask, T *dst) const override
T get(const int64_t index) const final
void materialize_to_uninitialized(const IndexMask &mask, T *dst) const override
VArrayImpl_For_Span(const MutableSpan< T > data)
virtual void materialize_compressed(const IndexMask &mask, T *dst) const
virtual bool try_assign_GVArray(GVArray &) const
virtual void materialize_compressed_to_uninitialized(const IndexMask &mask, T *dst) const
virtual void materialize_to_uninitialized(const IndexMask &mask, T *dst) const
virtual CommonVArrayInfo common_info() const
virtual void materialize(const IndexMask &mask, T *dst) 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)
VArray(const VArrayImpl< T > *impl)
VArray(const VArray &other)=default
VArray(varray_tag::single, T value, const int64_t size)
static VArray ForDerivedSpan(Span< StructT > values)
VArray(VArray &&other) noexcept=default
VArray & operator=(const VArray &other)
static VArray ForContainer(ContainerT container)
VArray(varray_tag::span, Span< T > span)
VArray(std::shared_ptr< const VArrayImpl< T > > impl)
static VArray ForSingle(T value, const int64_t size)
static VArray For(Args &&...args)
static VArray ForSpan(Span< T > values)
VArray & operator=(VArray &&other) noexcept
static VArray ForFunc(const int64_t size, GetFunc get_func)
virtual void set(int64_t index, T value)=0
virtual bool try_assign_GVMutableArray(GVMutableArray &) const
virtual void set_all(Span< T > src)
void set(const int64_t index, T value)
VMutableArray(std::shared_ptr< const VMutableArrayImpl< T > > impl)
static VMutableArray ForDerivedSpan(MutableSpan< StructT > values)
VMutableArray & operator=(const VMutableArray &other)
static VMutableArray ForContainer(ContainerT container)
static VMutableArray ForSpan(MutableSpan< T > values)
static VMutableArray For(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)
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