120c6b9d4SChristian Trott // -*- C++ -*- 220c6b9d4SChristian Trott //===----------------------------------------------------------------------===// 320c6b9d4SChristian Trott // 420c6b9d4SChristian Trott // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 520c6b9d4SChristian Trott // See https://llvm.org/LICENSE.txt for license information. 620c6b9d4SChristian Trott // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 720c6b9d4SChristian Trott // 820c6b9d4SChristian Trott // Kokkos v. 4.0 920c6b9d4SChristian Trott // Copyright (2022) National Technology & Engineering 1020c6b9d4SChristian Trott // Solutions of Sandia, LLC (NTESS). 1120c6b9d4SChristian Trott // 1220c6b9d4SChristian Trott // Under the terms of Contract DE-NA0003525 with NTESS, 1320c6b9d4SChristian Trott // the U.S. Government retains certain rights in this software. 1420c6b9d4SChristian Trott // 1520c6b9d4SChristian Trott //===---------------------------------------------------------------------===// 1620c6b9d4SChristian Trott 1720c6b9d4SChristian Trott #ifndef _LIBCPP___MDSPAN_DEFAULT_ACCESSOR_H 1820c6b9d4SChristian Trott #define _LIBCPP___MDSPAN_DEFAULT_ACCESSOR_H 1920c6b9d4SChristian Trott 2020c6b9d4SChristian Trott #include <__config> 21*e99c4906SNikolas Klauser #include <__cstddef/size_t.h> 2220c6b9d4SChristian Trott #include <__type_traits/is_abstract.h> 2320c6b9d4SChristian Trott #include <__type_traits/is_array.h> 2420c6b9d4SChristian Trott #include <__type_traits/is_convertible.h> 2520c6b9d4SChristian Trott #include <__type_traits/remove_const.h> 2620c6b9d4SChristian Trott 2720c6b9d4SChristian Trott #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2820c6b9d4SChristian Trott # pragma GCC system_header 2920c6b9d4SChristian Trott #endif 3020c6b9d4SChristian Trott 3120c6b9d4SChristian Trott _LIBCPP_PUSH_MACROS 3220c6b9d4SChristian Trott #include <__undef_macros> 3320c6b9d4SChristian Trott 3420c6b9d4SChristian Trott _LIBCPP_BEGIN_NAMESPACE_STD 3520c6b9d4SChristian Trott 3620c6b9d4SChristian Trott #if _LIBCPP_STD_VER >= 23 3720c6b9d4SChristian Trott 3820c6b9d4SChristian Trott template <class _ElementType> 3920c6b9d4SChristian Trott struct default_accessor { 4020c6b9d4SChristian Trott static_assert(!is_array_v<_ElementType>, "default_accessor: template argument may not be an array type"); 4120c6b9d4SChristian Trott static_assert(!is_abstract_v<_ElementType>, "default_accessor: template argument may not be an abstract class"); 4220c6b9d4SChristian Trott 4320c6b9d4SChristian Trott using offset_policy = default_accessor; 4420c6b9d4SChristian Trott using element_type = _ElementType; 4520c6b9d4SChristian Trott using reference = _ElementType&; 4620c6b9d4SChristian Trott using data_handle_type = _ElementType*; 4720c6b9d4SChristian Trott 4820c6b9d4SChristian Trott _LIBCPP_HIDE_FROM_ABI constexpr default_accessor() noexcept = default; 4920c6b9d4SChristian Trott template <class _OtherElementType> 5020c6b9d4SChristian Trott requires(is_convertible_v<_OtherElementType (*)[], element_type (*)[]>) 5120c6b9d4SChristian Trott _LIBCPP_HIDE_FROM_ABI constexpr default_accessor(default_accessor<_OtherElementType>) noexcept {} 5220c6b9d4SChristian Trott 5320c6b9d4SChristian Trott _LIBCPP_HIDE_FROM_ABI constexpr reference access(data_handle_type __p, size_t __i) const noexcept { return __p[__i]; } 5420c6b9d4SChristian Trott _LIBCPP_HIDE_FROM_ABI constexpr data_handle_type offset(data_handle_type __p, size_t __i) const noexcept { 5520c6b9d4SChristian Trott return __p + __i; 5620c6b9d4SChristian Trott } 5720c6b9d4SChristian Trott }; 5820c6b9d4SChristian Trott 5920c6b9d4SChristian Trott #endif // _LIBCPP_STD_VER >= 23 6020c6b9d4SChristian Trott 6120c6b9d4SChristian Trott _LIBCPP_END_NAMESPACE_STD 6220c6b9d4SChristian Trott 6320c6b9d4SChristian Trott _LIBCPP_POP_MACROS 6420c6b9d4SChristian Trott 6520c6b9d4SChristian Trott #endif // _LIBCPP___MDSPAN_DEFAULT_ACCESSOR_H 66