114 mask.foreach_index([&](
const int64_t i) { dst[i] = this->
get(i); });
122 mask.foreach_index([&](
const int64_t i) {
new (dst + i)
T(this->
get(i)); });
174 src.
data(), this->size_,
const_cast<T *
>(
static_cast<const T *
>(info.
data)));
179 this->
set(i, src[i]);
217 data_[index] = value;
237 mask.foreach_index_optimized<
int64_t>(
243 mask.foreach_index_optimized<
int64_t>(
263 CommonVArrayInfo common_info() const final
278template<
typename Container,
typename T =
typename Container::value_type>
281 Container container_;
287 this->
data_ =
const_cast<T *
>(container_.data());
302 :
VArrayImpl<T>(size), value_(std::move(value))
319 mask.foreach_index([&](
const int64_t i) { dst[i] = value_; });
324 mask.foreach_index([&](
const int64_t i) {
new (dst + i)
T(value_); });
351 :
VArrayImpl<T>(size), get_func_(std::move(get_func))
356 T get(
const int64_t index)
const override
358 return get_func_(index);
361 void materialize(
const IndexMask &mask, T *dst)
const override
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
419 mask.foreach_index_optimized<
int64_t>([&](
const int64_t i) { dst[i] = GetFunc(data_[i]); });
422 void materialize_to_uninitialized(
const IndexMask &mask, ElemT *dst)
const override
424 mask.foreach_index_optimized<
int64_t>(
425 [&](
const int64_t i) {
new (dst + i) ElemT(GetFunc(data_[i])); });
428 void materialize_compressed(
const IndexMask &mask, ElemT *dst)
const override
430 mask.foreach_index_optimized<
int64_t>(
434 void materialize_compressed_to_uninitialized(
const IndexMask &mask, ElemT *dst)
const override
436 mask.foreach_index_optimized<
int64_t>(
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(); }};
533 other.storage_.reset();
534 other.impl_ =
nullptr;
559 template<
typename ImplT,
typename... Args>
void emplace(Args &&...args)
562 static_assert(std::is_base_of_v<VArrayImpl<T>, ImplT>);
563 if constexpr (std::is_copy_constructible_v<ImplT> && Storage::template is_inline_v<ImplT>) {
571 std::shared_ptr<const VArrayImpl<T>>
ptr = std::make_shared<ImplT>(
572 std::forward<Args>(args)...);
581 if (
this == &other) {
591 if (
this == &other) {
594 storage_ = std::move(other.storage_);
596 other.storage_.reset();
597 other.impl_ =
nullptr;
612 operator bool()
const
614 return impl_ !=
nullptr;
627 return impl_->get(index);
636 return (*
this)[index];
645 if (
impl_ ==
nullptr) {
648 return impl_->size();
662 return (*
this)[this->
size() - 1 - n];
668 return this->
size() == 0;
679 return impl_->common_info();
698 return Span<T>(
static_cast<const T *
>(info.
data), this->size());
717 return *
static_cast<const T *
>(info.
data);
729 return *
static_cast<const T *
>(info.
data);
741 BLI_assert(mask.min_array_size() <= this->size());
752 BLI_assert(mask.min_array_size() <= this->size());
753 impl_->materialize_to_uninitialized(mask, r_span.
data());
759 impl_->materialize_compressed(mask, r_span.
data());
764 impl_->materialize_compressed_to_uninitialized(mask, r_span.
data());
770 return impl_->try_assign_GVArray(varray);
779template<
typename T>
class VMutableArray;
788namespace varray_tag {
824 template<
typename ImplT,
typename... Args>
static VArray For(Args &&...args)
826 static_assert(std::is_base_of_v<VArrayImpl<T>, ImplT>);
862 template<
typename StructT, T (*GetFunc)(const StructT &)>
897template<
typename T>
class VMutableArray :
public VArrayCommon<T> {
915 static_assert(std::is_base_of_v<VMutableArrayImpl<T>, ImplT>);
933 template<
typename StructT, T (*GetFunc)(const StructT &),
void (*SetFunc)(StructT &, T)>
975 return MutableSpan<T>(
const_cast<T *
>(
static_cast<const T *
>(info.
data)), this->size());
985 this->get_impl()->set(index, std::move(value));
994 this->get_impl()->set_all(src);
1000 return this->get_impl()->try_assign_GVMutableArray(varray);
1048 this->data_ =
static_cast<const T *
>(info.
data);
1054 this->data_ = owned_data_.
data();
1059 : varray_(std::move(other.varray_)), owned_data_(std::move(other.owned_data_))
1067 this->data_ =
static_cast<const T *
>(info.
data);
1070 this->data_ = owned_data_.
data();
1072 other.data_ =
nullptr;
1078 if (
this == &other) {
1081 std::destroy_at(
this);
1102 bool save_has_been_called_ =
false;
1103 bool show_not_saved_warning_ =
true;
1117 this->
size_ = varray_.size();
1120 this->data_ =
const_cast<T *
>(
static_cast<const T *
>(info.
data));
1123 if (copy_values_to_span) {
1126 varray_.materialize_to_uninitialized(owned_data_);
1131 this->data_ = owned_data_.
data();
1136 : varray_(std::move(other.varray_)),
1137 owned_data_(std::move(other.owned_data_)),
1138 show_not_saved_warning_(other.show_not_saved_warning_)
1144 this->
size_ = varray_.size();
1147 this->data_ =
static_cast<T *
>(
const_cast<void *
>(info.
data));
1150 this->data_ = owned_data_.
data();
1152 other.data_ =
nullptr;
1159 if (show_not_saved_warning_) {
1160 if (!save_has_been_called_) {
1169 if (
this == &other) {
1172 std::destroy_at(
this);
1185 save_has_been_called_ =
true;
1186 if (this->data_ != owned_data_.
data()) {
1189 varray_.set_all(owned_data_);
1194 show_not_saved_warning_ =
false;
1243 if constexpr (UseSingle) {
1248 if constexpr (UseSpan) {
1250 return fn(
Span<T>(
static_cast<const T *
>(info.
data), size));
1265template<
typename T,
typename Func>
1283template<
typename T1,
typename T2,
typename Func>
#define BLI_assert_unreachable()
#define UNUSED_VARS_NDEBUG(...)
const RealExtraInfo & extra_info() const
void reinitialize(const int64_t new_size)
constexpr int64_t size() const
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)
VArrayImpl_For_ArrayContainer(Container container)
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)
const 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 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)
node_ attributes set("label", ss.str())
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