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 {};