//============================================================================ // 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. //============================================================================ #ifndef vtk_m_cont_ArrayHandleVirtual_hxx #define vtk_m_cont_ArrayHandleVirtual_hxx #include #include VTKM_DEPRECATED_SUPPRESS_BEGIN namespace vtkm { namespace cont { template template ArrayHandleType inline ArrayHandleVirtual::CastToType( std::true_type vtkmNotUsed(valueTypesMatch), std::false_type vtkmNotUsed(notFromArrayHandleVirtual)) const { auto* storage = this->GetStorage().GetStorageVirtual(); if (!storage) { VTKM_LOG_CAST_FAIL(*this, ArrayHandleType); throwFailedDynamicCast("ArrayHandleVirtual", vtkm::cont::TypeToString()); } using S = typename ArrayHandleType::StorageTag; const auto* castStorage = storage->template Cast>(); return castStorage->GetHandle(); } } } // namespace vtkm::cont VTKM_DEPRECATED_SUPPRESS_END #include #include //============================================================================= // Specializations of serialization related classes /// @cond SERIALIZATION VTKM_DEPRECATED_SUPPRESS_BEGIN namespace mangled_diy_namespace { template struct Serialization> { static VTKM_CONT void save(vtkmdiy::BinaryBuffer& bb, const vtkm::cont::ArrayHandleVirtual& obj) { vtkm::cont::ArrayHandle array; if (obj.template IsType()) { array = obj.template Cast(); } else { vtkm::Id size = obj.GetNumberOfValues(); array.Allocate(size); auto src = obj.ReadPortal(); auto dest = array.WritePortal(); for (vtkm::IdComponent index = 0; index < size; ++index) { dest.Set(index, src.Get(index)); } } vtkmdiy::save(bb, array); } static VTKM_CONT void load(BinaryBuffer& bb, vtkm::cont::ArrayHandleVirtual& obj) { vtkm::cont::ArrayHandle array; vtkmdiy::load(bb, array); obj = std::move(vtkm::cont::ArrayHandleVirtual{ array }); } }; template struct IntAnySerializer { using CountingType = vtkm::cont::ArrayHandleCounting; using ConstantType = vtkm::cont::ArrayHandleConstant; using BasicType = vtkm::cont::ArrayHandle; static VTKM_CONT void save(vtkmdiy::BinaryBuffer& bb, const vtkm::cont::ArrayHandleVirtual& obj) { if (obj.template IsType()) { vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); using S = typename CountingType::StorageTag; const vtkm::cont::internal::detail::StorageVirtual* storage = obj.GetStorage().GetStorageVirtual(); auto* castStorage = storage->Cast>(); vtkmdiy::save(bb, castStorage->GetHandle()); } else if (obj.template IsType()) { vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); using S = typename ConstantType::StorageTag; const vtkm::cont::internal::detail::StorageVirtual* storage = obj.GetStorage().GetStorageVirtual(); auto* castStorage = storage->Cast>(); vtkmdiy::save(bb, castStorage->GetHandle()); } else { vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); BasicType array; vtkm::Id size = obj.GetNumberOfValues(); array.Allocate(size); auto src = obj.ReadPortal(); auto dest = array.WritePortal(); for (vtkm::IdComponent index = 0; index < size; ++index) { dest.Set(index, src.Get(index)); } vtkmdiy::save(bb, array); } } static VTKM_CONT void load(BinaryBuffer& bb, vtkm::cont::ArrayHandleVirtual& obj) { std::string typeString; vtkmdiy::load(bb, typeString); if (typeString == vtkm::cont::SerializableTypeString::Get()) { CountingType array; vtkmdiy::load(bb, array); obj = std::move(vtkm::cont::ArrayHandleVirtual{ array }); } else if (typeString == vtkm::cont::SerializableTypeString::Get()) { ConstantType array; vtkmdiy::load(bb, array); obj = std::move(vtkm::cont::ArrayHandleVirtual{ array }); } else { vtkm::cont::ArrayHandle array; vtkmdiy::load(bb, array); obj = std::move(vtkm::cont::ArrayHandleVirtual{ array }); } } }; template <> struct Serialization> : public IntAnySerializer { }; template <> struct Serialization> : public IntAnySerializer { }; template <> struct Serialization> : public IntAnySerializer { }; template struct Serialization> : public Serialization> { }; } // mangled_diy_namespace VTKM_DEPRECATED_SUPPRESS_END #endif