From 952020a3e2bd5815120cc23c8f6f1ebb4028e7e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Wed, 24 Aug 2022 17:28:48 +0300 Subject: [PATCH] PIVector and PIDeque: split and splitBySize --- libs/main/containers/pideque.h | 34 +++++++++++++++++++++++++++++++++ libs/main/containers/pivector.h | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/libs/main/containers/pideque.h b/libs/main/containers/pideque.h index 3e0fc460..0cd57cd5 100644 --- a/libs/main/containers/pideque.h +++ b/libs/main/containers/pideque.h @@ -2503,6 +2503,40 @@ public: return fl.reshape(rows, cols, order); } + //! \~english Divides an array into a two-dimensional array using the separator `separator`. + //! \~russian Разделяет массив на двумерный массив с помощью разделителя`separator`. + inline PIDeque> split(const T & separator) const { + PIDeque> ret; + if (isEmpty()) return ret; + size_t start = 0; + ssize_t ci = indexOf(separator, start); + while (ci >= 0) { + ret << PIDeque(pid_data + pid_start + start, ci - start); + start = ci + 1; + ci = indexOf(separator, start); + } + if (start < pid_size) { + ret << PIDeque(pid_data + pid_start + start, pid_size - start); + } + return ret; + } + + //! \~english Divides an array into a two-dimensional array in chunks of no more than `sz`. + //! \~russian Разделяет массив на двумерный массив по кускам не более чем `sz`. + inline PIDeque> splitBySize(size_t sz) const { + PIDeque> ret; + if (isEmpty() || sz == 0) return ret; + size_t ch = pid_size / sz; + for (size_t i = 0; i < ch; ++i) { + ret << PIDeque(pid_data + pid_start + sz*i, sz); + } + size_t t = ch*sz; + if (t < pid_size) { + ret << PIDeque(pid_data + pid_start + t, pid_size - t); + } + return ret; + } + private: inline void _reset() { pid_size = 0; diff --git a/libs/main/containers/pivector.h b/libs/main/containers/pivector.h index 0fcea57f..06bc8543 100644 --- a/libs/main/containers/pivector.h +++ b/libs/main/containers/pivector.h @@ -2421,6 +2421,40 @@ public: return fl.reshape(rows, cols, order); } + //! \~english Divides an array into a two-dimensional array using the separator `separator`. + //! \~russian Разделяет массив на двумерный массив с помощью разделителя`separator`. + inline PIVector> split(const T & separator) const { + PIVector> ret; + if (isEmpty()) return ret; + size_t start = 0; + ssize_t ci = indexOf(separator, start); + while (ci >= 0) { + ret << PIVector(piv_data + start, ci - start); + start = ci + 1; + ci = indexOf(separator, start); + } + if (start < piv_size) { + ret << PIVector(piv_data + start, piv_size - start); + } + return ret; + } + + //! \~english Divides an array into a two-dimensional array in chunks of no more than `sz`. + //! \~russian Разделяет массив на двумерный массив по кускам не более чем `sz`. + inline PIVector> splitBySize(size_t sz) const { + PIVector> ret; + if (isEmpty() || sz == 0) return ret; + size_t ch = piv_size / sz; + for (size_t i = 0; i < ch; ++i) { + ret << PIVector(piv_data + sz*i, sz); + } + size_t t = ch*sz; + if (t < piv_size) { + ret << PIVector(piv_data + t, piv_size - t); + } + return ret; + } + private: inline void _reset() { piv_size = 0;