//============================================================================ // 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_FieldRangeCompute_hxx #define vtk_m_cont_FieldRangeCompute_hxx #include // for std::accumulate namespace vtkm { namespace cont { namespace detail { template VTKM_CONT vtkm::cont::ArrayHandle FieldRangeComputeImpl( const vtkm::cont::DataSet& dataset, const std::string& name, vtkm::cont::Field::Association assoc, TypeList) { vtkm::cont::Field field; try { field = dataset.GetField(name, assoc); } catch (vtkm::cont::ErrorBadValue&) { // field missing, return empty range. return vtkm::cont::ArrayHandle(); } return field.GetRange(TypeList()); } template VTKM_CONT vtkm::cont::ArrayHandle FieldRangeComputeImpl( const vtkm::cont::MultiBlock& multiblock, const std::string& name, vtkm::cont::Field::Association assoc, TypeList) { std::vector result_vector = std::accumulate( multiblock.begin(), multiblock.end(), std::vector(), [&](const std::vector& accumulated_value, const vtkm::cont::DataSet& dataset) { vtkm::cont::ArrayHandle block_range = vtkm::cont::detail::FieldRangeComputeImpl(dataset, name, assoc, TypeList()); std::vector result = accumulated_value; // if the current block has more components than we have seen so far, // resize the result to fit all components. result.resize(std::max(result.size(), static_cast(block_range.GetNumberOfValues()))); auto portal = block_range.GetPortalConstControl(); std::transform(vtkm::cont::ArrayPortalToIteratorBegin(portal), vtkm::cont::ArrayPortalToIteratorEnd(portal), result.begin(), result.begin(), std::plus()); return result; }); return vtkm::cont::make_ArrayHandle(result_vector, vtkm::CopyFlag::On); } } } } // namespace vtkm::cont::detail #endif