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:
parent
2d09dd4fac
commit
546a1d14a2
@ -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.");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user