VariantArrayHandle should report run time NumberOfComponents

Query and report number of components at runtime so that it can work with
arrays of types with runtime varying number of components
Eg. ArrayHandleGroupVecVariable.
This commit is contained in:
Sujin Philip 2019-03-15 16:47:32 -04:00
parent 2d09dd4fac
commit 546a1d14a2
4 changed files with 38 additions and 11 deletions

@ -32,15 +32,12 @@ namespace internal
{
VariantArrayHandleContainerBase::VariantArrayHandleContainerBase()
: NumberOfComponents(0)
, TypeIndex(typeid(nullptr))
: TypeIndex(typeid(nullptr))
{
}
VariantArrayHandleContainerBase::VariantArrayHandleContainerBase(vtkm::IdComponent numComps,
const std::type_info& typeinfo)
: NumberOfComponents(numComps)
, TypeIndex(typeinfo)
VariantArrayHandleContainerBase::VariantArrayHandleContainerBase(const std::type_info& typeinfo)
: TypeIndex(typeinfo)
{
}

@ -47,17 +47,16 @@ namespace internal
///
struct VTKM_CONT_EXPORT VariantArrayHandleContainerBase
{
vtkm::IdComponent NumberOfComponents;
std::type_index TypeIndex;
VariantArrayHandleContainerBase();
VariantArrayHandleContainerBase(vtkm::IdComponent numComps, const std::type_info& hash);
explicit VariantArrayHandleContainerBase(const std::type_info& hash);
// This must exist so that subclasses are destroyed correctly.
virtual ~VariantArrayHandleContainerBase();
virtual vtkm::Id GetNumberOfValues() const = 0;
inline vtkm::IdComponent GetNumberOfComponents() const { return NumberOfComponents; }
virtual vtkm::IdComponent GetNumberOfComponents() const = 0;
virtual void ReleaseResourcesExecution() = 0;
virtual void ReleaseResources() = 0;
@ -79,15 +78,16 @@ template <typename T>
struct VTKM_ALWAYS_EXPORT VariantArrayHandleContainer final : public VariantArrayHandleContainerBase
{
vtkm::cont::ArrayHandleVirtual<T> Array;
mutable vtkm::IdComponent NumberOfComponents = 0;
VariantArrayHandleContainer()
: VariantArrayHandleContainerBase(vtkm::VecTraits<T>::NUM_COMPONENTS, typeid(T))
: VariantArrayHandleContainerBase(typeid(T))
, Array()
{
}
VariantArrayHandleContainer(const vtkm::cont::ArrayHandleVirtual<T>& array)
: VariantArrayHandleContainerBase(vtkm::VecTraits<T>::NUM_COMPONENTS, typeid(T))
: VariantArrayHandleContainerBase(typeid(T))
, Array(array)
{
}
@ -96,6 +96,19 @@ struct VTKM_ALWAYS_EXPORT VariantArrayHandleContainer final : public VariantArra
vtkm::Id GetNumberOfValues() const { return this->Array.GetNumberOfValues(); }
vtkm::IdComponent GetNumberOfComponents() const override
{
// Cache number of components to avoid unnecessary device to host transfers of the array.
// Also assumes that the number of components is constant accross all elements and
// throughout the life of the array.
if (this->NumberOfComponents == 0)
{
this->NumberOfComponents =
this->GetNumberOfComponents(typename vtkm::VecTraits<T>::IsSizeStatic{});
}
return this->NumberOfComponents;
}
void ReleaseResourcesExecution() { this->Array.ReleaseResourcesExecution(); }
void ReleaseResources() { this->Array.ReleaseResources(); }
@ -108,6 +121,19 @@ struct VTKM_ALWAYS_EXPORT VariantArrayHandleContainer final : public VariantArra
{
return std::make_shared<VariantArrayHandleContainer<T>>(this->Array.NewInstance());
}
private:
vtkm::IdComponent GetNumberOfComponents(VecTraitsTagSizeStatic) const
{
return vtkm::VecTraits<T>::NUM_COMPONENTS;
}
vtkm::IdComponent GetNumberOfComponents(VecTraitsTagSizeVariable) const
{
return (this->Array.GetNumberOfValues() == 0)
? 0
: vtkm::VecTraits<T>::GetNumberOfComponents(this->Array.GetPortalConstControl().Get(0));
}
};
namespace variant

@ -39,6 +39,7 @@ namespace vtkm
template <>
struct VecTraits<std::string>
{
using IsSizeStatic = vtkm::VecTraitsTagSizeStatic;
static constexpr vtkm::IdComponent NUM_COMPONENTS = 1;
using HasMultipleComponents = vtkm::VecTraitsTagSingleComponent;
};

@ -54,6 +54,7 @@ namespace vtkm
template <>
struct VecTraits<std::string>
{
using IsSizeStatic = vtkm::VecTraitsTagSizeStatic;
static constexpr vtkm::IdComponent NUM_COMPONENTS = 1;
using HasMultipleComponents = vtkm::VecTraitsTagSingleComponent;
};
@ -156,6 +157,8 @@ void BasicArrayVariantChecks(const vtkm::cont::VariantArrayHandleBase<TypeList>&
{
VTKM_TEST_ASSERT(array.GetNumberOfValues() == ARRAY_SIZE,
"Dynamic array reports unexpected size.");
std::cout << "array.GetNumberOfComponents() = " << array.GetNumberOfComponents() << ", "
<< "numComponents = " << numComponents << "\n";
VTKM_TEST_ASSERT(array.GetNumberOfComponents() == numComponents,
"Dynamic array reports unexpected number of components.");
}