Blender V5.0
blender::VArrayCommon< T > Class Template Reference

#include <BLI_virtual_array.hh>

Inherited by blender::VArray< T >, and blender::VMutableArray< T >.

Public Member Functions

 operator bool () const
T operator[] (const int64_t index) const
T get (const int64_t index) const
int64_t size () const
T first () const
T last (const int64_t n=0) const
bool is_empty () const
IndexRange index_range () const
CommonVArrayInfo common_info () const
bool is_span () const
Span< Tget_internal_span () const
bool is_single () const
T get_internal_single () const
std::optional< Tget_if_single () const
void materialize (MutableSpan< T > r_span) const
void materialize (const IndexMask &mask, MutableSpan< T > r_span) const
void materialize_to_uninitialized (MutableSpan< T > r_span) const
void materialize_to_uninitialized (const IndexMask &mask, MutableSpan< T > r_span) const
void materialize_compressed (const IndexMask &mask, MutableSpan< T > r_span) const
void materialize_compressed_to_uninitialized (const IndexMask &mask, MutableSpan< T > r_span) const
bool try_assign_GVArray (GVArray &varray) const
const VArrayImpl< T > * get_implementation () const

Protected Types

using Storage = Any<blender::detail::VArrayAnyExtraInfo<T>, 24, 8>

Protected Member Functions

 VArrayCommon ()=default
 VArrayCommon (const VArrayCommon &other)
 VArrayCommon (VArrayCommon &&other) noexcept
 VArrayCommon (const VArrayImpl< T > *impl)
 VArrayCommon (std::shared_ptr< const VArrayImpl< T > > impl)
template<typename ImplT, typename... Args>
void emplace (Args &&...args)
void copy_from (const VArrayCommon &other)
void move_from (VArrayCommon &&other) noexcept
const VArrayImpl< T > * impl_from_storage () const

Protected Attributes

const VArrayImpl< T > * impl_ = nullptr
Storage storage_

Detailed Description

template<typename T>
class blender::VArrayCommon< T >

Utility class to reduce code duplication for methods available on VArray and VMutableArray. Deriving VMutableArray from VArray would have some issues:

  • Static methods on VArray would also be available on VMutableArray.
  • It would allow assigning a VArray to a VMutableArray under some circumstances which is not allowed and could result in hard to find bugs.

Definition at line 556 of file BLI_virtual_array.hh.

Member Typedef Documentation

◆ Storage

template<typename T>
using blender::VArrayCommon< T >::Storage = Any<blender::detail::VArrayAnyExtraInfo<T>, 24, 8>
protected

Store the virtual array implementation in an Any. This makes it easy to avoid a memory allocation if the implementation is small enough and is copyable. This is the case for the most common virtual arrays. Other virtual array implementations are typically stored as #std::shared_ptr. That works even when the implementation itself is not copyable and makes copying VArrayCommon cheaper.

Definition at line 565 of file BLI_virtual_array.hh.

Constructor & Destructor Documentation

◆ VArrayCommon() [1/5]

◆ VArrayCommon() [2/5]

template<typename T>
blender::VArrayCommon< T >::VArrayCommon ( const VArrayCommon< T > & other)
inlineprotected

Copy constructor.

Definition at line 583 of file BLI_virtual_array.hh.

References impl_, impl_from_storage(), storage_, and VArrayCommon().

◆ VArrayCommon() [3/5]

template<typename T>
blender::VArrayCommon< T >::VArrayCommon ( VArrayCommon< T > && other)
inlineprotectednoexcept

Move constructor.

Definition at line 589 of file BLI_virtual_array.hh.

References impl_, impl_from_storage(), and VArrayCommon().

◆ VArrayCommon() [4/5]

template<typename T>
blender::VArrayCommon< T >::VArrayCommon ( const VArrayImpl< T > * impl)
inlineprotected

Wrap an existing VArrayImpl and don't take ownership of it. This should rarely be used in practice.

Definition at line 600 of file BLI_virtual_array.hh.

References impl_, and storage_.

◆ VArrayCommon() [5/5]

template<typename T>
blender::VArrayCommon< T >::VArrayCommon ( std::shared_ptr< const VArrayImpl< T > > impl)
inlineprotected

Wrap an existing VArrayImpl that is contained in a #std::shared_ptr. This takes ownership.

Definition at line 608 of file BLI_virtual_array.hh.

References get(), impl_, and storage_.

Member Function Documentation

◆ common_info()

◆ copy_from()

template<typename T>
void blender::VArrayCommon< T >::copy_from ( const VArrayCommon< T > & other)
inlineprotected

Utility to implement a copy assignment operator in a subclass.

Definition at line 638 of file BLI_virtual_array.hh.

References impl_, impl_from_storage(), storage_, and VArrayCommon().

Referenced by blender::VMutableArray< float >::operator VArray< float >(), blender::VArray< T >::operator=(), and blender::VMutableArray< T >::operator=().

◆ emplace()

template<typename T>
template<typename ImplT, typename... Args>
void blender::VArrayCommon< T >::emplace ( Args &&... args)
inlineprotected

◆ first()

template<typename T>
T blender::VArrayCommon< T >::first ( ) const
inline

◆ get()

◆ get_if_single()

◆ get_implementation()

template<typename T>
const VArrayImpl< T > * blender::VArrayCommon< T >::get_implementation ( ) const
inline

Definition at line 832 of file BLI_virtual_array.hh.

References impl_.

◆ get_internal_single()

◆ get_internal_span()

template<typename T>
Span< T > blender::VArrayCommon< T >::get_internal_span ( ) const
inline

◆ impl_from_storage()

template<typename T>
const VArrayImpl< T > * blender::VArrayCommon< T >::impl_from_storage ( ) const
inlineprotected

Get a pointer to the virtual array implementation that is currently stored in storage_, or null.

Definition at line 661 of file BLI_virtual_array.hh.

References storage_.

Referenced by copy_from(), move_from(), VArrayCommon(), and VArrayCommon().

◆ index_range()

◆ is_empty()

◆ is_single()

template<typename T>
bool blender::VArrayCommon< T >::is_single ( ) const
inline

Return true when the virtual array returns the same value for every index.

Definition at line 761 of file BLI_virtual_array.hh.

References BLI_assert, impl_, blender::CommonVArrayInfo::Single, and blender::CommonVArrayInfo::type.

Referenced by blender::nodes::node_geo_instance_on_points_cc::add_instances_from_component(), BKE_mesh_material_index_used(), BKE_sculpt_sync_face_visibility_to_grids(), blender::io::obj::OBJMesh::calc_face_order(), blender::geometry::convert_curves_to_nurbs(), blender::nodes::node_geo_points_to_curves_cc::curve_from_points(), blender::nodes::node_geo_points_to_curves_cc::curves_from_points(), blender::nodes::node_geo_curve_fill_cc::do_group_aware_cdt(), blender::ed::curves::duplicate_points(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_edges(), blender::nodes::node_geo_extrude_mesh_cc::extrude_mesh_face_regions(), blender::fn::FieldEvaluator::get_evaluated_as_mask(), get_internal_single(), blender::io::usd::get_loops_polys(), blender::nodes::node_geo_curve_topology_points_of_curve_cc::PointsOfCurveInput::get_varray_for_context(), blender::nodes::node_geo_index_of_nearest_cc::HasNeighborFieldInput::get_varray_for_context(), blender::nodes::node_geo_input_curve_handles_cc::HandlePositionFieldInput::get_varray_for_context(), blender::nodes::node_geo_mesh_face_group_boundaries_cc::BoundaryFieldInput::get_varray_for_context(), blender::nodes::node_geo_mesh_topology_corners_of_edge_cc::CornersOfEdgeInput::get_varray_for_context(), blender::nodes::node_geo_mesh_topology_corners_of_face_cc::CornersOfFaceInput::get_varray_for_context(), blender::nodes::node_geo_mesh_topology_corners_of_vertex_cc::CornersOfVertInput::get_varray_for_context(), blender::nodes::node_geo_mesh_topology_edges_of_vertex_cc::EdgesOfVertInput::get_varray_for_context(), blender::draw::interpolate_corners(), blender::bke::mesh_hide_face_flush(), blender::bke::mesh_hide_vert_flush(), blender::bke::mesh_select_edge_flush(), blender::bke::mesh_select_face_flush(), blender::bke::mesh_select_vert_flush(), blender::ed::curves::retrieve_selected_curves(), blender::nodes::node_geo_sort_elements_cc::sorted_indices(), blender::nodes::node_geo_curve_subdivide_cc::subdivide_curves(), blender::nodes::node_geo_curve_subdivide_cc::subdivide_grease_pencil_curves(), blender::tests::TEST(), and blender::tests::TEST().

◆ is_span()

◆ last()

template<typename T>
T blender::VArrayCommon< T >::last ( const int64_t n = 0) const
inline

Get the nth last element.

Definition at line 719 of file BLI_virtual_array.hh.

References size(), and T.

◆ materialize() [1/2]

template<typename T>
void blender::VArrayCommon< T >::materialize ( const IndexMask & mask,
MutableSpan< T > r_span ) const
inline

Copy some indices of the virtual array into a span.

Definition at line 798 of file BLI_virtual_array.hh.

References BLI_assert, blender::MutableSpan< T >::data(), impl_, and mask().

◆ materialize() [2/2]

◆ materialize_compressed()

◆ materialize_compressed_to_uninitialized()

template<typename T>
void blender::VArrayCommon< T >::materialize_compressed_to_uninitialized ( const IndexMask & mask,
MutableSpan< T > r_span ) const
inline

Definition at line 821 of file BLI_virtual_array.hh.

References blender::MutableSpan< T >::data(), impl_, and mask().

Referenced by blender::tests::TEST().

◆ materialize_to_uninitialized() [1/2]

template<typename T>
void blender::VArrayCommon< T >::materialize_to_uninitialized ( const IndexMask & mask,
MutableSpan< T > r_span ) const
inline

Definition at line 809 of file BLI_virtual_array.hh.

References BLI_assert, blender::MutableSpan< T >::data(), impl_, and mask().

◆ materialize_to_uninitialized() [2/2]

template<typename T>
void blender::VArrayCommon< T >::materialize_to_uninitialized ( MutableSpan< T > r_span) const
inline

◆ move_from()

template<typename T>
void blender::VArrayCommon< T >::move_from ( VArrayCommon< T > && other)
inlineprotectednoexcept

Utility to implement a move assignment operator in a subclass.

Definition at line 648 of file BLI_virtual_array.hh.

References impl_, impl_from_storage(), storage_, and VArrayCommon().

Referenced by blender::VMutableArray< float >::operator VArray< float >(), blender::VArray< T >::operator=(), and blender::VMutableArray< T >::operator=().

◆ operator bool()

template<typename T>
blender::VArrayCommon< T >::operator bool ( ) const
inline

Return false when there is no virtual array implementation currently.

Definition at line 671 of file BLI_virtual_array.hh.

References impl_.

◆ operator[]()

template<typename T>
T blender::VArrayCommon< T >::operator[] ( const int64_t index) const
inline

Get the element at a specific index.

Note
This can't return a reference because the value may be computed on the fly. This also implies that one can not use this method for assignments.

Definition at line 681 of file BLI_virtual_array.hh.

References BLI_assert, impl_, size(), and T.

◆ size()

template<typename T>
int64_t blender::VArrayCommon< T >::size ( ) const
inline

Return the size of the virtual array. It's allowed to call this method even when there is no virtual array. In this case 0 is returned.

Definition at line 702 of file BLI_virtual_array.hh.

References impl_.

Referenced by blender::ArrayState< T >::ArrayState(), blender::array_utils::booleans_mix_calc(), blender::ed::sculpt_paint::greasepencil::calculate_view_radii(), blender::array_utils::contains(), blender::array_utils::copy(), blender::io::usd::copy_blender_buffer_to_primvar(), blender::array_utils::count_booleans(), blender::array_utils::count_booleans(), blender::ed::greasepencil::create_curves_outline(), blender::nodes::node_geo_points_to_curves_cc::curve_from_points(), blender::deform_drawing(), blender::VArrayDevirtualizer< T, UseSingle, UseSpan >::devirtualize(), blender::nodes::node_geo_curve_fill_cc::do_group_aware_cdt(), blender::ed::sculpt_paint::face_set::duplicate_face_sets(), blender::geometry::fit_poly_to_bezier_curves(), blender::ed::sculpt_paint::float_selection_ensure(), blender::index_mask::IndexMask::from_bools(), blender::index_mask::IndexMask::from_bools_inverse(), blender::VArray< T >::from_func(), blender::index_mask::IndexMask::from_group_ids(), blender::index_mask::IndexMask::from_group_ids(), blender::VArray< T >::from_single(), blender::VArray< T >::from_std_func(), blender::nodes::get_closest_in_bvhtree(), blender::nodes::node_geo_sample_nearest_cc::get_closest_mesh_corners(), blender::nodes::node_geo_sample_nearest_cc::get_closest_mesh_faces(), blender::nodes::node_geo_sample_nearest_cc::get_closest_pointcloud_points(), blender::fn::FieldEvaluator::get_evaluated_as_mask(), blender::modifier::greasepencil::get_influence_vertex_weights(), blender::ed::greasepencil::grease_pencil_weight_invert_exec(), blender::GVMutableArray::GVMutableArray(), index_range(), is_empty(), blender::ed::greasepencil::join_geometries_with_transforms(), last(), materialize(), materialize_to_uninitialized(), operator[](), blender::io::usd::populate_curve_widths(), blender::ArrayState< T >::same_as(), blender::VMutableArray< T >::set(), blender::ed::geometry::store_attributes_to_shape_keys(), blender::bke::NormalsCache::store_varray(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::geometry::trim_curves(), blender::VArray< T >::VArray(), and blender::io::obj::OBJWriter::write_vertex_coords().

◆ try_assign_GVArray()

template<typename T>
bool blender::VArrayCommon< T >::try_assign_GVArray ( GVArray & varray) const
inline

See #GVArrayImpl::try_assign_GVArray.

Definition at line 827 of file BLI_virtual_array.hh.

References impl_.

Member Data Documentation

◆ impl_

◆ storage_

template<typename T>
Storage blender::VArrayCommon< T >::storage_
protected

Does the memory management for the virtual array implementation. It contains one of the following:

Definition at line 578 of file BLI_virtual_array.hh.

Referenced by copy_from(), emplace(), impl_from_storage(), move_from(), VArrayCommon(), VArrayCommon(), and VArrayCommon().


The documentation for this class was generated from the following file: