mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-10-08 03:18:58 +00:00
723c9ed2f0
Previously, if you called `Fill` on an `ArrayHandleStride`, you would get an exception that said the feature was not supported. It turns out that filling values is very useful in situations where, for example, you need to initialize an array when processing an unknown type (and thus dealing with extracted components). This implementation of `Fill` first attempts to call `Fill` on the contained array. This only works if the stride is set to 1. If this does not work, then the code leverages the precompiled `ArrayCopy`. It does this by first creating a new `ArrayHandleStride` containing the fill value and a modulo of 1 so that value is constantly repeated. It then reconstructs an `ArrayHandleStride` for itself with a modified size and offset to match the start and end indices. Referencing the `ArrayCopy` was tricky because it kept creating circular dependencies among `ArrayHandleStride`, `ArrayExtractComponent`, and `UnknownArrayHandle`. These dependencies were broken by having `ArrayHandleStride` directly use the internal `ArrayCopyUnknown` function and to use a forward declaration of `UnknownArrayHandle` rather than including its header.
43 lines
1.4 KiB
C++
43 lines
1.4 KiB
C++
//============================================================================
|
|
// 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_internal_ArrayCopyUnknown_h
|
|
#define vtk_m_cont_internal_ArrayCopyUnknown_h
|
|
|
|
#include <vtkm/cont/vtkm_cont_export.h>
|
|
|
|
namespace vtkm
|
|
{
|
|
namespace cont
|
|
{
|
|
|
|
// Rather than include UnknownArrayHandle.h, we just forward declare the class so
|
|
// we can declare our functions and prevent any circular header dependencies from
|
|
// core classes.
|
|
class UnknownArrayHandle;
|
|
|
|
namespace internal
|
|
{
|
|
|
|
/// Same as `ArrayCopy` with `UnknownArrayHandle` except that it can be used without
|
|
/// using a device compiler.
|
|
///
|
|
VTKM_CONT_EXPORT void ArrayCopyUnknown(const vtkm::cont::UnknownArrayHandle& source,
|
|
vtkm::cont::UnknownArrayHandle& destination);
|
|
|
|
VTKM_CONT_EXPORT void ArrayCopyUnknown(const vtkm::cont::UnknownArrayHandle& source,
|
|
const vtkm::cont::UnknownArrayHandle& destination);
|
|
|
|
|
|
} // namespace vtkm::cont::internal
|
|
} // namespace vtkm::cont
|
|
} // namespace vtkm
|
|
|
|
#endif //vtk_m_cont_internal_ArrayCopyUnknown_h
|