Skip to content

Improvements to moving data into ArrayHandle

Kenneth Moreland requested to merge kmorel/vtk-m:move-std-vector into master

We have made several improvements to adding data into an ArrayHandle.

Moving data from an std::vector

For numerous reasons, it is convenient to define data in a std::vector and then wrap that into an ArrayHandle. It is often the case that an std::vector is filled and then becomes unused once it is converted to an ArrayHandle. In this case, what we really want is to pass the data off to the ArrayHandle so that the ArrayHandle is now managing the data and not the std::vector.

C++11 has a mechanism to do this: move semantics. You can now pass variables to functions as an "rvalue" (right-hand value). When something is passed as an rvalue, it can pull state out of that variable and move it somewhere else. std::vector implements this movement so that an rvalue can be moved to another std::vector without actually copying the data. make_ArrayHandle now also takes advantage of this feature to move rvalue std::vectors.

There is a special form of make_ArrayHandle named make_ArrayHandleMove that takes an rvalue. There is also a special overload of make_ArrayHandle itself that handles an rvalue vector. (However, using the explicit move version is better if you want to make sure the data is actually moved.)

Make ArrayHandle from initalizer list

A common use case for using std::vector (particularly in our unit tests) is to quickly add an initalizer list into an ArrayHandle. Now you can by simply passing an initializer list to make_ArrayHandle.

Deprecated make_ArrayHandle with default shallow copy

For historical reasons, passing an std::vector or a pointer to make_ArrayHandle does a shallow copy (i.e. CopyFlag defaults to Off). Although more efficient, this mode is inherintly unsafe, and making it the default is asking for trouble.

To combat this, calling make_ArrayHandle without a copy flag is deprecated. In this way, if you wish to do the faster but more unsafe creation of an ArrayHandle you should explicitly express that.

This requried quite a few changes through the VTK-m source (particularly in the tests).

Similar changes to Field

vtkm::cont::Field has a make_Field helper function that is similar to make_ArrayHandle. It also features the ability to create fields from std::vectors and C arrays. It also likewise had the same unsafe behavior by default of not copying from the source of the arrays.

That behavior has similarly been depreciated. You now have to specify a copy flag.

The ability to construct a Field from an initializer list of values has also been added.

Merge request reports