10 #ifndef vtk_m_cont_ArrayHandleCast_h
11 #define vtk_m_cont_ArrayHandleCast_h
27 template <
typename SourceT,
typename SourceStorage>
35 template <
typename FromType,
typename ToType>
47 #if (!(defined(VTKM_CUDA) && (__CUDACC_VER_MAJOR__ < 8)))
48 #if (defined(VTKM_GCC) || defined(VTKM_CLANG))
49 #pragma GCC diagnostic push
50 #pragma GCC diagnostic ignored "-Wunknown-pragmas"
51 #pragma GCC diagnostic ignored "-Wpragmas"
52 #pragma GCC diagnostic ignored "-Wconversion"
53 #pragma GCC diagnostic ignored "-Wfloat-conversion"
54 #endif // gcc || clang
55 #endif //not using cuda < 8
56 #if defined(VTKM_MSVC)
58 #pragma warning(disable : 4244)
62 ToType operator()(
const FromType& val)
const {
return static_cast<ToType
>(val); }
64 #if (!(defined(VTKM_CUDA) && (__CUDACC_VER_MAJOR__ < 8)))
65 #if (defined(VTKM_GCC) || defined(VTKM_CLANG))
66 #pragma GCC diagnostic pop
67 #endif // gcc || clang
68 #endif // not using cuda < 8
69 #if defined(VTKM_MSVC)
77 template <
typename TargetT,
typename SourceT,
typename SourceStorage,
bool... CastFlags>
78 struct ArrayHandleCastTraits;
80 template <
typename TargetT,
typename SourceT,
typename SourceStorage>
81 struct ArrayHandleCastTraits<TargetT, SourceT, SourceStorage>
82 : ArrayHandleCastTraits<TargetT,
85 std::is_convertible<SourceT, TargetT>::value,
86 std::is_convertible<TargetT, SourceT>::value>
91 template <
typename TargetT,
typename SourceT,
typename SourceStorage,
bool CanCastBackward>
92 struct ArrayHandleCastTraits<TargetT, SourceT, SourceStorage, false, CanCastBackward>
94 struct StorageSuperclass : vtkm::cont::internal::UndefinedStorage
96 using PortalType = vtkm::cont::internal::detail::UndefinedArrayPortal<TargetT>;
97 using PortalConstType = vtkm::cont::internal::detail::UndefinedArrayPortal<TargetT>;
102 template <
typename TargetT,
typename SourceT,
typename SourceStorage>
103 struct ArrayHandleCastTraits<TargetT, SourceT, SourceStorage, true, false>
105 using StorageTagSuperclass = StorageTagTransform<vtkm::cont::ArrayHandle<SourceT, SourceStorage>,
106 vtkm::cont::internal::Cast<SourceT, TargetT>>;
107 using StorageSuperclass = vtkm::cont::internal::Storage<TargetT, StorageTagSuperclass>;
111 template <
typename TargetT,
typename SourceT,
typename SourceStorage>
112 struct ArrayHandleCastTraits<TargetT, SourceT, SourceStorage, true, true>
114 using StorageTagSuperclass = StorageTagTransform<vtkm::cont::ArrayHandle<SourceT, SourceStorage>,
115 vtkm::cont::internal::Cast<SourceT, TargetT>,
116 vtkm::cont::internal::Cast<TargetT, SourceT>>;
117 using StorageSuperclass = vtkm::cont::internal::Storage<TargetT, StorageTagSuperclass>;
122 template <
typename TargetT,
typename SourceT,
typename SourceStorage_>
123 struct Storage<TargetT,
vtkm::cont::StorageTagCast<SourceT, SourceStorage_>>
124 : detail::ArrayHandleCastTraits<TargetT, SourceT, SourceStorage_>::StorageSuperclass
127 typename detail::ArrayHandleCastTraits<TargetT, SourceT, SourceStorage_>::StorageSuperclass;
129 using Superclass::Superclass;
140 template <
typename T,
typename ArrayHandleType>
144 StorageTagCast<typename ArrayHandleType::ValueType, typename ArrayHandleType::StorageTag>>
155 typename ArrayHandleType::StorageTag>& handle)
156 : Superclass(Superclass::
StorageType::CreateBuffers(handle))
158 this->ValidateTypeCast<typename ArrayHandleType::ValueType>();
171 return Superclass::StorageType::GetArray(this->
GetBuffers());
176 template <
typename SrcValueType>
177 VTKM_CONT static typename std::enable_if<!std::is_same<T, SrcValueType>::value>::type
180 #ifdef VTKM_ENABLE_LOGGING
181 using DstValueType = T;
184 using SrcLimits = std::numeric_limits<SrcComp>;
185 using DstLimits = std::numeric_limits<DstComp>;
187 const vtkm::Range SrcRange{ SrcLimits::lowest(), SrcLimits::max() };
188 const vtkm::Range DstRange{ DstLimits::lowest(), DstLimits::max() };
190 const bool RangeLoss = (SrcRange.Max > DstRange.Max || SrcRange.Min < DstRange.Min);
191 const bool PrecLoss = SrcLimits::digits > DstLimits::digits;
193 if (RangeLoss && PrecLoss)
196 "ArrayHandleCast: Casting ComponentType of "
197 "%s to %s reduces range and precision.",
198 vtkm::cont::TypeToString<SrcValueType>().c_str(),
199 vtkm::cont::TypeToString<DstValueType>().c_str());
204 "ArrayHandleCast: Casting ComponentType of "
205 "%s to %s reduces range.",
206 vtkm::cont::TypeToString<SrcValueType>().c_str(),
207 vtkm::cont::TypeToString<DstValueType>().c_str());
212 "ArrayHandleCast: Casting ComponentType of "
213 "%s to %s reduces precision.",
214 vtkm::cont::TypeToString<SrcValueType>().c_str(),
215 vtkm::cont::TypeToString<DstValueType>().c_str());
220 template <
typename SrcValueType>
221 VTKM_CONT static typename std::enable_if<std::is_same<T, SrcValueType>::value>::type
231 template <
typename CastType,
typename OriginalType,
typename ArrayType>
232 struct MakeArrayHandleCastImpl
236 VTKM_CONT static ReturnType DoMake(
const ArrayType& array) {
return ReturnType(array); }
239 template <
typename T,
typename ArrayType>
240 struct MakeArrayHandleCastImpl<T, T, ArrayType>
242 using ReturnType = ArrayType;
244 VTKM_CONT static ReturnType DoMake(
const ArrayType& array) {
return array; }
252 template <
typename T,
typename ArrayType>
254 typename detail::MakeArrayHandleCastImpl<T, typename ArrayType::ValueType, ArrayType>::ReturnType
258 using MakeImpl = detail::MakeArrayHandleCastImpl<T, typename ArrayType::ValueType, ArrayType>;
259 return MakeImpl::DoMake(array);
273 template <
typename T,
typename AH>
274 struct SerializableTypeString<
vtkm::cont::ArrayHandleCast<T, AH>>
278 static std::string name =
284 template <
typename T1,
typename T2,
typename S>
285 struct SerializableTypeString<
vtkm::cont::ArrayHandle<T1, vtkm::cont::StorageTagCast<T2, S>>>
286 : SerializableTypeString<vtkm::cont::ArrayHandleCast<T1, vtkm::cont::ArrayHandle<T2, S>>>
295 template <
typename TargetT,
typename SourceT,
typename SourceStorage>
296 struct Serialization<
297 vtkm::cont::ArrayHandle<TargetT, vtkm::cont::StorageTagCast<SourceT, SourceStorage>>>
304 static VTKM_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
315 obj = vtkm::cont::make_ArrayHandleCast<TargetT>(array);
319 template <
typename TargetT,
typename AH>
320 struct Serialization<
vtkm::cont::ArrayHandleCast<TargetT, AH>>
321 : Serialization<vtkm::cont::ArrayHandle<
323 vtkm::cont::StorageTagCast<typename AH::ValueType, typename AH::StorageTag>>>
330 #endif // vtk_m_cont_ArrayHandleCast_h