18 #ifndef viskores_cont_UnknownArrayHandle_h
19 #define viskores_cont_UnknownArrayHandle_h
47 template <
typename T,
typename S>
48 void UnknownAHDelete(
void* mem)
51 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
55 template <
typename T,
typename S>
56 const std::vector<viskores::cont::internal::Buffer>& UnknownAHBuffers(
void* mem)
59 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
63 template <
typename T,
typename S>
64 void* UnknownAHNewInstance()
69 template <
typename T,
typename S>
73 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
77 template <
typename T,
typename S>
81 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
86 template <
typename T,
typename S>
87 inline auto UnknownAHNumberOfComponentsImpl(
void* mem)
88 -> decltype(viskores::cont::internal::Storage<T, S>::GetNumberOfComponents(
89 std::vector<viskores::cont::internal::Buffer>()))
92 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
93 return viskores::cont::internal::Storage<T, S>::GetNumberOfComponents(arrayHandle->GetBuffers());
97 template <
typename T,
typename S>
106 template <
typename T,
typename S>
110 return UnknownAHNumberOfComponentsFlat<T, S>(mem);
113 template <
typename T,
typename S>
116 return UnknownAHNumberOfComponentsImpl<T, S>(mem,
120 template <
typename T,
typename S>
121 void UnknownAHAllocate(
void* mem,
127 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
128 arrayHandle->
Allocate(numValues, preserve, token);
131 template <
typename T,
typename S>
132 void UnknownAHShallowCopy(
const void* sourceMem,
void* destinationMem)
135 const AH* source =
reinterpret_cast<const AH*
>(sourceMem);
136 AH* destination =
reinterpret_cast<AH*
>(destinationMem);
137 *destination = *source;
140 template <
typename T,
typename S>
141 void UnknownAHDeepCopy(
const void* sourceMem,
void* destinationMem)
144 const AH* source =
reinterpret_cast<const AH*
>(sourceMem);
145 AH* destination =
reinterpret_cast<AH*
>(destinationMem);
149 template <
typename T,
typename S>
150 std::vector<viskores::cont::internal::Buffer> UnknownAHExtractComponent(
156 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
157 auto componentArray =
159 return componentArray.GetBuffers();
162 template <
typename T,
typename S>
163 void UnknownAHReleaseResources(
void* mem)
166 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
170 template <
typename T,
typename S>
171 void UnknownAHReleaseResourcesExecution(
void* mem)
174 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
178 template <
typename T,
typename S>
179 void UnknownAHPrintSummary(
void* mem, std::ostream& out,
bool full)
182 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
186 struct VISKORES_CONT_EXPORT UnknownAHContainer;
188 struct MakeUnknownAHContainerFunctor
190 template <
typename T,
typename S>
191 std::shared_ptr<UnknownAHContainer> operator()(
195 struct VISKORES_CONT_EXPORT UnknownAHComponentInfo
197 std::type_index Type;
203 UnknownAHComponentInfo() =
delete;
205 bool operator==(
const UnknownAHComponentInfo& rhs);
207 template <
typename T>
208 static UnknownAHComponentInfo Make()
210 return UnknownAHComponentInfo{
typeid(T),
211 std::is_integral<T>::value,
212 std::is_floating_point<T>::value,
213 std::is_signed<T>::value,
218 UnknownAHComponentInfo(std::type_index&& type,
223 : Type(std::move(type))
224 , IsIntegral(isIntegral)
232 struct VISKORES_CONT_EXPORT UnknownAHContainer
234 void* ArrayHandlePointer;
236 std::type_index ValueType;
237 std::type_index StorageType;
238 UnknownAHComponentInfo BaseComponentType;
240 using DeleteType = void(
void*);
241 DeleteType* DeleteFunction;
243 using BuffersType =
const std::vector<viskores::cont::internal::Buffer>&(
void*);
244 BuffersType* Buffers;
246 using NewInstanceType =
void*();
247 NewInstanceType* NewInstance;
249 using NewInstanceBasicType = std::shared_ptr<UnknownAHContainer>(
void*);
250 NewInstanceBasicType* NewInstanceBasic;
251 NewInstanceBasicType* NewInstanceFloatBasic;
254 NumberOfValuesType* NumberOfValues;
257 NumberOfComponentsType* NumberOfComponents;
258 NumberOfComponentsType* NumberOfComponentsFlat;
261 AllocateType* Allocate;
263 using ShallowCopyType = void(
const void*,
void*);
264 ShallowCopyType* ShallowCopy;
266 using DeepCopyType = void(
const void*,
void*);
267 DeepCopyType* DeepCopy;
269 using ExtractComponentType = std::vector<viskores::cont::internal::Buffer>(
void*,
272 ExtractComponentType* ExtractComponent;
274 using ReleaseResourcesType = void(
void*);
275 ReleaseResourcesType* ReleaseResources;
276 ReleaseResourcesType* ReleaseResourcesExecution;
278 using PrintSummaryType = void(
void*, std::ostream&,
bool);
279 PrintSummaryType* PrintSummary;
281 void operator=(
const UnknownAHContainer&) =
delete;
283 ~UnknownAHContainer() { this->DeleteFunction(this->ArrayHandlePointer); }
285 std::shared_ptr<UnknownAHContainer> MakeNewInstance()
const;
287 template <
typename T,
typename S>
290 return std::shared_ptr<UnknownAHContainer>(
new UnknownAHContainer(array));
293 template <
typename TargetT,
typename SourceT,
typename SourceS>
294 static std::shared_ptr<UnknownAHContainer> Make(
303 template <
typename T,
typename... Ss>
304 static std::shared_ptr<UnknownAHContainer> Make(
309 .GetArrayHandleVariant();
310 if (variant.IsValid())
312 return variant.CastAndCall(MakeUnknownAHContainerFunctor{});
316 return std::shared_ptr<UnknownAHContainer>{};
321 UnknownAHContainer(
const UnknownAHContainer&) =
default;
323 template <
typename T,
typename S>
327 template <
typename T,
typename S>
328 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceBasic(
void*,
333 template <
typename T,
typename S>
334 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceBasic(
void* mem,
338 if (numComponents < 1)
342 viskores::cont::TypeToString<T>());
345 return UnknownAHContainer::Make(
348 template <
typename T,
typename S>
349 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceBasic(
void* mem)
354 template <
typename T,
typename S>
355 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(
void*,
362 template <
typename T,
typename S>
363 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(
368 if (numComponents < 1)
372 viskores::cont::TypeToString<T>());
374 return UnknownAHContainer::Make(
377 template <
typename T,
typename S>
378 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(
void* mem)
383 template <
typename T,
typename S>
385 : ArrayHandlePointer(new
viskores::cont::ArrayHandle<T, S>(array))
386 , ValueType(typeid(T))
387 , StorageType(typeid(S))
389 UnknownAHComponentInfo::Make<typename
viskores::VecTraits<T>::BaseComponentType>())
390 , DeleteFunction(detail::UnknownAHDelete<T, S>)
391 , Buffers(detail::UnknownAHBuffers<T, S>)
392 , NewInstance(detail::UnknownAHNewInstance<T, S>)
393 , NewInstanceBasic(detail::UnknownAHNewInstanceBasic<T, S>)
394 , NewInstanceFloatBasic(detail::UnknownAHNewInstanceFloatBasic<T, S>)
395 , NumberOfValues(detail::UnknownAHNumberOfValues<T, S>)
396 , NumberOfComponents(detail::UnknownAHNumberOfComponents<T, S>)
397 , NumberOfComponentsFlat(detail::UnknownAHNumberOfComponentsFlat<T, S>)
398 , Allocate(detail::UnknownAHAllocate<T, S>)
399 , ShallowCopy(detail::UnknownAHShallowCopy<T, S>)
400 , DeepCopy(detail::UnknownAHDeepCopy<T, S>)
401 , ExtractComponent(detail::UnknownAHExtractComponent<T, S>)
402 , ReleaseResources(detail::UnknownAHReleaseResources<T, S>)
403 , ReleaseResourcesExecution(detail::UnknownAHReleaseResourcesExecution<T, S>)
404 , PrintSummary(detail::UnknownAHPrintSummary<T, S>)
408 template <
typename T,
typename S>
409 inline std::shared_ptr<UnknownAHContainer> MakeUnknownAHContainerFunctor::operator()(
412 return UnknownAHContainer::Make(array);
418 template <
typename ValueTypeList,
typename StorageTypeList>
419 class UncertainArrayHandle;
455 VISKORES_CONT bool IsValueTypeImpl(std::type_index type)
const;
456 VISKORES_CONT bool IsStorageTypeImpl(std::type_index type)
const;
457 VISKORES_CONT bool IsBaseComponentTypeImpl(
const detail::UnknownAHComponentInfo& type)
const;
462 template <
typename T,
typename S>
464 : Container(detail::UnknownAHContainer::Make(array))
535 template <
typename ValueType>
538 return this->IsValueTypeImpl(
typeid(ValueType));
543 template <
typename StorageType>
546 return this->IsStorageTypeImpl(
typeid(StorageType));
560 template <
typename BaseComponentType>
563 return this->IsBaseComponentTypeImpl(detail::UnknownAHComponentInfo::Make<BaseComponentType>());
578 template <
typename ArrayHandleType>
582 return (this->IsValueType<typename ArrayHandleType::ValueType>() &&
583 this->IsStorageType<typename ArrayHandleType::StorageTag>());
594 template <
typename NewValueTypeList,
typename NewStorageTypeList>
596 ResetTypes(NewValueTypeList = NewValueTypeList{},
597 NewStorageTypeList = NewStorageTypeList{})
const;
647 template <
typename ArrayHandleType>
660 template <
typename T,
typename S>
664 if (!this->IsType<ArrayType>())
670 array = *
reinterpret_cast<ArrayType*
>(this->Container->ArrayHandlePointer);
678 template <
typename T,
typename S>
681 this->BaseAsArrayHandle(array);
684 template <
typename T>
687 template <
typename T,
typename... Ss>
691 template <
typename TargetT,
typename SourceT,
typename SourceS>
698 this->AsArrayHandle<ContainedArrayType>());
701 template <
typename T>
705 using BaseT =
typename T::ComponentType;
706 if (this->IsStorageType<viskores::cont::StorageTagBasic>() &&
707 this->IsBaseComponentType<BaseT>())
712 this->Container->Buffers(this->Container->ArrayHandlePointer));
718 this->BaseAsArrayHandle(array);
722 template <
typename ArrayType>
727 this->AsArrayHandle(array);
810 template <
typename BaseComponentType>
816 if (!this->IsBaseComponentType<BaseComponentType>())
820 "component array of " +
821 viskores::cont::TypeToString<BaseComponentType>());
824 auto buffers = this->Container->ExtractComponent(
825 this->Container->ArrayHandlePointer, componentIndex, allowCopy);
826 return ComponentArrayType(buffers);
871 template <
typename BaseComponentType>
893 template <
typename TypeList,
typename StorageList,
typename Functor,
typename... Args>
894 VISKORES_CONT void CastAndCallForTypes(Functor&& functor, Args&&... args)
const;
909 template <
typename TypeList,
typename StorageList,
typename Functor,
typename... Args>
910 VISKORES_CONT void CastAndCallForTypesWithFloatFallback(Functor&& functor, Args&&... args)
const;
933 template <
typename Functor,
typename... Args>
934 VISKORES_CONT void CastAndCallWithExtractedArray(Functor&& functor, Args&&... args)
const;
946 VISKORES_CONT void PrintSummary(std::ostream& out,
bool full =
false)
const;
955 template <
typename T,
typename S>
956 struct UnknownArrayHandleCanConvert
964 template <
typename T>
965 struct UnknownArrayHandleCanConvert<T,
viskores::cont::StorageTagBasic>
969 using UnrolledVec = viskores::internal::UnrollVec<T>;
977 template <
typename TargetT,
typename SourceT,
typename SourceS>
978 struct UnknownArrayHandleCanConvert<TargetT,
viskores::cont::StorageTagCast<SourceT, SourceS>>
982 return UnknownArrayHandleCanConvert<SourceT, SourceS>{}(array);
986 template <
typename T>
987 struct UnknownArrayHandleCanConvertTry
989 template <
typename S>
992 bool& canConvert)
const
994 canConvert |= UnknownArrayHandleCanConvert<T, S>{}(array);
998 template <
typename T,
typename... Ss>
999 struct UnknownArrayHandleCanConvert<T,
viskores::cont::StorageTagMultiplexer<Ss...>>
1003 bool canConvert =
false;
1005 UnknownArrayHandleCanConvertTry<T>{},
viskores::List<Ss...>{}, array, canConvert);
1010 template <
typename T>
1011 struct UnknownArrayHandleCanConvert<T,
viskores::cont::StorageTagRuntimeVec>
1015 using BaseComponentType =
typename T::ComponentType;
1024 template <
typename ArrayHandleType>
1029 return detail::UnknownArrayHandleCanConvert<
typename ArrayHandleType::ValueType,
1030 typename ArrayHandleType::StorageTag>{}(*this);
1036 template <
typename T,
1038 typename viskores::internal::UnrollVec<T>::ComponentType>::NUM_COMPONENTS>
1039 struct UnknownArrayHandleRuntimeVecAsBasic
1042 const detail::UnknownAHContainer*,
1052 template <
typename T>
1053 struct UnknownArrayHandleRuntimeVecAsBasic<T, 1>
1056 const detail::UnknownAHContainer* container,
1059 using UnrolledVec = viskores::internal::UnrollVec<T>;
1060 using ComponentType =
typename UnrolledVec::ComponentType;
1062 self->IsBaseComponentType<ComponentType>() &&
1063 UnrolledVec::NUM_COMPONENTS == self->GetNumberOfComponentsFlat())
1068 using RuntimeVecType =
1070 using StorageRuntimeVec =
1071 viskores::cont::internal::Storage<RuntimeVecType, viskores::cont::StorageTagRuntimeVec>;
1072 StorageRuntimeVec::AsArrayHandleBasic(container->Buffers(container->ArrayHandlePointer),
1085 template <
typename T>
1089 if (!detail::UnknownArrayHandleRuntimeVecAsBasic<T>{}(
this, this->Container.get(), array))
1091 this->BaseAsArrayHandle(array);
1098 struct UnknownArrayHandleMultiplexerCastTry
1100 template <
typename T,
typename S,
typename... Ss>
1105 bool& converted)
const
1110 if (converted && !unknownArray.
IsType<ArrayType>())
1128 template <
typename T,
typename... Ss>
1129 void UnknownArrayHandle::AsArrayHandle(
1132 bool converted =
false;
1150 struct UnknownArrayHandleTry
1152 template <
typename T,
typename S,
typename Functor,
typename... Args>
1157 Args&&... args)
const
1160 if (!called && unknownArray.
CanConvert<DerivedArrayType>())
1163 DerivedArrayType derivedArray;
1175 f(derivedArray, std::forward<Args>(args)...);
1188 template <
typename T>
1189 struct IsUndefinedArrayType
1192 template <
typename T,
typename S>
1193 struct IsUndefinedArrayType<
viskores::List<T, S>>
1194 : viskores::cont::internal::IsInvalidArrayHandle<T, S>
1200 template <
typename ValueTypeList,
typename StorageTypeList>
1201 using ListAllArrayTypes =
1203 detail::IsUndefinedArrayType>;
1206 const std::type_info&);
1210 template <
typename TypeList,
typename StorageTagList,
typename Functor,
typename... Args>
1211 inline void UnknownArrayHandle::CastAndCallForTypes(Functor&& f, Args&&... args)
const
1213 using crossProduct = internal::ListAllArrayTypes<TypeList, StorageTagList>;
1215 bool called =
false;
1218 std::forward<Functor>(f),
1221 std::forward<Args>(args)...);
1226 internal::ThrowCastAndCallException(*
this,
typeid(TypeList));
1230 template <
typename TypeList,
typename StorageTagList,
typename Functor,
typename... Args>
1231 VISKORES_CONT void UnknownArrayHandle::CastAndCallForTypesWithFloatFallback(Functor&& functor,
1232 Args&&... args)
const
1234 using crossProduct = internal::ListAllArrayTypes<TypeList, StorageTagList>;
1236 bool called =
false;
1239 std::forward<Functor>(functor),
1242 std::forward<Args>(args)...);
1247 "Cast and call from %s failed. Copying to basic float array.",
1248 this->GetArrayTypeName().c_str());
1253 std::forward<Functor>(functor),
1256 std::forward<Args>(args)...);
1262 internal::ThrowCastAndCallException(*
this,
typeid(TypeList));
1271 template <
typename ArrayHandleType>
1274 return array.template IsType<ArrayHandleType>();
1281 template <
typename ArrayHandleType>
1284 return array.template AsArrayHandle<ArrayHandleType>();
1290 struct UnknownArrayHandleTryExtract
1292 template <
typename T,
typename Functor,
typename... Args>
1297 Args&&... args)
const
1312 f(extractedArray, std::forward<Args>(args)...);
1319 template <
typename Functor,
typename... Args>
1320 inline void UnknownArrayHandle::CastAndCallWithExtractedArray(Functor&& functor,
1321 Args&&... args)
const
1323 bool called =
false;
1326 std::forward<Functor>(functor),
1329 std::forward<Args>(args)...);
1353 struct VISKORES_CONT_EXPORT SerializableTypeString<
viskores::cont::UnknownArrayHandle>
1364 struct VISKORES_CONT_EXPORT Serialization<
viskores::cont::UnknownArrayHandle>
1375 #endif //viskores_cont_UnknownArrayHandle_h