diff --git a/libs/main/containers/picontainers.h b/libs/main/containers/picontainers.h index 26528c0f..05891bdd 100644 --- a/libs/main/containers/picontainers.h +++ b/libs/main/containers/picontainers.h @@ -159,4 +159,14 @@ template _PIReverseWrapper PIReverseWrap(const C & c) {return _P #define piForeachRC(i, c) for(const i : PIReverseWrap(c)) #define piForeachCR piForeachRC + +//! \~\brief +//! \~english Reshape order enum for reshape() function. +//! \~russian Порядок обхода для функции изменения размерности reshape(). +//! \~ \sa \a PIVector::reshape(), \a PIDeque::reshape() +enum ReshapeOrder { + ReshapeByRow, + ReshapeByColumn +}; + #endif // PICONTAINERS_H diff --git a/libs/main/containers/pivector.h b/libs/main/containers/pivector.h index a343ce74..6e899991 100644 --- a/libs/main/containers/pivector.h +++ b/libs/main/containers/pivector.h @@ -211,14 +211,6 @@ public: return *this; } - //! \~\brief - //! \~english Reshape order enum for \a reshape() function. - //! \~russian Порядок обхода для функции изменения размерности \a reshape(). - enum ReshapeOrder { - byRow, - byColumn - }; - class iterator { friend class PIVector; private: @@ -1939,22 +1931,36 @@ public: return ret; } - inline PIVector> reshape(size_t rows, size_t cols, ReshapeOrder order = byRow) const { - PIVector> ret; - if (isEmpty()) return ret; + //! \brief + //! \~english Changes the dimension of the array, creates a two-dimensional array from a one-dimensional array. + //! \~russian Изменяет размерность массива, из одномерного массива создает двухмерный. + //! \~\details + //! \~russian + //! \~english + //! \~\code + //! PIVector v{1, 2, 3, 4}; + //! PIVector> m1 = v.reshape(2,2); + //! piCout << m1; // {{1, 2}, {3, 4}} + //! PIVector> m2 = v.reshape(2,2, ReshapeByColumn); + //! piCout << m2; // {{1, 3}, {2, 4}} + //! \endcode + //! \~\sa \a map(), \a reduce() + inline PIVector> reshape(size_t rows, size_t cols, ReshapeOrder order = ReshapeByRow) const { #ifndef NDEBUG if (rows*cols != piv_size) { printf("error with PIVector<%s>::reshape\n", __PIP_TYPENAME__(T)); } #endif assert(rows*cols == piv_size); + PIVector> ret; + if (isEmpty()) return ret; ret.resize(rows); - if (order == byRow) { + if (order == ReshapeByRow) { for (size_t r = 0; r < rows; r++) { ret[r] = PIVector(&(piv_data[r*cols]), cols); } } - if (order == byColumn) { + if (order == ReshapeByColumn) { for (size_t r = 0; r < rows; r++) { ret[r].resize(cols); for (size_t c = 0; c < cols; c++) { @@ -1968,18 +1974,18 @@ public: template>::value , int>::type = 0> - inline PIVector reshape(ReshapeOrder order = byRow) const { + inline PIVector flat(ReshapeOrder order = ReshapeByRow) const { PIVector ret; if (isEmpty()) return ret; size_t rows = size(); size_t cols = at(0).size(); ret.reserve(rows * cols); - if (order == byRow) { + if (order == ReshapeByRow) { for (size_t r = 0; r < rows; r++) { ret.append(at(r)); } } - if (order == byColumn) { + if (order == ReshapeByColumn) { for (size_t c = 0; c < cols; c++) { for (size_t r = 0; r < rows; r++) { ret << at(r)[c]; @@ -1990,6 +1996,37 @@ public: return ret; } + template>::value + , int>::type = 0> + inline PIVector> reshape(size_t rows, size_t cols, ReshapeOrder order = ReshapeByRow) const { +#ifndef NDEBUG + if (rows*cols != piv_size) { + printf("error with PIVector<%s>::reshape\n", __PIP_TYPENAME__(T)); + } +#endif + assert(rows*cols == piv_size); + PIVector> ret; + if (isEmpty()) return ret; +// size_t old_rows = size(); +// size_t old_cols = at(0).size(); +// ret.resize(rows); +// if (order == ReshapeByRow) { +// for (size_t r = 0; r < rows; r++) { +// ret.append(at(r)); +// } +// } +// if (order == ReshapeByColumn) { +// for (size_t c = 0; c < cols; c++) { +// for (size_t r = 0; r < rows; r++) { +// ret << at(r)[c]; +// } +// } +// } +// ret.resize(rows * cols); + return ret; + } + private: inline void _reset() {piv_size = piv_rsize = 0; piv_data = 0;} inline size_t asize(size_t s) { @@ -2086,7 +2123,6 @@ private: }; - #ifdef PIP_STD_IOSTREAM //! \~english Output operator to [std::ostream](https://en.cppreference.com/w/cpp/io/basic_ostream). //! \~russian Оператор вывода в [std::ostream](https://ru.cppreference.com/w/cpp/io/basic_ostream). @@ -2124,5 +2160,4 @@ inline PICout operator <<(PICout s, const PIVector & v) { template inline void piSwap(PIVector & f, PIVector & s) {f.swap(s);} - #endif // PIVECTOR_H diff --git a/main.cpp b/main.cpp index a0017d6f..1316a65f 100644 --- a/main.cpp +++ b/main.cpp @@ -62,33 +62,8 @@ PICout operator <<(PICout s, const ConstChars & v) { } int main(int argc, char * argv[]) { -// const char * dd = "12345"; -// char text[]{ "hello" }; -// ConstChars s("test"); -// piCout << s; -// ConstChars s2; -// piCout << s2; -// s2 = s; -// piCout << s2; -// s2 = text; -// s = s2; -// piCout << s << s2; -//// s2 = s; -// text[1] = '0'; -// piCout << text; -// piCout << s << s2 << ConstChars(text, 3); -//// piCout << s << s2; -//// PIString ss(s.data(), s.length()); -//// piCout << ss; -// PICout(PICoutManipulators::DefaultControls | PICoutManipulators::AddQuotes) << PIString(dd); - -// piCout << PIString::fromUTF8("test"); -// piCout << PIString::fromUTF8("бюд\n"); -// piCout.writePIString(PIString::fromUTF8("test\n")); -// piCout.writePIString(PIString::fromUTF8("бюд\n")); -// piCout << "бюд\n"; - PIVector v{1, 2, 3, 4, 5}; - int s = v.reduce([](int e, int acc){return acc + e;}); - piCout << s; // 15 + PIVector v{1, 2, 3, 4}; + PIVector> v2 = v.reshape(2,2, ReshapeByRow); + piCout << v2; return 0; }