//============================================================================ // 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. //============================================================================ #include #include #include #include #include namespace { static constexpr vtkm::Id ARRAY_SIZE = 10; template struct TestKernelInOut : public vtkm::exec::FunctorBase { PortalType Portal; VTKM_EXEC void operator()(vtkm::Id index) const { using ValueType = typename PortalType::ValueType; ValueType inValue = this->Portal.Get(index); this->Portal.Set(index, inValue + inValue); } }; template struct TryArrayInOutType { template void operator()(T) const { T array[ARRAY_SIZE]; for (vtkm::Id index = 0; index < ARRAY_SIZE; index++) { array[index] = TestValue(index, T()); } using ArrayHandleType = vtkm::cont::ArrayHandle; ArrayHandleType handle = vtkm::cont::make_ArrayHandle(array, ARRAY_SIZE, vtkm::CopyFlag::Off); using PortalType = typename ArrayHandleType::WritePortalType; vtkm::cont::arg::Transport transport; vtkm::cont::Token token; TestKernelInOut kernel; kernel.Portal = transport(handle, handle, ARRAY_SIZE, ARRAY_SIZE, token); vtkm::cont::DeviceAdapterAlgorithm::Schedule(kernel, ARRAY_SIZE); token.DetachFromAll(); typename ArrayHandleType::ReadPortalType portal = handle.ReadPortal(); VTKM_TEST_ASSERT(portal.GetNumberOfValues() == ARRAY_SIZE, "Portal has wrong number of values."); for (vtkm::Id index = 0; index < ARRAY_SIZE; index++) { T expectedValue = TestValue(index, T()) + TestValue(index, T()); T retrievedValue = portal.Get(index); VTKM_TEST_ASSERT(test_equal(expectedValue, retrievedValue), "Functor did not modify in place."); } } }; template void TryArrayInOutTransport(Device) { vtkm::testing::Testing::TryTypes(TryArrayInOutType(), vtkm::TypeListCommon()); } void TestArrayInOutTransport() { std::cout << "Trying ArrayInOut transport with serial device." << std::endl; TryArrayInOutTransport(vtkm::cont::DeviceAdapterTagSerial()); } } // anonymous namespace int UnitTestTransportArrayInOut(int argc, char* argv[]) { return vtkm::cont::testing::Testing::Run(TestArrayInOutTransport, argc, argv); }