//============================================================================ // 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_arg_TransportTagWholeArrayOut_h #define vtk_m_cont_arg_TransportTagWholeArrayOut_h #include #include #include #include namespace vtkm { namespace cont { namespace arg { /// \brief \c Transport tag for in-place arrays with random access. /// /// \c TransportTagWholeArrayOut is a tag used with the \c Transport class to /// transport \c ArrayHandle objects for output data. The array needs to be /// allocated before passed as an argument to Invoke. /// /// The worklet will have random access to the array through a portal /// interface, but care should be taken to not write a value in one instance /// that will be overridden by another entry. /// struct TransportTagWholeArrayOut { }; template struct Transport { // MSVC will issue deprecation warnings here if this template is instantiated with // a deprecated class even if the template is used from a section of code where // deprecation warnings are suppressed. This is annoying behavior since this template // has no control over what class it is used with. To get around it, we have to // suppress all deprecation warnings here. #ifdef VTKM_MSVC VTKM_DEPRECATED_SUPPRESS_BEGIN #endif // If you get a compile error here, it means you tried to use an object that // is not an array handle as an argument that is expected to be one. VTKM_IS_ARRAY_HANDLE(ContObjectType); using ValueType = typename ContObjectType::ValueType; using StorageTag = typename ContObjectType::StorageTag; using ExecObjectType = typename ContObjectType::WritePortalType; template VTKM_CONT ExecObjectType operator()(ContObjectType& array, const InputDomainType&, vtkm::Id, vtkm::Id, vtkm::cont::Token& token) const { // Note: we ignore the size of the domain because the randomly accessed // array might not have the same size depending on how the user is using // the array. return array.PrepareForOutput(array.GetNumberOfValues(), Device{}, token); } #ifdef VTKM_MSVC VTKM_DEPRECATED_SUPPRESS_END #endif }; } } } // namespace vtkm::cont::arg #endif //vtk_m_cont_arg_TransportTagWholeArrayOut_h