//============================================================================ // 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 #include #include namespace { const vtkm::Id ARRAY_SIZE = 10; template struct IndexSquared { VTKM_EXEC_CONT ValueType operator()(vtkm::Id i) const { using ComponentType = typename vtkm::VecTraits::ComponentType; return ValueType(static_cast(i * i)); } }; struct PassThrough : public vtkm::worklet::WorkletMapField { using ControlSignature = void(FieldIn, FieldOut); using ExecutionSignature = void(_1, _2); template VTKM_EXEC void operator()(const InValue& inValue, OutValue& outValue) const { outValue = inValue; } }; struct ImplicitTests { template void operator()(const ValueType) const { using FunctorType = IndexSquared; FunctorType functor; using ImplicitHandle = vtkm::cont::ArrayHandleImplicit; ImplicitHandle implicit = vtkm::cont::make_ArrayHandleImplicit(functor, ARRAY_SIZE); std::cout << "verify that the control portal works" << std::endl; auto implicitPortal = implicit.ReadPortal(); for (int i = 0; i < ARRAY_SIZE; ++i) { const ValueType v = implicitPortal.Get(i); const ValueType correct_value = functor(i); VTKM_TEST_ASSERT(v == correct_value, "Implicit Handle Failed"); } std::cout << "verify that the execution portal works" << std::endl; vtkm::cont::Token token; using Device = vtkm::cont::DeviceAdapterTagSerial; using CEPortal = typename ImplicitHandle::ReadPortalType; CEPortal execPortal = implicit.PrepareForInput(Device(), token); for (int i = 0; i < ARRAY_SIZE; ++i) { const ValueType v = execPortal.Get(i); const ValueType correct_value = functor(i); VTKM_TEST_ASSERT(v == correct_value, "Implicit Handle Failed"); } std::cout << "verify that the array handle works in a worklet on the device" << std::endl; vtkm::cont::Invoker invoke; vtkm::cont::ArrayHandle result; invoke(PassThrough{}, implicit, result); auto resultPortal = result.ReadPortal(); for (int i = 0; i < ARRAY_SIZE; ++i) { const ValueType value = resultPortal.Get(i); const ValueType correctValue = functor(i); VTKM_TEST_ASSERT(test_equal(value, correctValue)); } } }; void TestArrayHandleImplicit() { vtkm::testing::Testing::TryTypes(ImplicitTests(), vtkm::TypeListCommon()); } } // anonymous namespace int UnitTestArrayHandleImplicit(int argc, char* argv[]) { return vtkm::cont::testing::Testing::Run(TestArrayHandleImplicit, argc, argv); }