From 18be33a18c5021dbe1630234d391d3200dc3c758 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 30 Dec 2020 18:12:43 +0300 Subject: [PATCH] Add td::unique helper method. --- tdutils/td/utils/misc.h | 20 ++++++++++++++++++++ tdutils/test/misc.cpp | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/tdutils/td/utils/misc.h b/tdutils/td/utils/misc.h index 323d33626..0e3e64946 100644 --- a/tdutils/td/utils/misc.h +++ b/tdutils/td/utils/misc.h @@ -124,6 +124,26 @@ bool remove(V &v, const T &value) { return true; } +template +void unique(V &v) { + if (v.empty()) { + return; + } + + std::sort(v.begin(), v.end()); // caller will need to #include + + size_t j = 1; + for (size_t i = 1; i < v.size(); i++) { + if (v[i] != v[i - 1]) { + if (i != j) { + v[j] = std::move(v[i]); + } + j++; + } + } + v.resize(j); +} + template bool contains(const V &v, const T &value) { for (auto &x : v) { diff --git a/tdutils/test/misc.cpp b/tdutils/test/misc.cpp index 8f5e7a385..afdf3e3ab 100644 --- a/tdutils/test/misc.cpp +++ b/tdutils/test/misc.cpp @@ -38,6 +38,7 @@ #include "td/utils/unicode.h" #include "td/utils/utf8.h" +#include #include #include #include @@ -346,6 +347,25 @@ TEST(Misc, remove) { test_remove(v, 1, v); } +static void test_unique(td::vector v, td::vector expected) { + td::unique(v); + ASSERT_EQ(expected, v); +} + +TEST(Misc, unique) { + test_unique({1, 2, 3, 4, 5, 6}, {1, 2, 3, 4, 5, 6}); + test_unique({5, 2, 1, 6, 3, 4}, {1, 2, 3, 4, 5, 6}); + test_unique({}, {}); + test_unique({0}, {0}); + test_unique({0, 0}, {0}); + test_unique({0, 1}, {0, 1}); + test_unique({1, 0}, {0, 1}); + test_unique({1, 1}, {1}); + test_unique({3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 0}, {0, 1, 2, 3}); + test_unique({3, 3, 3, 3, 3}, {3}); + test_unique({3, 3, -1, 3, 3}, {-1, 3}); +} + TEST(Misc, contains) { td::vector v{1, 3, 5, 7, 4, 2}; for (int i = -10; i < 20; i++) {