summaryrefslogtreecommitdiff
path: root/libcxx/include/mdspan
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/include/mdspan')
-rw-r--r--libcxx/include/mdspan69
1 files changed, 69 insertions, 0 deletions
diff --git a/libcxx/include/mdspan b/libcxx/include/mdspan
new file mode 100644
index 000000000000..16b4e3e1641a
--- /dev/null
+++ b/libcxx/include/mdspan
@@ -0,0 +1,69 @@
+// -*-C++ - *-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===---------------------------------------------------------------------===//
+
+/*
+ extents synopsis
+
+namespace std {
+ template<class _IndexType, size_t... _Extents>
+ class extents {
+ public:
+ using index_type = _IndexType;
+ using size_type = make_unsigned_t<index_type>;
+ using rank_type = size_t;
+
+ // [mdspan.extents.obs], observers of the multidimensional index space
+ static constexpr rank_type rank() noexcept { return sizeof...(_Extents); }
+ static constexpr rank_type rank_dynamic() noexcept { return dynamic-index(rank()); }
+ static constexpr size_t static_extent(rank_type) noexcept;
+ constexpr index_type extent(rank_type) const noexcept;
+
+ // [mdspan.extents.cons], constructors
+ constexpr extents() noexcept = default;
+
+ template<class _OtherIndexType, size_t... _OtherExtents>
+ constexpr explicit(see below)
+ extents(const extents<_OtherIndexType, _OtherExtents...>&) noexcept;
+ template<class... _OtherIndexTypes>
+ constexpr explicit extents(_OtherIndexTypes...) noexcept;
+ template<class _OtherIndexType, size_t N>
+ constexpr explicit(N != rank_dynamic())
+ extents(span<_OtherIndexType, N>) noexcept;
+ template<class _OtherIndexType, size_t N>
+ constexpr explicit(N != rank_dynamic())
+ extents(const array<_OtherIndexType, N>&) noexcept;
+
+ // [mdspan.extents.cmp], comparison operators
+ template<class _OtherIndexType, size_t... _OtherExtents>
+ friend constexpr bool operator==(const extents&,
+ const extents<_OtherIndexType, _OtherExtents...>&) noexcept;
+
+ private:
+ // libcxx note: we do not use an array here, but we need to preserve the as-if behavior
+ // for example the default constructor must zero initialize dynamic extents
+ array<index_type, rank_dynamic()> dynamic-extents{}; // exposition only
+ };
+
+ template<class... Integrals>
+ explicit extents(Integrals...)
+ -> see below;
+}
+*/
+
+#ifndef _LIBCPP_MDSPAN
+#define _LIBCPP_MDSPAN
+
+#include <__config>
+#include <__mdspan/extents.h>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+# pragma GCC system_header
+#endif
+
+#endif // _LIBCPP_MDSPAN