mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-16 17:22:55 +00:00
Simplify ArrayHandleTransform template
This commit is contained in:
parent
06d67580a7
commit
6ce2a43d41
@ -49,8 +49,7 @@ struct VTKM_ALWAYS_EXPORT Cast
|
||||
///
|
||||
template <typename T, typename ArrayHandleType>
|
||||
class ArrayHandleCast
|
||||
: public vtkm::cont::ArrayHandleTransform<T,
|
||||
ArrayHandleType,
|
||||
: public vtkm::cont::ArrayHandleTransform<ArrayHandleType,
|
||||
internal::Cast<typename ArrayHandleType::ValueType, T>,
|
||||
internal::Cast<T, typename ArrayHandleType::ValueType>>
|
||||
{
|
||||
@ -58,8 +57,7 @@ public:
|
||||
VTKM_ARRAY_HANDLE_SUBCLASS(
|
||||
ArrayHandleCast,
|
||||
(ArrayHandleCast<T, ArrayHandleType>),
|
||||
(vtkm::cont::ArrayHandleTransform<T,
|
||||
ArrayHandleType,
|
||||
(vtkm::cont::ArrayHandleTransform<ArrayHandleType,
|
||||
internal::Cast<typename ArrayHandleType::ValueType, T>,
|
||||
internal::Cast<T, typename ArrayHandleType::ValueType>>));
|
||||
|
||||
|
@ -178,19 +178,28 @@ namespace cont
|
||||
namespace internal
|
||||
{
|
||||
|
||||
template <typename ValueType,
|
||||
typename ArrayHandleType,
|
||||
template <typename ArrayHandleType,
|
||||
typename FunctorType,
|
||||
typename InverseFunctorType = NullFunctorType>
|
||||
struct VTKM_ALWAYS_EXPORT StorageTagTransform
|
||||
{
|
||||
#if defined(VTKM_MSVC) && (_MSC_VER == 1800) // workaround for VS2013
|
||||
private:
|
||||
using ArrayHandleValueType = typename ArrayHandleType::ValueType;
|
||||
|
||||
public:
|
||||
using ValueType = decltype(FunctorType{}(ArrayHandleValueType{}));
|
||||
#else
|
||||
using ValueType = decltype(FunctorType{}(typename ArrayHandleType::ValueType{}));
|
||||
#endif
|
||||
};
|
||||
|
||||
template <typename T, typename ArrayHandleType, typename FunctorType>
|
||||
class Storage<T, StorageTagTransform<T, ArrayHandleType, FunctorType, NullFunctorType>>
|
||||
template <typename ArrayHandleType, typename FunctorType>
|
||||
class Storage<typename StorageTagTransform<ArrayHandleType, FunctorType>::ValueType,
|
||||
StorageTagTransform<ArrayHandleType, FunctorType>>
|
||||
{
|
||||
public:
|
||||
typedef T ValueType;
|
||||
typedef typename StorageTagTransform<ArrayHandleType, FunctorType>::ValueType ValueType;
|
||||
|
||||
// This is meant to be invalid. Because Transform arrays are read only, you
|
||||
// should only be able to use the const version.
|
||||
@ -276,11 +285,14 @@ private:
|
||||
bool Valid;
|
||||
};
|
||||
|
||||
template <typename T, typename ArrayHandleType, typename FunctorType, typename InverseFunctorType>
|
||||
class Storage<T, StorageTagTransform<T, ArrayHandleType, FunctorType, InverseFunctorType>>
|
||||
template <typename ArrayHandleType, typename FunctorType, typename InverseFunctorType>
|
||||
class Storage<
|
||||
typename StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>::ValueType,
|
||||
StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>>
|
||||
{
|
||||
public:
|
||||
typedef T ValueType;
|
||||
typedef typename StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>::ValueType
|
||||
ValueType;
|
||||
|
||||
typedef vtkm::exec::internal::ArrayPortalTransform<ValueType,
|
||||
typename ArrayHandleType::PortalControl,
|
||||
@ -369,14 +381,16 @@ private:
|
||||
bool Valid;
|
||||
};
|
||||
|
||||
template <typename T, typename ArrayHandleType, typename FunctorType, typename Device>
|
||||
class ArrayTransfer<T, StorageTagTransform<T, ArrayHandleType, FunctorType>, Device>
|
||||
template <typename ArrayHandleType, typename FunctorType, typename Device>
|
||||
class ArrayTransfer<typename StorageTagTransform<ArrayHandleType, FunctorType>::ValueType,
|
||||
StorageTagTransform<ArrayHandleType, FunctorType>,
|
||||
Device>
|
||||
{
|
||||
typedef StorageTagTransform<T, ArrayHandleType, FunctorType> StorageTag;
|
||||
typedef vtkm::cont::internal::Storage<T, StorageTag> StorageType;
|
||||
typedef StorageTagTransform<ArrayHandleType, FunctorType> StorageTag;
|
||||
|
||||
public:
|
||||
typedef T ValueType;
|
||||
typedef typename StorageTagTransform<ArrayHandleType, FunctorType>::ValueType ValueType;
|
||||
typedef vtkm::cont::internal::Storage<ValueType, StorageTag> StorageType;
|
||||
|
||||
typedef typename StorageType::PortalType PortalControl;
|
||||
typedef typename StorageType::PortalConstType PortalConstControl;
|
||||
@ -441,20 +455,20 @@ private:
|
||||
FunctorType Functor;
|
||||
};
|
||||
|
||||
template <typename T,
|
||||
typename ArrayHandleType,
|
||||
template <typename ArrayHandleType,
|
||||
typename FunctorType,
|
||||
typename InverseFunctorType,
|
||||
typename Device>
|
||||
class ArrayTransfer<T,
|
||||
StorageTagTransform<T, ArrayHandleType, FunctorType, InverseFunctorType>,
|
||||
Device>
|
||||
class ArrayTransfer<
|
||||
typename StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>::ValueType,
|
||||
StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>,
|
||||
Device>
|
||||
{
|
||||
typedef StorageTagTransform<T, ArrayHandleType, FunctorType, InverseFunctorType> StorageTag;
|
||||
typedef vtkm::cont::internal::Storage<T, StorageTag> StorageType;
|
||||
typedef StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType> StorageTag;
|
||||
|
||||
public:
|
||||
typedef T ValueType;
|
||||
typedef typename StorageTagTransform<ArrayHandleType, FunctorType>::ValueType ValueType;
|
||||
typedef vtkm::cont::internal::Storage<ValueType, StorageTag> StorageType;
|
||||
|
||||
typedef typename StorageType::PortalType PortalControl;
|
||||
typedef typename StorageType::PortalConstType PortalConstControl;
|
||||
@ -536,16 +550,16 @@ private:
|
||||
/// the functor operator should work in both the control and execution
|
||||
/// environments.
|
||||
///
|
||||
template <typename T,
|
||||
typename ArrayHandleType,
|
||||
template <typename ArrayHandleType,
|
||||
typename FunctorType,
|
||||
typename InverseFunctorType = internal::NullFunctorType>
|
||||
class ArrayHandleTransform;
|
||||
|
||||
template <typename T, typename ArrayHandleType, typename FunctorType>
|
||||
class ArrayHandleTransform<T, ArrayHandleType, FunctorType, internal::NullFunctorType>
|
||||
: public vtkm::cont::ArrayHandle<T,
|
||||
internal::StorageTagTransform<T, ArrayHandleType, FunctorType>>
|
||||
template <typename ArrayHandleType, typename FunctorType>
|
||||
class ArrayHandleTransform<ArrayHandleType, FunctorType, internal::NullFunctorType>
|
||||
: public vtkm::cont::ArrayHandle<
|
||||
typename internal::StorageTagTransform<ArrayHandleType, FunctorType>::ValueType,
|
||||
internal::StorageTagTransform<ArrayHandleType, FunctorType>>
|
||||
{
|
||||
// If the following line gives a compile error, then the ArrayHandleType
|
||||
// template argument is not a valid ArrayHandle type.
|
||||
@ -554,11 +568,13 @@ class ArrayHandleTransform<T, ArrayHandleType, FunctorType, internal::NullFuncto
|
||||
public:
|
||||
VTKM_ARRAY_HANDLE_SUBCLASS(
|
||||
ArrayHandleTransform,
|
||||
(ArrayHandleTransform<T, ArrayHandleType, FunctorType>),
|
||||
(vtkm::cont::ArrayHandle<T, internal::StorageTagTransform<T, ArrayHandleType, FunctorType>>));
|
||||
(ArrayHandleTransform<ArrayHandleType, FunctorType>),
|
||||
(vtkm::cont::ArrayHandle<
|
||||
typename internal::StorageTagTransform<ArrayHandleType, FunctorType>::ValueType,
|
||||
internal::StorageTagTransform<ArrayHandleType, FunctorType>>));
|
||||
|
||||
private:
|
||||
typedef vtkm::cont::internal::Storage<T, StorageTag> StorageType;
|
||||
typedef vtkm::cont::internal::Storage<ValueType, StorageTag> StorageType;
|
||||
|
||||
public:
|
||||
VTKM_CONT
|
||||
@ -571,35 +587,36 @@ public:
|
||||
/// make_ArrayHandleTransform is convenience function to generate an
|
||||
/// ArrayHandleTransform. It takes in an ArrayHandle and a functor
|
||||
/// to apply to each element of the Handle.
|
||||
|
||||
template <typename T, typename HandleType, typename FunctorType>
|
||||
VTKM_CONT vtkm::cont::ArrayHandleTransform<T, HandleType, FunctorType> make_ArrayHandleTransform(
|
||||
template <typename HandleType, typename FunctorType>
|
||||
VTKM_CONT vtkm::cont::ArrayHandleTransform<HandleType, FunctorType> make_ArrayHandleTransform(
|
||||
HandleType handle,
|
||||
FunctorType functor)
|
||||
{
|
||||
return ArrayHandleTransform<T, HandleType, FunctorType>(handle, functor);
|
||||
return ArrayHandleTransform<HandleType, FunctorType>(handle, functor);
|
||||
}
|
||||
|
||||
// ArrayHandleTransform with inverse functors enabled (no need to subclass from
|
||||
// ArrayHandleTransform without inverse functors: nothing to inherit).
|
||||
template <typename T, typename ArrayHandleType, typename FunctorType, typename InverseFunctorType>
|
||||
template <typename ArrayHandleType, typename FunctorType, typename InverseFunctorType>
|
||||
class ArrayHandleTransform
|
||||
: public vtkm::cont::ArrayHandle<
|
||||
T,
|
||||
internal::StorageTagTransform<T, ArrayHandleType, FunctorType, InverseFunctorType>>
|
||||
typename internal::StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>::
|
||||
ValueType,
|
||||
internal::StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>>
|
||||
{
|
||||
VTKM_IS_ARRAY_HANDLE(ArrayHandleType);
|
||||
|
||||
public:
|
||||
VTKM_ARRAY_HANDLE_SUBCLASS(
|
||||
ArrayHandleTransform,
|
||||
(ArrayHandleTransform<T, ArrayHandleType, FunctorType, InverseFunctorType>),
|
||||
(ArrayHandleTransform<ArrayHandleType, FunctorType, InverseFunctorType>),
|
||||
(vtkm::cont::ArrayHandle<
|
||||
T,
|
||||
internal::StorageTagTransform<T, ArrayHandleType, FunctorType, InverseFunctorType>>));
|
||||
typename internal::StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>::
|
||||
ValueType,
|
||||
internal::StorageTagTransform<ArrayHandleType, FunctorType, InverseFunctorType>>));
|
||||
|
||||
private:
|
||||
typedef vtkm::cont::internal::Storage<T, StorageTag> StorageType;
|
||||
typedef vtkm::cont::internal::Storage<ValueType, StorageTag> StorageType;
|
||||
|
||||
public:
|
||||
ArrayHandleTransform(const ArrayHandleType& handle,
|
||||
@ -610,14 +627,15 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, typename HandleType, typename FunctorType, typename InverseFunctorType>
|
||||
VTKM_CONT vtkm::cont::ArrayHandleTransform<T, HandleType, FunctorType, InverseFunctorType>
|
||||
template <typename HandleType, typename FunctorType, typename InverseFunctorType>
|
||||
VTKM_CONT vtkm::cont::ArrayHandleTransform<HandleType, FunctorType, InverseFunctorType>
|
||||
make_ArrayHandleTransform(HandleType handle, FunctorType functor, InverseFunctorType inverseFunctor)
|
||||
{
|
||||
return ArrayHandleTransform<T, HandleType, FunctorType, InverseFunctorType>(
|
||||
return ArrayHandleTransform<HandleType, FunctorType, InverseFunctorType>(
|
||||
handle, functor, inverseFunctor);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace vtkm::cont
|
||||
|
||||
#endif //vtk_m_cont_ArrayHandleTransform_h
|
||||
|
@ -411,8 +411,8 @@ private:
|
||||
FunctorType functor(2.0);
|
||||
|
||||
vtkm::cont::ArrayHandle<ValueType> input;
|
||||
vtkm::cont::ArrayHandleTransform<ValueType, vtkm::cont::ArrayHandle<ValueType>, FunctorType>
|
||||
transformed = vtkm::cont::make_ArrayHandleTransform<ValueType>(input, functor);
|
||||
vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandle<ValueType>, FunctorType>
|
||||
transformed = vtkm::cont::make_ArrayHandleTransform(input, functor);
|
||||
|
||||
input.Allocate(length);
|
||||
SetPortal(input.GetPortalControl());
|
||||
@ -456,11 +456,8 @@ private:
|
||||
|
||||
vtkm::cont::ArrayHandleCounting<ValueType> counting(start, ValueType(1), length);
|
||||
|
||||
vtkm::cont::ArrayHandleTransform<OutputValueType,
|
||||
vtkm::cont::ArrayHandleCounting<ValueType>,
|
||||
FunctorType>
|
||||
countingTransformed =
|
||||
vtkm::cont::make_ArrayHandleTransform<OutputValueType>(counting, functor);
|
||||
vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleCounting<ValueType>, FunctorType>
|
||||
countingTransformed = vtkm::cont::make_ArrayHandleTransform(counting, functor);
|
||||
|
||||
vtkm::cont::printSummary_ArrayHandle(countingTransformed, std::cout);
|
||||
std::cout << std::endl;
|
||||
|
@ -85,9 +85,8 @@ class TestingVirtualObjectCache
|
||||
{
|
||||
private:
|
||||
using FloatArrayHandle = vtkm::cont::ArrayHandle<vtkm::FloatDefault>;
|
||||
using ArrayTransform = vtkm::cont::ArrayHandleTransform<vtkm::FloatDefault,
|
||||
FloatArrayHandle,
|
||||
virtual_object_detail::Transformer>;
|
||||
using ArrayTransform =
|
||||
vtkm::cont::ArrayHandleTransform<FloatArrayHandle, virtual_object_detail::Transformer>;
|
||||
using TransformerCache = vtkm::cont::VirtualObjectCache<virtual_object_detail::Transformer>;
|
||||
|
||||
class TestStage1
|
||||
|
@ -117,13 +117,10 @@ struct TransformTests
|
||||
typedef typename vtkm::VecTraits<InputValueType>::ComponentType OutputValueType;
|
||||
typedef MySquare<OutputValueType> FunctorType;
|
||||
|
||||
typedef vtkm::cont::ArrayHandleTransform<OutputValueType,
|
||||
vtkm::cont::ArrayHandle<InputValueType>,
|
||||
FunctorType>
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandle<InputValueType>, FunctorType>
|
||||
TransformHandle;
|
||||
|
||||
typedef vtkm::cont::ArrayHandleTransform<OutputValueType,
|
||||
vtkm::cont::ArrayHandleCounting<InputValueType>,
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleCounting<InputValueType>,
|
||||
FunctorType>
|
||||
CountingTransformHandle;
|
||||
|
||||
@ -138,7 +135,7 @@ struct TransformTests
|
||||
vtkm::cont::ArrayHandleCounting<InputValueType> counting = vtkm::cont::make_ArrayHandleCounting(
|
||||
InputValueType(OutputValueType(0)), InputValueType(1), ARRAY_SIZE);
|
||||
CountingTransformHandle countingTransformed =
|
||||
vtkm::cont::make_ArrayHandleTransform<OutputValueType>(counting, functor);
|
||||
vtkm::cont::make_ArrayHandleTransform(counting, functor);
|
||||
|
||||
CheckControlPortals(counting, countingTransformed);
|
||||
|
||||
|
@ -389,8 +389,8 @@ void TryCastToArrayHandle()
|
||||
CheckCastToArrayHandle(vtkm::cont::make_ArrayHandlePermutation(countingArray, array));
|
||||
|
||||
std::cout << " Transform array handle." << std::endl;
|
||||
CheckCastToArrayHandle(vtkm::cont::make_ArrayHandleTransform<vtkm::FloatDefault>(
|
||||
countingArray, TestValueFunctor<vtkm::FloatDefault>()));
|
||||
CheckCastToArrayHandle(
|
||||
vtkm::cont::make_ArrayHandleTransform(countingArray, TestValueFunctor<vtkm::FloatDefault>()));
|
||||
|
||||
std::cout << " Uniform point coordinates array handle." << std::endl;
|
||||
CheckCastToArrayHandle(vtkm::cont::ArrayHandleUniformPointCoordinates(vtkm::Id3(ARRAY_SIZE)));
|
||||
|
@ -206,18 +206,15 @@ class MakeRadiantDataSet
|
||||
{
|
||||
public:
|
||||
typedef vtkm::cont::ArrayHandleUniformPointCoordinates CoordinateArrayHandle;
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::Float32,
|
||||
vtkm::cont::ArrayHandleUniformPointCoordinates,
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleUniformPointCoordinates,
|
||||
EuclideanNorm>
|
||||
DataArrayHandle;
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::Id,
|
||||
vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
CubeGridConnectivity>
|
||||
ConnectivityArrayHandle;
|
||||
|
||||
typedef vtkm::cont::CellSetSingleType<
|
||||
vtkm::cont::ArrayHandleTransform<vtkm::Id,
|
||||
vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
CubeGridConnectivity>::StorageTag>
|
||||
CellSet;
|
||||
|
||||
@ -229,8 +226,7 @@ class PolicyRadiantDataSet : public vtkm::filter::PolicyBase<PolicyRadiantDataSe
|
||||
typedef MakeRadiantDataSet::DataArrayHandle DataHandleType;
|
||||
typedef MakeRadiantDataSet::ConnectivityArrayHandle CountingHandleType;
|
||||
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::Id,
|
||||
vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
CubeGridConnectivity>
|
||||
TransformHandleType;
|
||||
|
||||
|
@ -523,9 +523,7 @@ public:
|
||||
{
|
||||
// Evaluate the implicit function on the input coordinates using
|
||||
// ArrayHandleTransform
|
||||
vtkm::cont::ArrayHandleTransform<vtkm::FloatDefault,
|
||||
ArrayHandleType,
|
||||
vtkm::exec::ImplicitFunctionValue>
|
||||
vtkm::cont::ArrayHandleTransform<ArrayHandleType, vtkm::exec::ImplicitFunctionValue>
|
||||
clipScalars(handle, this->Function);
|
||||
|
||||
// Clip at locations where the implicit function evaluates to 0
|
||||
|
@ -469,7 +469,7 @@ private:
|
||||
using namespace extractstructured::internal;
|
||||
using Algorithm = vtkm::cont::DeviceAdapterAlgorithm<DeviceAdapter>;
|
||||
|
||||
auto validPointsFlat = vtkm::cont::make_ArrayHandleTransform<vtkm::Id>(
|
||||
auto validPointsFlat = vtkm::cont::make_ArrayHandleTransform(
|
||||
this->ValidPoints, LogicalToFlatIndex<Dimensionality>(this->InputDimensions));
|
||||
Algorithm::Copy(make_ArrayHandlePermutation(validPointsFlat, in), out);
|
||||
}
|
||||
@ -483,7 +483,7 @@ private:
|
||||
using Algorithm = vtkm::cont::DeviceAdapterAlgorithm<DeviceAdapter>;
|
||||
|
||||
auto inputCellDimensions = this->InputDimensions - vtkm::Id3(1);
|
||||
auto validCellsFlat = vtkm::cont::make_ArrayHandleTransform<vtkm::Id>(
|
||||
auto validCellsFlat = vtkm::cont::make_ArrayHandleTransform(
|
||||
this->ValidCells, LogicalToFlatIndex<Dimensionality>(inputCellDimensions));
|
||||
Algorithm::Copy(make_ArrayHandlePermutation(validCellsFlat, in), out);
|
||||
}
|
||||
|
@ -206,18 +206,15 @@ class MakeRadiantDataSet
|
||||
{
|
||||
public:
|
||||
typedef vtkm::cont::ArrayHandleUniformPointCoordinates CoordinateArrayHandle;
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::Float32,
|
||||
vtkm::cont::ArrayHandleUniformPointCoordinates,
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleUniformPointCoordinates,
|
||||
EuclideanNorm>
|
||||
DataArrayHandle;
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::Id,
|
||||
vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
typedef vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
CubeGridConnectivity>
|
||||
ConnectivityArrayHandle;
|
||||
|
||||
typedef vtkm::cont::CellSetSingleType<
|
||||
vtkm::cont::ArrayHandleTransform<vtkm::Id,
|
||||
vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
vtkm::cont::ArrayHandleTransform<vtkm::cont::ArrayHandleCounting<vtkm::Id>,
|
||||
CubeGridConnectivity>::StorageTag>
|
||||
CellSet;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user