xref: /llvm-project/libcxx/include/__mdspan/default_accessor.h (revision e99c4906e44ae3f921fa05356909d006cda8d954)
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