Simplify ArrayHandleTransform template

This commit is contained in:
Sujin Philip 2017-05-30 10:00:01 -04:00
parent 06d67580a7
commit 6ce2a43d41
10 changed files with 85 additions and 85 deletions

@ -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;