1/*
2Copyright 2019 Glen Joseph Fernandes
3(glenjofe@gmail.com)
4
5Distributed under the Boost Software License, Version 1.0.
6(http://www.boost.org/LICENSE_1_0.txt)
7*/
8#include <boost/core/alloc_construct.hpp>
9#include <boost/core/default_allocator.hpp>
10#include <boost/core/lightweight_test.hpp>
11
12class type {
13public:
14 explicit type(int x = 0, int y = 0)
15 : value_(x + y) {
16 ++count;
17 }
18
19 type(const type& other)
20 : value_(other.value_) {
21 ++count;
22 }
23
24 ~type() {
25 --count;
26 }
27
28 int value() const {
29 return value_;
30 }
31
32 static int count;
33
34private:
35 int value_;
36};
37
38int type::count = 0;
39
40void test_construct()
41{
42 boost::default_allocator<type> a;
43 type* p = a.allocate(n: 1);
44 boost::alloc_construct(a, p);
45 BOOST_TEST_EQ(type::count, 1);
46 BOOST_TEST_EQ(p->value(), 0);
47 boost::alloc_destroy(a, p);
48 BOOST_TEST_EQ(type::count, 0);
49 a.deallocate(p, 1);
50}
51
52void test_construct_value()
53{
54 boost::default_allocator<type> a;
55 type* p = a.allocate(n: 1);
56 boost::alloc_construct(a, p, u: 1);
57 BOOST_TEST_EQ(type::count, 1);
58 BOOST_TEST_EQ(p->value(), 1);
59 boost::alloc_destroy(a, p);
60 BOOST_TEST_EQ(type::count, 0);
61 a.deallocate(p, 1);
62}
63
64#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
65 !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
66void test_construct_args()
67{
68 boost::default_allocator<type> a;
69 type* p = a.allocate(n: 1);
70 boost::alloc_construct(a, p, u: 1, v: 2);
71 BOOST_TEST_EQ(type::count, 1);
72 BOOST_TEST_EQ(p->value(), 3);
73 boost::alloc_destroy(a, p);
74 BOOST_TEST_EQ(type::count, 0);
75 a.deallocate(p, 1);
76}
77#endif
78
79void test_construct_n()
80{
81 boost::default_allocator<type> a;
82 type* p = a.allocate(n: 3);
83 boost::alloc_construct_n(a, p, n: 3);
84 BOOST_TEST_EQ(type::count, 3);
85 BOOST_TEST_EQ(p[0].value(), 0);
86 BOOST_TEST_EQ(p[1].value(), 0);
87 BOOST_TEST_EQ(p[2].value(), 0);
88 boost::alloc_destroy_n(a, p, n: 3);
89 BOOST_TEST_EQ(type::count, 0);
90 a.deallocate(p, 3);
91}
92
93void test_construct_n_list()
94{
95 boost::default_allocator<type> a;
96 type* p = a.allocate(n: 3);
97 type q(1);
98 boost::alloc_construct_n(a, p, n: 3, l: &q, m: 1);
99 BOOST_TEST_EQ(type::count, 4);
100 BOOST_TEST_EQ(p[0].value(), 1);
101 BOOST_TEST_EQ(p[1].value(), 1);
102 BOOST_TEST_EQ(p[2].value(), 1);
103 boost::alloc_destroy_n(a, p, n: 3);
104 BOOST_TEST_EQ(type::count, 1);
105 a.deallocate(p, 3);
106}
107
108void test_construct_n_iterator()
109{
110 boost::default_allocator<type> a;
111 type* p = a.allocate(n: 3);
112 type l[] = { type(1), type(2), type(3) };
113 boost::alloc_construct_n(a, p, n: 3, b: &l[0]);
114 BOOST_TEST_EQ(type::count, 6);
115 BOOST_TEST_EQ(p[0].value(), 1);
116 BOOST_TEST_EQ(p[1].value(), 2);
117 BOOST_TEST_EQ(p[2].value(), 3);
118 boost::alloc_destroy_n(a, p, n: 3);
119 BOOST_TEST_EQ(type::count, 3);
120 a.deallocate(p, 3);
121}
122
123int main()
124{
125 test_construct();
126 test_construct_value();
127#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
128 !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
129 test_construct_args();
130#endif
131 test_construct_n();
132 test_construct_n_list();
133 test_construct_n_iterator();
134 return boost::report_errors();
135}
136

source code of boost/libs/core/test/alloc_construct_test.cpp