10 #ifndef vtk_m_cont_UnknownArrayHandle_h
11 #define vtk_m_cont_UnknownArrayHandle_h
39 template <
typename T,
typename S>
40 void UnknownAHDelete(
void* mem)
43 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
47 template <
typename T,
typename S>
48 const std::vector<vtkm::cont::internal::Buffer>& UnknownAHBuffers(
void* mem)
51 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
55 template <
typename T,
typename S>
56 void* UnknownAHNewInstance()
61 template <
typename T,
typename S>
62 vtkm::Id UnknownAHNumberOfValues(
void* mem)
65 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
69 template <
typename T,
typename S>
73 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
78 template <
typename T,
typename S>
79 inline auto UnknownAHNumberOfComponentsImpl(
void* mem)
80 -> decltype(vtkm::cont::internal::Storage<T, S>::GetNumberOfComponents(
81 std::vector<vtkm::cont::internal::Buffer>()))
84 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
85 return vtkm::cont::internal::Storage<T, S>::GetNumberOfComponents(arrayHandle->GetBuffers());
89 template <
typename T,
typename S>
97 template <
typename T,
typename S>
100 return UnknownAHNumberOfComponentsFlat<T, S>(mem);
103 template <
typename T,
typename S>
109 template <
typename T,
typename S>
110 void UnknownAHAllocate(
void* mem,
116 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
117 arrayHandle->
Allocate(numValues, preserve, token);
120 template <
typename T,
typename S>
121 void UnknownAHShallowCopy(
const void* sourceMem,
void* destinationMem)
124 const AH* source =
reinterpret_cast<const AH*
>(sourceMem);
125 AH* destination =
reinterpret_cast<AH*
>(destinationMem);
126 *destination = *source;
129 template <
typename T,
typename S>
130 void UnknownAHDeepCopy(
const void* sourceMem,
void* destinationMem)
133 const AH* source =
reinterpret_cast<const AH*
>(sourceMem);
134 AH* destination =
reinterpret_cast<AH*
>(destinationMem);
138 template <
typename T,
typename S>
139 std::vector<vtkm::cont::internal::Buffer>
143 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
145 return componentArray.GetBuffers();
148 template <
typename T,
typename S>
149 void UnknownAHReleaseResources(
void* mem)
152 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
156 template <
typename T,
typename S>
157 void UnknownAHReleaseResourcesExecution(
void* mem)
160 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
164 template <
typename T,
typename S>
165 void UnknownAHPrintSummary(
void* mem, std::ostream& out,
bool full)
168 AH* arrayHandle =
reinterpret_cast<AH*
>(mem);
174 struct MakeUnknownAHContainerFunctor
176 template <
typename T,
typename S>
182 std::type_index Type;
188 UnknownAHComponentInfo() =
delete;
190 bool operator==(
const UnknownAHComponentInfo& rhs);
192 template <
typename T>
193 static UnknownAHComponentInfo Make()
195 return UnknownAHComponentInfo{
typeid(T),
196 std::is_integral<T>::value,
197 std::is_floating_point<T>::value,
198 std::is_signed<T>::value,
203 UnknownAHComponentInfo(std::type_index&& type,
208 : Type(std::move(type))
209 , IsIntegral(isIntegral)
219 void* ArrayHandlePointer;
221 std::type_index ValueType;
222 std::type_index StorageType;
223 UnknownAHComponentInfo BaseComponentType;
225 using DeleteType = void(
void*);
226 DeleteType* DeleteFunction;
228 using BuffersType =
const std::vector<vtkm::cont::internal::Buffer>&(
void*);
229 BuffersType* Buffers;
231 using NewInstanceType =
void*();
232 NewInstanceType* NewInstance;
234 using NewInstanceBasicType = std::shared_ptr<UnknownAHContainer>(
void*);
235 NewInstanceBasicType* NewInstanceBasic;
236 NewInstanceBasicType* NewInstanceFloatBasic;
238 using NumberOfValuesType =
vtkm::Id(
void*);
239 NumberOfValuesType* NumberOfValues;
242 NumberOfComponentsType* NumberOfComponents;
243 NumberOfComponentsType* NumberOfComponentsFlat;
246 AllocateType* Allocate;
248 using ShallowCopyType = void(
const void*,
void*);
249 ShallowCopyType* ShallowCopy;
251 using DeepCopyType = void(
const void*,
void*);
252 DeepCopyType* DeepCopy;
254 using ExtractComponentType = std::vector<vtkm::cont::internal::Buffer>(
void*,
257 ExtractComponentType* ExtractComponent;
259 using ReleaseResourcesType = void(
void*);
260 ReleaseResourcesType* ReleaseResources;
261 ReleaseResourcesType* ReleaseResourcesExecution;
263 using PrintSummaryType = void(
void*, std::ostream&,
bool);
264 PrintSummaryType* PrintSummary;
266 void operator=(
const UnknownAHContainer&) =
delete;
268 ~UnknownAHContainer() { this->DeleteFunction(this->ArrayHandlePointer); }
270 std::shared_ptr<UnknownAHContainer> MakeNewInstance()
const;
272 template <
typename T,
typename S>
275 return std::shared_ptr<UnknownAHContainer>(
new UnknownAHContainer(array));
278 template <
typename TargetT,
typename SourceT,
typename SourceS>
279 static std::shared_ptr<UnknownAHContainer> Make(
287 template <
typename T,
typename... Ss>
288 static std::shared_ptr<UnknownAHContainer> Make(
292 .GetArrayHandleVariant();
293 if (variant.IsValid())
295 return variant.CastAndCall(MakeUnknownAHContainerFunctor{});
299 return std::shared_ptr<UnknownAHContainer>{};
304 UnknownAHContainer(
const UnknownAHContainer&) =
default;
306 template <
typename T,
typename S>
310 template <
typename T,
typename S>
315 template <
typename T,
typename S>
316 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceBasic(
void* mem,
320 if (numComponents < 1)
324 vtkm::cont::TypeToString<T>());
329 template <
typename T,
typename S>
330 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceBasic(
void* mem)
335 template <
typename T,
typename S>
336 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(
void*,
342 template <
typename T,
typename S>
343 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(
void* mem,
347 if (numComponents < 1)
351 vtkm::cont::TypeToString<T>());
353 return UnknownAHContainer::Make(
356 template <
typename T,
typename S>
357 std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(
void* mem)
362 template <
typename T,
typename S>
364 : ArrayHandlePointer(new
vtkm::cont::ArrayHandle<T, S>(array))
365 , ValueType(typeid(T))
366 , StorageType(typeid(S))
368 UnknownAHComponentInfo::Make<typename
vtkm::VecTraits<T>::BaseComponentType>())
369 , DeleteFunction(detail::UnknownAHDelete<T, S>)
370 , Buffers(detail::UnknownAHBuffers<T, S>)
371 , NewInstance(detail::UnknownAHNewInstance<T, S>)
372 , NewInstanceBasic(detail::UnknownAHNewInstanceBasic<T, S>)
373 , NewInstanceFloatBasic(detail::UnknownAHNewInstanceFloatBasic<T, S>)
374 , NumberOfValues(detail::UnknownAHNumberOfValues<T, S>)
375 , NumberOfComponents(detail::UnknownAHNumberOfComponents<T, S>)
376 , NumberOfComponentsFlat(detail::UnknownAHNumberOfComponentsFlat<T, S>)
377 , Allocate(detail::UnknownAHAllocate<T, S>)
378 , ShallowCopy(detail::UnknownAHShallowCopy<T, S>)
379 , DeepCopy(detail::UnknownAHDeepCopy<T, S>)
380 , ExtractComponent(detail::UnknownAHExtractComponent<T, S>)
381 , ReleaseResources(detail::UnknownAHReleaseResources<T, S>)
382 , ReleaseResourcesExecution(detail::UnknownAHReleaseResourcesExecution<T, S>)
383 , PrintSummary(detail::UnknownAHPrintSummary<T, S>)
387 template <
typename T,
typename S>
388 inline std::shared_ptr<UnknownAHContainer> MakeUnknownAHContainerFunctor::operator()(
391 return UnknownAHContainer::Make(array);
397 template <
typename ValueTypeList,
typename StorageTypeList>
398 class UncertainArrayHandle;
434 VTKM_CONT bool IsValueTypeImpl(std::type_index type)
const;
435 VTKM_CONT bool IsStorageTypeImpl(std::type_index type)
const;
436 VTKM_CONT bool IsBaseComponentTypeImpl(
const detail::UnknownAHComponentInfo& type)
const;
441 template <
typename T,
typename S>
443 : Container(detail::UnknownAHContainer::Make(array))
493 VTKM_CONT std::string GetValueTypeName()
const;
498 VTKM_CONT std::string GetBaseComponentTypeName()
const;
503 VTKM_CONT std::string GetStorageTypeName()
const;
510 VTKM_CONT std::string GetArrayTypeName()
const;
514 template <
typename ValueType>
517 return this->IsValueTypeImpl(
typeid(ValueType));
522 template <
typename StorageType>
525 return this->IsStorageTypeImpl(
typeid(StorageType));
539 template <
typename BaseComponentType>
542 return this->IsBaseComponentTypeImpl(detail::UnknownAHComponentInfo::Make<BaseComponentType>());
557 template <
typename ArrayHandleType>
561 return (this->IsValueType<typename ArrayHandleType::ValueType>() &&
562 this->IsStorageType<typename ArrayHandleType::StorageTag>());
573 template <
typename NewValueTypeList,
typename NewStorageTypeList>
575 NewValueTypeList = NewValueTypeList{},
576 NewStorageTypeList = NewStorageTypeList{})
const;
627 template <
typename ArrayHandleType>
640 template <
typename T,
typename S>
644 if (!this->IsType<ArrayType>())
650 array = *
reinterpret_cast<ArrayType*
>(this->Container->ArrayHandlePointer);
659 template <
typename T,
typename S>
662 this->BaseAsArrayHandle(array);
665 template <
typename T>
668 template <
typename T,
typename... Ss>
672 template <
typename TargetT,
typename SourceT,
typename SourceS>
678 this->AsArrayHandle<ContainedArrayType>());
681 template <
typename T>
685 using BaseT =
typename T::ComponentType;
686 if (this->IsStorageType<vtkm::cont::StorageTagBasic>() && this->IsBaseComponentType<BaseT>())
691 this->Container->Buffers(this->Container->ArrayHandlePointer));
697 this->BaseAsArrayHandle(array);
701 template <
typename ArrayType>
706 this->AsArrayHandle(array);
789 template <
typename BaseComponentType>
795 if (!this->IsBaseComponentType<BaseComponentType>())
799 "component array of " + vtkm::cont::TypeToString<BaseComponentType>());
802 auto buffers = this->Container->ExtractComponent(
803 this->Container->ArrayHandlePointer, componentIndex, allowCopy);
804 return ComponentArrayType(buffers);
848 template <
typename BaseComponentType>
870 template <
typename TypeList,
typename StorageList,
typename Functor,
typename... Args>
871 VTKM_CONT void CastAndCallForTypes(Functor&& functor, Args&&... args)
const;
886 template <
typename TypeList,
typename StorageList,
typename Functor,
typename... Args>
887 VTKM_CONT void CastAndCallForTypesWithFloatFallback(Functor&& functor, Args&&... args)
const;
910 template <
typename Functor,
typename... Args>
911 VTKM_CONT void CastAndCallWithExtractedArray(Functor&& functor, Args&&... args)
const;
916 VTKM_CONT void ReleaseResourcesExecution()
const;
922 VTKM_CONT void PrintSummary(std::ostream& out,
bool full =
false)
const;
931 template <
typename T,
typename S>
932 struct UnknownArrayHandleCanConvert
940 template <
typename T>
941 struct UnknownArrayHandleCanConvert<T,
vtkm::cont::StorageTagBasic>
945 using UnrolledVec = vtkm::internal::UnrollVec<T>;
953 template <
typename TargetT,
typename SourceT,
typename SourceS>
954 struct UnknownArrayHandleCanConvert<TargetT,
vtkm::cont::StorageTagCast<SourceT, SourceS>>
958 return UnknownArrayHandleCanConvert<SourceT, SourceS>{}(array);
962 template <
typename T>
963 struct UnknownArrayHandleCanConvertTry
965 template <
typename S>
968 canConvert |= UnknownArrayHandleCanConvert<T, S>{}(array);
972 template <
typename T,
typename... Ss>
973 struct UnknownArrayHandleCanConvert<T,
vtkm::cont::StorageTagMultiplexer<Ss...>>
977 bool canConvert =
false;
983 template <
typename T>
984 struct UnknownArrayHandleCanConvert<T,
vtkm::cont::StorageTagRuntimeVec>
988 using BaseComponentType =
typename T::ComponentType;
997 template <
typename ArrayHandleType>
998 VTKM_CONT inline bool UnknownArrayHandle::CanConvert()
const
1002 return detail::UnknownArrayHandleCanConvert<
typename ArrayHandleType::ValueType,
1003 typename ArrayHandleType::StorageTag>{}(*this);
1009 template <
typename T,
1012 struct UnknownArrayHandleRuntimeVecAsBasic
1015 const detail::UnknownAHContainer*,
1025 template <
typename T>
1026 struct UnknownArrayHandleRuntimeVecAsBasic<T, 1>
1029 const detail::UnknownAHContainer* container,
1032 using UnrolledVec = vtkm::internal::UnrollVec<T>;
1033 using ComponentType =
typename UnrolledVec::ComponentType;
1035 self->IsBaseComponentType<ComponentType>() &&
1036 UnrolledVec::NUM_COMPONENTS == self->GetNumberOfComponentsFlat())
1042 using StorageRuntimeVec =
1043 vtkm::cont::internal::Storage<RuntimeVecType, vtkm::cont::StorageTagRuntimeVec>;
1044 StorageRuntimeVec::AsArrayHandleBasic(container->Buffers(container->ArrayHandlePointer),
1057 template <
typename T>
1060 if (!detail::UnknownArrayHandleRuntimeVecAsBasic<T>{}(
this, this->Container.get(), array))
1062 this->BaseAsArrayHandle(array);
1069 struct UnknownArrayHandleMultiplexerCastTry
1071 template <
typename T,
typename S,
typename... Ss>
1076 bool& converted)
const
1081 if (converted && !unknownArray.
IsType<ArrayType>())
1099 template <
typename T,
typename... Ss>
1100 void UnknownArrayHandle::AsArrayHandle(
1103 bool converted =
false;
1105 detail::UnknownArrayHandleMultiplexerCastTry{},
vtkm::List<Ss...>{}, *
this, array, converted);
1117 struct UnknownArrayHandleTry
1119 template <
typename T,
typename S,
typename Functor,
typename... Args>
1124 Args&&... args)
const
1127 if (!called && unknownArray.
CanConvert<DerivedArrayType>())
1130 DerivedArrayType derivedArray;
1142 f(derivedArray, std::forward<Args>(args)...);
1155 template <
typename T>
1156 struct IsUndefinedArrayType
1159 template <
typename T,
typename S>
1160 struct IsUndefinedArrayType<
vtkm::List<T, S>> : vtkm::cont::internal::IsInvalidArrayHandle<T, S>
1166 template <
typename ValueTypeList,
typename StorageTypeList>
1167 using ListAllArrayTypes =
1171 const std::type_info&);
1175 template <
typename TypeList,
typename StorageTagList,
typename Functor,
typename... Args>
1176 inline void UnknownArrayHandle::CastAndCallForTypes(Functor&& f, Args&&... args)
const
1178 using crossProduct = internal::ListAllArrayTypes<TypeList, StorageTagList>;
1180 bool called =
false;
1183 std::forward<Functor>(f),
1186 std::forward<Args>(args)...);
1191 internal::ThrowCastAndCallException(*
this,
typeid(TypeList));
1195 template <
typename TypeList,
typename StorageTagList,
typename Functor,
typename... Args>
1196 VTKM_CONT void UnknownArrayHandle::CastAndCallForTypesWithFloatFallback(Functor&& functor,
1197 Args&&... args)
const
1199 using crossProduct = internal::ListAllArrayTypes<TypeList, StorageTagList>;
1201 bool called =
false;
1204 std::forward<Functor>(functor),
1207 std::forward<Args>(args)...);
1215 std::forward<Functor>(functor),
1218 std::forward<Args>(args)...);
1224 internal::ThrowCastAndCallException(*
this,
typeid(TypeList));
1233 template <
typename ArrayHandleType>
1236 return array.template IsType<ArrayHandleType>();
1243 template <
typename ArrayHandleType>
1246 return array.template AsArrayHandle<ArrayHandleType>();
1252 struct UnknownArrayHandleTryExtract
1254 template <
typename T,
typename Functor,
typename... Args>
1259 Args&&... args)
const
1274 f(extractedArray, std::forward<Args>(args)...);
1281 template <
typename Functor,
typename... Args>
1282 inline void UnknownArrayHandle::CastAndCallWithExtractedArray(Functor&& functor,
1283 Args&&... args)
const
1285 bool called =
false;
1288 std::forward<Functor>(functor),
1291 std::forward<Args>(args)...);
1337 #endif //vtk_m_cont_UnknownArrayHandle_h