diff options
| author | levlam <levlam@telegram.org> | 2024-11-01 23:22:16 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2024-11-01 23:22:16 +0300 |
| commit | b3c741ff2e1079d2d7f26329b288df6118421b85 (patch) | |
| tree | 52e795d4ecffb2c59955db90cf3993c44f37711e /tdutils | |
| parent | 4e5bd36f49203f5a8aeec24b2157605670560cf1 (diff) | |
Add td::vector_split.
Diffstat (limited to 'tdutils')
| -rw-r--r-- | tdutils/td/utils/algorithm.h | 17 | ||||
| -rw-r--r-- | tdutils/test/misc.cpp | 23 |
2 files changed, 40 insertions, 0 deletions
diff --git a/tdutils/td/utils/algorithm.h b/tdutils/td/utils/algorithm.h index 7046c8e65..7aea70d9b 100644 --- a/tdutils/td/utils/algorithm.h +++ b/tdutils/td/utils/algorithm.h @@ -46,6 +46,23 @@ auto transform(V &&v, const Func &f) { return detail::transform_helper<std::decay_t<V>>().transform(std::forward<V>(v), f); } +template <class T> +vector<vector<T>> vector_split(vector<T> &&v, std::size_t size) { + CHECK(size != 0); + vector<vector<T>> result((v.size() + size - 1) / size); + if (result.size() <= 1) { + if (!result.empty()) { + result[0] = std::move(v); + } + return result; + } + for (size_t i = 0; i + 1 < result.size(); i++) { + result[i] = vector<T>(v.begin() + i * size, v.begin() + (i + 1) * size); + } + result.back() = vector<T>(v.begin() + (result.size() - 1) * size, v.end()); + return result; +} + template <class V, class Func> bool remove_if(V &v, const Func &f) { size_t i = 0; diff --git a/tdutils/test/misc.cpp b/tdutils/test/misc.cpp index cabd4e6ef..a3ae1b4e6 100644 --- a/tdutils/test/misc.cpp +++ b/tdutils/test/misc.cpp @@ -322,6 +322,29 @@ TEST(Misc, bench_zero_encode) { td::bench(ZeroEncodeBenchmark()); } +static void test_vector_split(td::vector<char> v, std::size_t size, const td::vector<td::vector<char>> &expected) { + auto split = td::vector_split(std::move(v), size); + if (expected != split) { + LOG(FATAL) << "Receive " << split << ", expected " << expected << " in vector_split"; + } +} + +TEST(Misc, vector_split) { + test_vector_split({}, 1, {}); + test_vector_split({}, 2, {}); + test_vector_split({'1'}, 1, {{'1'}}); + test_vector_split({'1'}, 2, {{'1'}}); + td::vector<char> v{'1', '2', '3', '4', '5', '6'}; + test_vector_split(v, 1, {{'1'}, {'2'}, {'3'}, {'4'}, {'5'}, {'6'}}); + test_vector_split(v, 2, {{'1', '2'}, {'3', '4'}, {'5', '6'}}); + test_vector_split(v, 3, {{'1', '2', '3'}, {'4', '5', '6'}}); + test_vector_split(v, 4, {{'1', '2', '3', '4'}, {'5', '6'}}); + test_vector_split(v, 5, {{'1', '2', '3', '4', '5'}, {'6'}}); + test_vector_split(v, 6, {v}); + test_vector_split(v, 7, {v}); + test_vector_split(v, 107, {v}); +} + template <class T> static void test_remove_if(td::vector<int> v, const T &func, const td::vector<int> &expected) { td::remove_if(v, func); |
