Skip to content

Commit 44c350c

Browse files
committed
Add tests to verify that emplace methods do not make copies
1 parent 0019f88 commit 44c350c

2 files changed

Lines changed: 104 additions & 0 deletions

File tree

test/Jamfile.v2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@ test-suite "circular_buffer"
2828
[ run space_optimized_test.cpp : : : <threading>single <define>"BOOST_CB_ENABLE_DEBUG=1" : space_optimized_test_dbg ]
2929
[ run soft_iterator_invalidation.cpp : : : <threading>single : ]
3030
[ run constant_erase_test.cpp : : : <threading>single : ]
31+
[ run emplace_test_copies.cpp : : : <threading>single : ]
3132
[ compile bounded_buffer_comparison.cpp : <threading>multi : ]
3233
;

test/emplace_test_copies.cpp

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// Tests to track that emplace does not make copies.
2+
3+
// Copyright (c) 2023 Alexander van Gessel
4+
5+
// Use, modification, and distribution is subject to the Boost Software
6+
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7+
// http://www.boost.org/LICENSE_1_0.txt)
8+
9+
#include "test.hpp"
10+
11+
#include <boost/lexical_cast.hpp>
12+
13+
typedef class BaseConstructDestructTracker {
14+
public:
15+
static size_t construct_count;
16+
static size_t destruct_count;
17+
18+
BaseConstructDestructTracker() {
19+
++construct_count;
20+
}
21+
~BaseConstructDestructTracker() {
22+
++destruct_count;
23+
}
24+
static void reset() {
25+
construct_count = 0;
26+
destruct_count = 0;
27+
}
28+
} BCDT;
29+
30+
size_t BCDT::construct_count;
31+
size_t BCDT::destruct_count;
32+
33+
class NoArgTracker : BaseConstructDestructTracker {};
34+
template<typename A1, typename A2>
35+
class TwoArgTracker {
36+
A1 a1;
37+
A2 a2;
38+
39+
public:
40+
explicit TwoArgTracker(A1 a1, A2 a2) : a1(a1), a2(a2) {}
41+
};
42+
43+
void track_base_test() {
44+
const size_t capacity = 8;
45+
const size_t iters = 16;
46+
BCDT::reset();
47+
circular_buffer<NoArgTracker> cb(capacity);
48+
BOOST_TEST(BCDT::construct_count == 0);
49+
BOOST_TEST(BCDT::destruct_count == 0);
50+
for(size_t i = 1; i <= iters; ++i) {
51+
cb.emplace_back();
52+
BOOST_TEST(BCDT::construct_count == i);
53+
BOOST_TEST(BCDT::destruct_count == i - cb.size());
54+
}
55+
for(size_t i = 1; i <= capacity; ++i) {
56+
cb.pop_back();
57+
BOOST_TEST(BCDT::construct_count == iters);
58+
BOOST_TEST(BCDT::destruct_count == iters - cb.size());
59+
}
60+
BOOST_TEST(BCDT::construct_count == BCDT::destruct_count);
61+
BOOST_TEST(cb.size() == 0);
62+
BCDT::reset();
63+
for(size_t i = 1; i <= iters; ++i) {
64+
cb.emplace_front();
65+
BOOST_TEST(BCDT::construct_count == i);
66+
BOOST_TEST(BCDT::destruct_count == i - cb.size());
67+
}
68+
}
69+
70+
void track_twoarg_test() {
71+
const size_t capacity = 8;
72+
const size_t iters = 16;
73+
const std::string prefix = "iteration ";
74+
BCDT::reset();
75+
circular_buffer<TwoArgTracker<size_t, std::string>> cb(capacity);
76+
BOOST_TEST(BCDT::construct_count == 0);
77+
BOOST_TEST(BCDT::destruct_count == 0);
78+
for(size_t i = 1; i <= iters; ++i) {
79+
cb.emplace_back(i, prefix + boost::lexical_cast<std::string>(i));
80+
BOOST_TEST(BCDT::construct_count == i);
81+
BOOST_TEST(BCDT::destruct_count == i - cb.size());
82+
}
83+
for(size_t i = 1; i <= capacity; ++i) {
84+
cb.pop_back();
85+
BOOST_TEST(BCDT::construct_count == iters);
86+
BOOST_TEST(BCDT::destruct_count == iters - cb.size());
87+
}
88+
BOOST_TEST(BCDT::construct_count == BCDT::destruct_count);
89+
BOOST_TEST(cb.size() == 0);
90+
BCDT::reset();
91+
for(size_t i = 1; i <= iters; ++i) {
92+
cb.emplace_front(i, prefix + boost::lexical_cast<std::string>(i));
93+
BOOST_TEST(BCDT::construct_count == i);
94+
BOOST_TEST(BCDT::destruct_count == i - cb.size());
95+
}
96+
}
97+
98+
// test main
99+
int main()
100+
{
101+
track_base_test();
102+
return boost::report_errors();
103+
}

0 commit comments

Comments
 (0)