//============================================================================ // 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_TransportTagArrayInOut_h #define vtk_m_cont_arg_TransportTagArrayInOut_h #include #include #include #include namespace vtkm { namespace cont { namespace arg { /// \brief \c Transport tag for in-place arrays. /// /// \c TransportTagArrayInOut is a tag used with the \c Transport class to /// transport \c ArrayHandle objects for data that is both input and output /// (that is, in place modification of array data). /// struct TransportTagArrayInOut { }; 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 ExecObjectType = decltype( std::declval().PrepareForInPlace(Device(), std::declval())); template VTKM_CONT ExecObjectType operator()(ContObjectType& object, const InputDomainType& vtkmNotUsed(inputDomain), vtkm::Id vtkmNotUsed(inputRange), vtkm::Id outputRange, vtkm::cont::Token& token) const { if (object.GetNumberOfValues() != outputRange) { throw vtkm::cont::ErrorBadValue("Input/output array to worklet invocation the wrong size."); } return object.PrepareForInPlace(Device(), token); } #ifdef VTKM_MSVC VTKM_DEPRECATED_SUPPRESS_END #endif }; } } } // namespace vtkm::cont::arg #endif //vtk_m_cont_arg_TransportTagArrayInOut_h