//============================================================================ // 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 VTKM_CONT void TestValues(const vtkm::cont::ArrayHandle& ah, const std::initializer_list& expected) { auto portal = ah.ReadPortal(); VTKM_TEST_ASSERT(expected.size() == static_cast(ah.GetNumberOfValues())); for (vtkm::Id i = 0; i < ah.GetNumberOfValues(); ++i) { VTKM_TEST_ASSERT(expected.begin()[static_cast(i)] == portal.Get(i)); } } template VTKM_CONT void TestValues(const std::vector& vec, const std::initializer_list& expected) { VTKM_TEST_ASSERT(expected.size() == vec.size()); for (std::size_t i = 0; i < vec.size(); ++i) { VTKM_TEST_ASSERT(expected.begin()[static_cast(i)] == vec[i]); } } template void TryCopy() { std::cout << "Trying type: " << vtkm::testing::TypeName::Name() << std::endl; vtkm::cont::ArrayHandle data; { // Create the ValueType array. vtkm::cont::ArrayHandleIndex values(ARRAY_SIZE); vtkm::cont::ArrayCopy(values, data); } { // ArrayHandle ids const auto ids = vtkm::cont::make_ArrayHandle({ 3, 8, 7 }); { // Return vector: const std::vector output = vtkm::cont::ArrayGetValues(ids, data); TestValues(output, { 3, 8, 7 }); } { // Pass vector: std::vector output; vtkm::cont::ArrayGetValues(ids, data, output); TestValues(output, { 3, 8, 7 }); } { // Pass handle: vtkm::cont::ArrayHandle output; vtkm::cont::ArrayGetValues(ids, data, output); TestValues(output, { 3, 8, 7 }); } { // Test the specialization for ArrayHandleCast auto castedData = vtkm::cont::make_ArrayHandleCast(data); vtkm::cont::ArrayHandle output; vtkm::cont::ArrayGetValues(ids, castedData, output); TestValues(output, { 3.0, 8.0, 7.0 }); } } { // vector ids const std::vector ids{ 1, 5, 3, 9 }; { // Return vector: const std::vector output = vtkm::cont::ArrayGetValues(ids, data); TestValues(output, { 1, 5, 3, 9 }); } { // Pass vector: std::vector output; vtkm::cont::ArrayGetValues(ids, data, output); TestValues(output, { 1, 5, 3, 9 }); } { // Pass handle: vtkm::cont::ArrayHandle output; vtkm::cont::ArrayGetValues(ids, data, output); TestValues(output, { 1, 5, 3, 9 }); } } { // Initializer list ids { // Return vector: const std::vector output = vtkm::cont::ArrayGetValues({ 4, 2, 0, 6, 9 }, data); TestValues(output, { 4, 2, 0, 6, 9 }); } { // Pass vector: std::vector output; vtkm::cont::ArrayGetValues({ 4, 2, 0, 6, 9 }, data, output); TestValues(output, { 4, 2, 0, 6, 9 }); } { // Pass handle: vtkm::cont::ArrayHandle output; vtkm::cont::ArrayGetValues({ 4, 2, 0, 6, 9 }, data, output); TestValues(output, { 4, 2, 0, 6, 9 }); } } { // c-array ids const std::vector idVec{ 8, 6, 7, 5, 3, 0, 9 }; const vtkm::Id* ids = idVec.data(); const vtkm::Id n = static_cast(idVec.size()); { // Return vector: const std::vector output = vtkm::cont::ArrayGetValues(ids, n, data); TestValues(output, { 8, 6, 7, 5, 3, 0, 9 }); } { // Pass vector: std::vector output; vtkm::cont::ArrayGetValues(ids, n, data, output); TestValues(output, { 8, 6, 7, 5, 3, 0, 9 }); } { // Pass handle: vtkm::cont::ArrayHandle output; vtkm::cont::ArrayGetValues(ids, n, data, output); TestValues(output, { 8, 6, 7, 5, 3, 0, 9 }); } } { // single values { const ValueType output = vtkm::cont::ArrayGetValue(8, data); VTKM_TEST_ASSERT(output == static_cast(8)); } { ValueType output; vtkm::cont::ArrayGetValue(8, data, output); VTKM_TEST_ASSERT(output == static_cast(8)); } } } void Test() { TryCopy(); TryCopy(); TryCopy(); } } // anonymous namespace int UnitTestArrayGetValues(int argc, char* argv[]) { return vtkm::cont::testing::Testing::Run(Test, argc, argv); }