/**************************************************************************** * Copyright (c) 2017-2022 by the ArborX authors * * All rights reserved. * * * * This file is part of the ArborX library. ArborX is * * distributed under a BSD 3-clause license. For the licensing terms see * * the LICENSE file in the top-level directory. * * * * SPDX-License-Identifier: BSD-3-Clause * ****************************************************************************/ #include #include #include #include #include using ArborX::PredicatesTag; using ArborX::PrimitivesTag; using ArborX::Details::check_valid_access_traits; // NOTE Let's not bother with __host__ __device__ annotations here struct NoAccessTraitsSpecialization {}; struct EmptySpecialization {}; template struct ArborX::AccessTraits {}; struct InvalidMemorySpace {}; template struct ArborX::AccessTraits { using memory_space = void; }; struct SizeMemberFunctionNotStatic {}; template struct ArborX::AccessTraits { using memory_space = Kokkos::HostSpace; int size(SizeMemberFunctionNotStatic) { return 255; } }; template using deduce_type_t = decltype(ArborX::AccessTraits::get(std::declval(), 0)); void test_access_traits_compile_only() { Kokkos::View p; Kokkos::View v; check_valid_access_traits(PrimitivesTag{}, p); check_valid_access_traits(PrimitivesTag{}, v); auto p_with_indices = ArborX::Experimental::attach_indices(p); check_valid_access_traits(PrimitivesTag{}, p_with_indices, ArborX::Details::DoNotCheckGetReturnType()); static_assert( std::is_same_v, ArborX::PairValueIndex>); auto p_with_indices_long = ArborX::Experimental::attach_indices(p); static_assert(std::is_same_v< deduce_type_t, ArborX::PairValueIndex>); using NearestPredicate = decltype(ArborX::nearest(ArborX::Point{})); Kokkos::View q; check_valid_access_traits(PredicatesTag{}, q); auto q_with_indices = ArborX::Experimental::attach_indices(q); check_valid_access_traits(PredicatesTag{}, q_with_indices); using predicate = deduce_type_t; static_assert( std::is_same_v< std::decay_t()))>, long>); struct CustomIndex { char index; CustomIndex(int i) { index = i; } }; auto q_with_custom_indices = ArborX::Experimental::attach_indices(q); check_valid_access_traits(PredicatesTag{}, q_with_custom_indices); using predicate_custom = deduce_type_t; static_assert(std::is_same_v()))>, CustomIndex>); // Uncomment to see error messages // check_valid_access_traits(PrimitivesTag{}, NoAccessTraitsSpecialization{}); // check_valid_access_traits(PrimitivesTag{}, EmptySpecialization{}); // check_valid_access_traits(PrimitivesTag{}, InvalidMemorySpace{}); // check_valid_access_traits(PrimitivesTag{}, SizeMemberFunctionNotStatic{}); } void test_deduce_point_type_from_view() { using GoodOlePoint = ArborX::Point; using ArborX::PrimitivesTag; using ArborX::ExperimentalHyperGeometry::Point; static_assert( std::is_same_v, PrimitivesTag>, GoodOlePoint>); static_assert( std::is_same_v, PrimitivesTag>, Point<3>>); static_assert( std::is_same_v, PrimitivesTag>, Point<2>>); static_assert( std::is_same_v, PrimitivesTag>, Point<5>>); }