summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/tdutils/test/SharedObjectPool.cpp
blob: 61d956f4e6fbfafb1f4837108103a8e127d1078b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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);
}