We have made several improvements to adding data into an
For numerous reasons, it is convenient to define data in a
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
ArrayHandle so that the
ArrayHandle is now managing the data and
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
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
There is a special form of
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
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
For historical reasons, passing an
std::vector or a pointer to
make_ArrayHandle does a shallow copy (i.e.
CopyFlag defaults to
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).
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.