6 #ifndef LLU_CONTAINERS_MARRAYDIMENSIONS_H_
7 #define LLU_CONTAINERS_MARRAYDIMENSIONS_H_
9 #include <initializer_list>
10 #include <type_traits>
45 template<
typename T,
typename =
typename std::enable_if_t<std::is_
integral_v<T>>>
54 template<
typename T,
typename =
typename std::enable_if_t<std::is_
integral_v<T>>>
63 template<
typename InputIter,
typename = enable_if_input_iterator<InputIter>>
69 mint
rank() const noexcept {
70 return static_cast<mint
>(dims.size());
76 const mint*
data() const noexcept {
86 const std::vector<mint>&
get() const noexcept {
95 mint
get(mint dim)
const {
96 if (dim >=
rank() || dim < 0) {
99 return dims[
static_cast<decltype(dims)::size_type
>(dim)];
106 mint
getIndex(
const std::vector<mint>& indices)
const;
127 return flattenedLength;
132 mint flattenedLength = 1;
135 std::vector<mint> dims;
138 std::vector<mint> offsets;
150 mint checkContainerSize(T s)
const;
153 [[nodiscard]] mint totalLengthFromDims() const noexcept;
155 static constexpr std::
size_t MAX_DIM = static_cast<std::
size_t>((std::numeric_limits<mint>::max)());
158 template<typename T, typename>
161 template<
typename T,
typename>
164 template<
typename InputIter,
typename>
166 if (mint depth = checkContainerSize(std::distance(dimsBegin, dimsEnd)); depth >= 1) {
167 auto dimsOk = std::all_of(dimsBegin, dimsEnd - 1, [](
auto d) {
return (d > 0) && (
static_cast<std::size_t
>(d) <= MAX_DIM); }) &&
168 (dimsBegin[depth - 1] >= 0) && (
static_cast<std::size_t
>(dimsBegin[depth - 1]) <= MAX_DIM);
174 std::copy(dimsBegin, dimsEnd, std::back_inserter(dims));
175 flattenedLength = totalLengthFromDims();
180 mint MArrayDimensions::checkContainerSize(T s)
const {
181 if (s < 0 ||
static_cast<std::size_t
>(s) > MAX_DIM) {
184 return static_cast<mint
>(s);