11template<concepts::Integer
T,
size_t... extents>
16 auto result =
Array { extents... };
17 return result.
data()[index];
21 constexpr static auto dynamic_index(
size_t index) ->
size_t {
28 result.data()[i] =
count;
31 return result.data()[index];
34 constexpr static auto dynamic_index_inv(
size_t index) ->
size_t {
35 constexpr auto result = [] {
39 if (dynamic_index(r + 1) == i + 1) {
48 return result.data()[index];
55 constexpr static auto rank() ->
size_t {
return sizeof...(extents); }
58 constexpr Extents() { m_dynamic_extents.fill(0); }
60 template<
typename OtherSizeType,
size_t... other_extents>
61 requires(
sizeof...(other_extents) == rank() &&
69 m_dynamic_extents[dynamic_index(i)] =
other.extent(i);
76 template<
typename... OtherSizeType>
78 (
sizeof...(OtherSizeType) == rank_dynamic() ||
sizeof...(OtherSizeType) == rank()))
79 constexpr explicit Extents(OtherSizeType... values) {
80 if constexpr (
sizeof...(OtherSizeType) == rank_dynamic()) {
83 m_dynamic_extents = {
static_cast<SizeType
>(util::move(values))... };
86 auto new_extents =
Extents(as_extents);
91 template<
typename OtherSizeType,
size_t N>
92 requires(concepts::ConvertibleTo<OtherSizeType const&, SizeType> && (
N == rank_dynamic() ||
N == rank()))
93 constexpr explicit(N != rank_dynamic())
Extents(
Span<OtherSizeType, N> extents_array) {
95 if constexpr (
N == rank_dynamic()) {
96 m_dynamic_extents = { util::as_const(extents_array[indices])... };
98 m_dynamic_extents = { util::as_const(extents_array[dynamic_index_inv(indices)])... };
103 template<
typename OtherSizeType,
size_t N>
104 requires(concepts::ConvertibleTo<OtherSizeType const&, SizeType> && (
N == rank_dynamic() ||
N == rank()))
105 constexpr explicit(N != rank_dynamic())
Extents(
Array<OtherSizeType, N> const& extents_array)
106 :
Extents(extents_array.span()) {}
108 constexpr auto extent(
size_t index)
const ->
size_t {
109 auto extent = static_extent(index);
113 if constexpr (rank_dynamic() != 0) {
114 return m_dynamic_extents[dynamic_index(index)];
120 constexpr auto fwd_prod_of_extents(
size_t i)
const ->
size_t {
128 constexpr auto rev_prod_of_extents(
size_t i)
const ->
size_t {
136 template<
typename OtherSizeType>
137 constexpr static auto index_cast(OtherSizeType&& i) {
138 if constexpr (concepts::Integral<OtherSizeType> && !concepts::SameAs<OtherSizeType, bool>) {
141 return static_cast<SizeType
>(i);
146 template<
typename OtherSizeType,
size_t... other_extents>
148 if (a.rank() != b.rank()) {
152 return a.extent(i) == b.extent(i);
156 [[no_unique_address]]
Array<SizeType, rank_dynamic()> m_dynamic_extents {};
159template<
typename... Integrals>
160requires(concepts::ConvertibleTo<Integrals, size_t> && ...)
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition extents_forward_declaration.h:11
constexpr other_extents const & other
Definition extents.h:66
static constexpr auto static_extent(size_t index) -> size_t
Definition extents.h:15
static constexpr auto rank() -> size_t
Definition extents.h:55
size_t RankType
Definition extents.h:53
static constexpr auto rank_dynamic() -> size_t
Definition extents.h:56
T SizeType
Definition extents.h:52
constexpr Extents()
Definition extents.h:58
Definition span_forward_declaration.h:10
Definition operations.h:99
constexpr auto range
Definition range.h:22
constexpr auto unpack
Definition unpack.h:24
constexpr auto extent
Definition vec.h:39
constexpr auto to_unsigned
Definition to_unsigned.h:16
size_t usize
Definition integers.h:33
std::size_t size_t
Definition size_t.h:12
void unreachable()
Definition unreachable.h:4
Extents(Integrals...) -> Extents< size_t,(Integrals {}, dynamic_extent)... >
constexpr auto dynamic_extent
Definition span_forward_declaration.h:7
constexpr auto operator==(StatusCode< T > const &a, StatusCode< U > const &b) -> bool
Definition status_code_equality.h:7
constexpr auto all_of
Definition all_of.h:24
constexpr auto count
Definition count.h:37
constexpr auto dynamic_extent
Definition span_forward_declaration.h:7
Definition numeric_limits.h:7
Definition span_fixed_size.h:37
constexpr auto data() -> T *
Definition array.h:75