summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp')
-rw-r--r--protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp b/protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp
new file mode 100644
index 0000000000..61d956f4e6
--- /dev/null
+++ b/protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp
@@ -0,0 +1,96 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+#include "td/utils/logging.h"
+#include "td/utils/SharedObjectPool.h"
+#include "td/utils/tests.h"
+
+#include <memory>
+
+TEST(AtomicRefCnt, simple) {
+ td::detail::AtomicRefCnt cnt{0};
+ cnt.inc();
+ cnt.inc();
+ CHECK(!cnt.dec());
+ cnt.inc();
+ CHECK(!cnt.dec());
+ CHECK(cnt.dec());
+ cnt.inc();
+ CHECK(cnt.dec());
+}
+
+template <class T, class D>
+using Ptr = td::detail::SharedPtr<T, D>;
+class Deleter {
+ public:
+ template <class T>
+ void operator()(T *t) {
+ std::default_delete<T>()(t);
+ was_delete() = true;
+ }
+ static bool &was_delete() {
+ static bool flag = false;
+ return flag;
+ }
+};
+
+TEST(SharedPtr, simple) {
+ CHECK(!Deleter::was_delete());
+ Ptr<std::string, Deleter> ptr = Ptr<std::string, Deleter>::create("hello");
+ auto ptr2 = ptr;
+ CHECK(*ptr == "hello");
+ CHECK(*ptr2 == "hello");
+ ptr.reset();
+ CHECK(*ptr2 == "hello");
+ CHECK(ptr.empty());
+ Ptr<std::string, Deleter> ptr3 = std::move(ptr2);
+ CHECK(ptr2.empty());
+ CHECK(*ptr3 == "hello");
+ ptr = ptr3;
+ CHECK(*ptr3 == "hello");
+ ptr3.reset();
+ CHECK(*ptr == "hello");
+ ptr2 = std::move(ptr);
+ CHECK(ptr.empty());
+ CHECK(*ptr2 == "hello");
+ ptr2 = ptr2;
+ CHECK(*ptr2 == "hello");
+ CHECK(!Deleter::was_delete());
+ ptr2.reset();
+ CHECK(Deleter::was_delete());
+ CHECK(ptr2.empty());
+}
+
+TEST(SharedObjectPool, simple) {
+ class Node {
+ public:
+ Node() {
+ cnt()++;
+ };
+ ~Node() {
+ cnt()--;
+ }
+ static int &cnt() {
+ static int cnt_ = 0;
+ return cnt_;
+ }
+ };
+ {
+ td::SharedObjectPool<Node> pool;
+ pool.alloc();
+ pool.alloc();
+ pool.alloc();
+ pool.alloc();
+ pool.alloc();
+ CHECK(Node::cnt() == 0);
+ CHECK(pool.total_size() == 1);
+ CHECK(pool.calc_free_size() == 1);
+ pool.alloc(), pool.alloc(), pool.alloc();
+ CHECK(pool.total_size() == 3);
+ CHECK(pool.calc_free_size() == 3);
+ }
+ CHECK(Node::cnt() == 0);
+}