struct ReadAttributeLookup { std::unique_ptr varray; AttributeDomain domain; }; struct WriteAttributeLookup { std::unique_ptr varray; AttributeDomain domain; }; class MaybeUnsavedWriteAttribute { public: using SaveF = std::function; private: std::unique_ptr varray_; AttributeDomain domain_; SaveF save_; public: MaybeUnsavedWriteAttribute() = default; MaybeUnsavedWriteAttribute(std::unique_ptr varray, AttributeDomain domain, SaveF save) : varray_(std::move(varray)), domain_(domain), save_(std::move(save)) { } operator bool() const { return varray_.get() != nullptr; } GVMutableArray &varray() { return *varray_; } AttributeDomain domain() const { return domain_; } const CPPType &cpp_type() const { return varray_->type(); } CustomDataType custom_data_type() const { return cpp_type_to_custom_data_type(this->cpp_type()); } void save_if_necessary(); }; blender::bke::ReadAttributeLookup GeometryComponent::attribute_lookup_for_read( const blender::StringRef attribute_name) const; blender::bke::WriteAttributeLookup GeometryComponent::attribute_lookup_for_write( const blender::StringRef attribute_name); blender::bke::MaybeUnsavedWriteAttribute GeometryComponent::attribute_lookup_or_create_for_write( const blender::StringRef attribute_name, const AttributeDomain domain, const CustomDataType data_type, const void *default_value = nullptr); std::unique_ptr GeometryComponent::attribute_try_adapt_domain( const blender::fn::GVArray &data, const AttributeDomain from_domain, const AttributeDomain to_domain) const;