mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-08 13:23:51 +00:00
Fix ambiguous make_ArrayHandleCast template
In a previous commit I made a version of make_ArrayHandleCast that returned the same array if no cast was needed. That should shorten template type names and make them easier to read. However, some compilers were having trouble distinguishing between the two versions I had created. This change uses an internal structure to make the resolution easier.
This commit is contained in:
parent
091881d2a4
commit
aa0a7bdceb
@ -67,24 +67,38 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template <typename CastType, typename OriginalType, typename ArrayType>
|
||||
struct MakeArrayHandleCastImpl
|
||||
{
|
||||
using ReturnType = vtkm::cont::ArrayHandleCast<CastType, ArrayType>;
|
||||
|
||||
VTKM_CONT static ReturnType DoMake(const ArrayType& array) { return ReturnType(array); }
|
||||
};
|
||||
|
||||
template <typename T, typename ArrayType>
|
||||
struct MakeArrayHandleCastImpl<T, T, ArrayType>
|
||||
{
|
||||
using ReturnType = ArrayType;
|
||||
|
||||
VTKM_CONT static ReturnType DoMake(const ArrayType& array) { return array; }
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
/// make_ArrayHandleCast is convenience function to generate an
|
||||
/// ArrayHandleCast.
|
||||
///
|
||||
template <typename T, typename HandleType>
|
||||
VTKM_CONT ArrayHandleCast<T, HandleType> make_ArrayHandleCast(const HandleType& handle,
|
||||
const T& = T())
|
||||
template <typename T, typename ArrayType>
|
||||
VTKM_CONT
|
||||
typename detail::MakeArrayHandleCastImpl<T, typename ArrayType::ValueType, ArrayType>::ReturnType
|
||||
make_ArrayHandleCast(const ArrayType& array, const T& = T())
|
||||
{
|
||||
return ArrayHandleCast<T, HandleType>(handle);
|
||||
}
|
||||
|
||||
/// Overriden version of \c make_ArrayHandleCast that returns the original object type.
|
||||
///
|
||||
template <typename T, typename Storage>
|
||||
VTKM_CONT vtkm::cont::ArrayHandle<T, Storage> make_ArrayHandleCast(
|
||||
const vtkm::cont::ArrayHandle<T, Storage>& handle,
|
||||
const T& = T())
|
||||
{
|
||||
return handle;
|
||||
VTKM_IS_ARRAY_HANDLE(ArrayType);
|
||||
using MakeImpl = detail::MakeArrayHandleCastImpl<T, typename ArrayType::ValueType, ArrayType>;
|
||||
return MakeImpl::DoMake(array);
|
||||
}
|
||||
}
|
||||
} // namespace vtkm::cont
|
||||
|
Loading…
Reference in New Issue
Block a user