//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. //============================================================================ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { template struct AllVecImpl; template struct AllVecImpl> { using type = vtkm::List...>; }; // Normally I would implement this with vtkm::ListTransform, but that is causing an ICE in GCC 4.8. // This implementation is not much different. template using AllVec = typename AllVecImpl::type; using UnknownSerializationTypes = vtkm::ListAppend, AllVec<3>, AllVec<4>>; using UnknownSerializationStorage = vtkm::ListAppend, vtkm::cont::StorageTagConstant, vtkm::cont::StorageTagCounting, vtkm::cont::StorageTagIndex, vtkm::cont::StorageTagGroupVec, vtkm::cont::StorageTagGroupVec, vtkm::cont::StorageTagGroupVec, vtkm::cont::StorageTagPermutation, vtkm::cont::StorageTagReverse, vtkm::cont::StorageTagSOA, vtkm::cont::StorageTagUniformPoints>>; } // anonymous namespace namespace vtkm { namespace cont { namespace detail { std::shared_ptr UnknownAHContainer::MakeNewInstance() const { // Start by doing an invalid copy to create a new container, then swap out the pointer // to the array handle to make sure that each object will delete its own ArrayHandle // when they get destroyed. std::shared_ptr newContainer(new UnknownAHContainer(*this)); newContainer->ArrayHandlePointer = this->NewInstance(); return newContainer; } bool UnknownAHComponentInfo::operator==(const UnknownAHComponentInfo& rhs) { if (this->IsIntegral || this->IsFloat) { return ((this->IsIntegral == rhs.IsIntegral) && (this->IsFloat == rhs.IsFloat) && (this->IsSigned == rhs.IsSigned) && (this->Size == rhs.Size)); } else { // Needs optimization based on platform. OSX cannot compare typeid across translation units? return this->Type == rhs.Type; } } } // namespace detail VTKM_CONT bool UnknownArrayHandle::IsValueTypeImpl(std::type_index type) const { if (!this->Container) { return false; } // Needs optimization based on platform. OSX cannot compare typeid across translation units? return this->Container->ValueType == type; } VTKM_CONT bool UnknownArrayHandle::IsStorageTypeImpl(std::type_index type) const { if (!this->Container) { return false; } // Needs optimization based on platform. OSX cannot compare typeid across translation units? return this->Container->StorageType == type; } VTKM_CONT bool UnknownArrayHandle::IsBaseComponentTypeImpl( const detail::UnknownAHComponentInfo& type) const { if (!this->Container) { return false; } // Needs optimization based on platform. OSX cannot compare typeid across translation units? return this->Container->BaseComponentType == type; } VTKM_CONT bool UnknownArrayHandle::IsValid() const { return static_cast(this->Container); } VTKM_CONT UnknownArrayHandle UnknownArrayHandle::NewInstance() const { UnknownArrayHandle newArray; if (this->Container) { newArray.Container = this->Container->MakeNewInstance(); } return newArray; } VTKM_CONT UnknownArrayHandle UnknownArrayHandle::NewInstanceBasic() const { UnknownArrayHandle newArray; if (this->Container) { newArray.Container = this->Container->NewInstanceBasic(); } return newArray; } VTKM_CONT UnknownArrayHandle UnknownArrayHandle::NewInstanceFloatBasic() const { UnknownArrayHandle newArray; if (this->Container) { newArray.Container = this->Container->NewInstanceFloatBasic(); } return newArray; } VTKM_CONT std::string UnknownArrayHandle::GetValueTypeName() const { if (this->Container) { return vtkm::cont::TypeToString(this->Container->ValueType); } else { return ""; } } VTKM_CONT std::string UnknownArrayHandle::GetBaseComponentTypeName() const { if (this->Container) { return vtkm::cont::TypeToString(this->Container->BaseComponentType); } else { return ""; } } VTKM_CONT std::string UnknownArrayHandle::GetStorageTypeName() const { if (this->Container) { return vtkm::cont::TypeToString(this->Container->StorageType); } else { return ""; } } VTKM_CONT std::string UnknownArrayHandle::GetArrayTypeName() const { if (this->Container) { return "vtkm::cont::ArrayHandle<" + this->GetValueTypeName() + ", " + this->GetStorageTypeName() + ">"; } else { return ""; } } VTKM_CONT vtkm::Id UnknownArrayHandle::GetNumberOfValues() const { if (this->Container) { return this->Container->NumberOfValues(this->Container->ArrayHandlePointer); } else { return 0; } } vtkm::IdComponent UnknownArrayHandle::GetNumberOfComponents() const { if (this->Container) { return this->Container->NumberOfComponents(); } else { return 0; } } VTKM_CONT vtkm::IdComponent UnknownArrayHandle::GetNumberOfComponentsFlat() const { if (this->Container) { return this->Container->NumberOfComponentsFlat(); } else { return 0; } } VTKM_CONT void UnknownArrayHandle::Allocate(vtkm::Id numValues, vtkm::CopyFlag preserve, vtkm::cont::Token& token) const { if (this->Container) { this->Container->Allocate(this->Container->ArrayHandlePointer, numValues, preserve, token); } else { throw vtkm::cont::ErrorBadAllocation( "Cannot allocate UnknownArrayHandle that does not contain an array."); } } VTKM_CONT void UnknownArrayHandle::Allocate(vtkm::Id numValues, vtkm::CopyFlag preserve) const { vtkm::cont::Token token; this->Allocate(numValues, preserve, token); } VTKM_CONT void UnknownArrayHandle::DeepCopyFrom(const vtkm::cont::UnknownArrayHandle& source) { vtkm::cont::internal::ArrayCopyUnknown(source, *this); } VTKM_CONT void UnknownArrayHandle::DeepCopyFrom(const vtkm::cont::UnknownArrayHandle& source) const { vtkm::cont::internal::ArrayCopyUnknown(source, *this); } VTKM_CONT void UnknownArrayHandle::CopyShallowIfPossible(const vtkm::cont::UnknownArrayHandle& source) { if (!this->IsValid()) { *this = source; } const_cast(this)->CopyShallowIfPossible(source); } VTKM_CONT void UnknownArrayHandle::CopyShallowIfPossible(const vtkm::cont::UnknownArrayHandle& source) const { if (!this->IsValid()) { throw vtkm::cont::ErrorBadValue( "Attempty to copy to a constant UnknownArrayHandle with no valid array."); } if (source.IsValueTypeImpl(this->Container->ValueType) && source.IsStorageTypeImpl(this->Container->StorageType)) { this->Container->ShallowCopy(source.Container->ArrayHandlePointer, this->Container->ArrayHandlePointer); } else { this->DeepCopyFrom(source); } } VTKM_CONT void UnknownArrayHandle::ReleaseResourcesExecution() const { if (this->Container) { this->Container->ReleaseResourcesExecution(this->Container->ArrayHandlePointer); } } VTKM_CONT void UnknownArrayHandle::ReleaseResources() const { if (this->Container) { this->Container->ReleaseResources(this->Container->ArrayHandlePointer); } } VTKM_CONT void UnknownArrayHandle::PrintSummary(std::ostream& out, bool full) const { if (this->Container) { this->Container->PrintSummary(this->Container->ArrayHandlePointer, out, full); } else { out << "null UnknownArrayHandle" << std::endl; } } namespace internal { VTKM_CONT_EXPORT void ThrowCastAndCallException(const vtkm::cont::UnknownArrayHandle& ref, const std::type_info& type) { std::ostringstream out; out << "Could not find appropriate cast for array in CastAndCall.\n" "Array: "; ref.PrintSummary(out); out << "TypeList: " << vtkm::cont::TypeToString(type) << "\n"; throw vtkm::cont::ErrorBadType(out.str()); } } // namespace internal } } // namespace vtkm::cont //============================================================================= // Specializations of serialization related classes namespace vtkm { namespace cont { std::string SerializableTypeString::Get() { return "UnknownAH"; } } } // namespace vtkm::cont namespace mangled_diy_namespace { void Serialization::save(BinaryBuffer& bb, const vtkm::cont::UnknownArrayHandle& obj) { vtkmdiy::save(bb, obj.ResetTypes()); } void Serialization::load(BinaryBuffer& bb, vtkm::cont::UnknownArrayHandle& obj) { vtkm::cont::UncertainArrayHandle uncertainArray; vtkmdiy::load(bb, uncertainArray); obj = uncertainArray; } } // namespace mangled_diy_namespace