diff options
Diffstat (limited to 'protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp')
-rw-r--r-- | protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp | 96 |
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); +} |