18 #ifndef viskores_cont_ArrayHandleCast_h
19 #define viskores_cont_ArrayHandleCast_h
35 template <
typename SourceT,
typename SourceStorage>
43 template <
typename FromType,
typename ToType>
44 struct VISKORES_ALWAYS_EXPORT
Cast
55 #if (!(defined(VISKORES_CUDA) && (__CUDACC_VER_MAJOR__ < 8)))
56 #if (defined(VISKORES_GCC) || defined(VISKORES_CLANG))
57 #pragma GCC diagnostic push
58 #pragma GCC diagnostic ignored "-Wunknown-pragmas"
59 #pragma GCC diagnostic ignored "-Wpragmas"
60 #pragma GCC diagnostic ignored "-Wconversion"
61 #pragma GCC diagnostic ignored "-Wfloat-conversion"
62 #endif // gcc || clang
63 #endif //not using cuda < 8
64 #if defined(VISKORES_MSVC)
66 #pragma warning(disable : 4244)
70 ToType operator()(
const FromType& val)
const {
return static_cast<ToType
>(val); }
72 #if (!(defined(VISKORES_CUDA) && (__CUDACC_VER_MAJOR__ < 8)))
73 #if (defined(VISKORES_GCC) || defined(VISKORES_CLANG))
74 #pragma GCC diagnostic pop
75 #endif // gcc || clang
76 #endif // not using cuda < 8
77 #if defined(VISKORES_MSVC)
85 template <
typename TargetT,
typename SourceT,
typename SourceStorage,
bool... CastFlags>
86 struct ArrayHandleCastTraits;
88 template <
typename TargetT,
typename SourceT,
typename SourceStorage>
89 struct ArrayHandleCastTraits<TargetT, SourceT, SourceStorage>
90 : ArrayHandleCastTraits<TargetT,
93 std::is_convertible<SourceT, TargetT>::value,
94 std::is_convertible<TargetT, SourceT>::value>
99 template <
typename TargetT,
typename SourceT,
typename SourceStorage,
bool CanCastBackward>
100 struct ArrayHandleCastTraits<TargetT, SourceT, SourceStorage, false, CanCastBackward>
102 struct StorageSuperclass : viskores::cont::internal::UndefinedStorage
104 using PortalType = viskores::cont::internal::detail::UndefinedArrayPortal<TargetT>;
105 using PortalConstType = viskores::cont::internal::detail::UndefinedArrayPortal<TargetT>;
110 template <
typename TargetT,
typename SourceT,
typename SourceStorage>
111 struct ArrayHandleCastTraits<TargetT, SourceT, SourceStorage, true, false>
113 using StorageTagSuperclass =
114 StorageTagTransform<viskores::cont::ArrayHandle<SourceT, SourceStorage>,
115 viskores::cont::internal::Cast<SourceT, TargetT>>;
116 using StorageSuperclass = viskores::cont::internal::Storage<TargetT, StorageTagSuperclass>;
120 template <
typename TargetT,
typename SourceT,
typename SourceStorage>
121 struct ArrayHandleCastTraits<TargetT, SourceT, SourceStorage, true, true>
123 using StorageTagSuperclass =
124 StorageTagTransform<viskores::cont::ArrayHandle<SourceT, SourceStorage>,
125 viskores::cont::internal::Cast<SourceT, TargetT>,
126 viskores::cont::internal::Cast<TargetT, SourceT>>;
127 using StorageSuperclass = viskores::cont::internal::Storage<TargetT, StorageTagSuperclass>;
132 template <
typename TargetT,
typename SourceT,
typename SourceStorage_>
133 struct Storage<TargetT,
viskores::cont::StorageTagCast<SourceT, SourceStorage_>>
134 : detail::ArrayHandleCastTraits<TargetT, SourceT, SourceStorage_>::StorageSuperclass
137 typename detail::ArrayHandleCastTraits<TargetT, SourceT, SourceStorage_>::StorageSuperclass;
139 using Superclass::Superclass;
150 template <
typename T,
typename ArrayHandleType>
154 StorageTagCast<typename ArrayHandleType::ValueType, typename ArrayHandleType::StorageTag>>
166 typename ArrayHandleType::StorageTag>& handle)
169 this->ValidateTypeCast<typename ArrayHandleType::ValueType>();
181 return Superclass::StorageType::GetArray(this->
GetBuffers());
186 template <
typename SrcValueType>
187 VISKORES_CONT static typename std::enable_if<!std::is_same<T, SrcValueType>::value>::type
190 #ifdef VISKORES_ENABLE_LOGGING
191 using DstValueType = T;
194 using SrcLimits = std::numeric_limits<SrcComp>;
195 using DstLimits = std::numeric_limits<DstComp>;
197 const viskores::Range SrcRange{ SrcLimits::lowest(), SrcLimits::max() };
198 const viskores::Range DstRange{ DstLimits::lowest(), DstLimits::max() };
200 const bool RangeLoss = (SrcRange.Max > DstRange.Max || SrcRange.Min < DstRange.Min);
201 const bool PrecLoss = SrcLimits::digits > DstLimits::digits;
203 if (RangeLoss && PrecLoss)
206 "ArrayHandleCast: Casting ComponentType of "
207 "%s to %s reduces range and precision.",
208 viskores::cont::TypeToString<SrcValueType>().c_str(),
209 viskores::cont::TypeToString<DstValueType>().c_str());
214 "ArrayHandleCast: Casting ComponentType of "
215 "%s to %s reduces range.",
216 viskores::cont::TypeToString<SrcValueType>().c_str(),
217 viskores::cont::TypeToString<DstValueType>().c_str());
222 "ArrayHandleCast: Casting ComponentType of "
223 "%s to %s reduces precision.",
224 viskores::cont::TypeToString<SrcValueType>().c_str(),
225 viskores::cont::TypeToString<DstValueType>().c_str());
230 template <
typename SrcValueType>
231 VISKORES_CONT static typename std::enable_if<std::is_same<T, SrcValueType>::value>::type
241 template <
typename CastType,
typename OriginalType,
typename ArrayType>
242 struct MakeArrayHandleCastImpl
246 VISKORES_CONT static ReturnType DoMake(
const ArrayType& array) {
return ReturnType(array); }
249 template <
typename T,
typename ArrayType>
250 struct MakeArrayHandleCastImpl<T, T, ArrayType>
252 using ReturnType = ArrayType;
254 VISKORES_CONT static ReturnType DoMake(
const ArrayType& array) {
return array; }
262 template <
typename T,
typename ArrayType>
264 typename detail::MakeArrayHandleCastImpl<T, typename ArrayType::ValueType, ArrayType>::ReturnType
268 using MakeImpl = detail::MakeArrayHandleCastImpl<T, typename ArrayType::ValueType, ArrayType>;
269 return MakeImpl::DoMake(array);
283 template <
typename T,
typename AH>
284 struct SerializableTypeString<
viskores::cont::ArrayHandleCast<T, AH>>
288 static std::string name =
294 template <
typename T1,
typename T2,
typename S>
295 struct SerializableTypeString<
296 viskores::cont::ArrayHandle<T1, viskores::cont::StorageTagCast<T2, S>>>
297 : SerializableTypeString<viskores::cont::ArrayHandleCast<T1, viskores::cont::ArrayHandle<T2, S>>>
306 template <
typename TargetT,
typename SourceT,
typename SourceStorage>
307 struct Serialization<
308 viskores::cont::ArrayHandle<TargetT, viskores::cont::StorageTagCast<SourceT, SourceStorage>>>
315 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
326 obj = viskores::cont::make_ArrayHandleCast<TargetT>(array);
330 template <
typename TargetT,
typename AH>
331 struct Serialization<
viskores::cont::ArrayHandleCast<TargetT, AH>>
332 : Serialization<viskores::cont::ArrayHandle<
334 viskores::cont::StorageTagCast<typename AH::ValueType, typename AH::StorageTag>>>
341 #endif // viskores_cont_ArrayHandleCast_h