20 #include <ripple/core/ClosureCounter.h>
21 #include <ripple/beast/unit_test.h>
22 #include <test/jtx/Env.h>
44 BEAST_EXPECT (voidCounter.
count() == 0);
48 auto wrapped = voidCounter.
wrap ([&evidence] () { ++evidence; });
49 BEAST_EXPECT (voidCounter.
count() == 1);
50 BEAST_EXPECT (evidence == 0);
51 BEAST_EXPECT (wrapped);
55 BEAST_EXPECT (evidence == 1);
57 BEAST_EXPECT (evidence == 2);
60 wrapped = boost::none;
61 BEAST_EXPECT (voidCounter.
count() == 0);
66 BEAST_EXPECT (setCounter.
count() == 0);
70 auto setInt = [&evidence] (
int i) { evidence = i; };
71 auto wrapped = setCounter.
wrap (setInt);
73 BEAST_EXPECT (setCounter.
count() == 1);
74 BEAST_EXPECT (evidence == 0);
75 BEAST_EXPECT (wrapped);
79 BEAST_EXPECT (evidence == 5);
81 BEAST_EXPECT (evidence == 11);
84 wrapped = boost::none;
85 BEAST_EXPECT (setCounter.
count() == 0);
90 BEAST_EXPECT (sumCounter.
count() == 0);
93 auto const sum = [] (
int ii,
int jj) {
return ii + jj; };
94 auto wrapped = sumCounter.
wrap (
sum);
96 BEAST_EXPECT (sumCounter.
count() == 1);
97 BEAST_EXPECT (wrapped);
100 BEAST_EXPECT ((*wrapped)(5, 2) == 7);
101 BEAST_EXPECT ((*wrapped)(2, -8) == -6);
104 wrapped = boost::none;
105 BEAST_EXPECT (sumCounter.
count() == 0);
131 ,
moves (rhs.moves + 1)
132 ,
str (std::move(rhs.str)) {}
160 BEAST_EXPECT (strCounter.
count() == 0);
162 auto wrapped = strCounter.
wrap (
165 BEAST_EXPECT (strCounter.
count() == 1);
166 BEAST_EXPECT (wrapped);
170 BEAST_EXPECT (result.
copies == 2);
171 BEAST_EXPECT (result.
moves == 1);
172 BEAST_EXPECT (result.
str ==
"value!");
173 BEAST_EXPECT (strValue.
str.
size() == 5);
178 BEAST_EXPECT (strCounter.
count() == 0);
180 auto wrapped = strCounter.
wrap (
183 BEAST_EXPECT (strCounter.
count() == 1);
184 BEAST_EXPECT (wrapped);
188 BEAST_EXPECT (result.
copies == 1);
190 BEAST_EXPECT (result.
str ==
"const lvalue!");
191 BEAST_EXPECT (strConstLValue.
str.
size() == 12);
196 BEAST_EXPECT (strCounter.
count() == 0);
198 auto wrapped = strCounter.
wrap (
201 BEAST_EXPECT (strCounter.
count() == 1);
202 BEAST_EXPECT (wrapped);
206 BEAST_EXPECT (result.
copies == 1);
207 BEAST_EXPECT (result.
moves == 0);
208 BEAST_EXPECT (result.
str ==
"lvalue!");
209 BEAST_EXPECT (strLValue.
str == result.
str);
214 BEAST_EXPECT (strCounter.
count() == 0);
216 auto wrapped = strCounter.
wrap (
222 return std::move(
in +=
"!");
225 BEAST_EXPECT (strCounter.
count() == 1);
226 BEAST_EXPECT (wrapped);
230 TrackedString strRValue (
"rvalue abcdefghijklmnopqrstuvwxyz");
231 TrackedString const result = (*wrapped)(std::move(strRValue));
232 BEAST_EXPECT (result.
copies == 0);
233 BEAST_EXPECT (result.
moves == 1);
234 BEAST_EXPECT (result.
str ==
"rvalue abcdefghijklmnopqrstuvwxyz!");
235 BEAST_EXPECT (strRValue.
str.
size() == 0);
243 BEAST_EXPECT (voidCounter.
count() == 0);
245 auto wrapped1 = voidCounter.
wrap ([] () {});
246 BEAST_EXPECT (voidCounter.
count() == 1);
249 auto wrapped2 (wrapped1);
250 BEAST_EXPECT (voidCounter.
count() == 2);
253 auto wrapped3 (std::move(wrapped2));
254 BEAST_EXPECT (voidCounter.
count() == 3);
257 auto wrapped4 = voidCounter.
wrap ([] () {});
258 BEAST_EXPECT (voidCounter.
count() == 4);
260 BEAST_EXPECT (voidCounter.
count() == 3);
262 BEAST_EXPECT (voidCounter.
count() == 2);
264 BEAST_EXPECT (voidCounter.
count() == 1);
266 BEAST_EXPECT (voidCounter.
count() == 0);
269 using namespace std::chrono_literals;
270 voidCounter.
join(
"testWrap", 1ms,
j);
273 BEAST_EXPECT (voidCounter.
wrap ([] () {}) == boost::none);
280 BEAST_EXPECT (voidCounter.
count() == 0);
282 auto wrapped = (voidCounter.
wrap ([] () {}));
283 BEAST_EXPECT (voidCounter.
count() == 1);
287 std::thread localThread ([&voidCounter, &threadExited,
this] ()
290 using namespace std::chrono_literals;
291 voidCounter.
join(
"testWaitOnJoin", 1ms,
j);
292 threadExited.store (
true);
296 while (! voidCounter.
joined());
301 using namespace std::chrono_literals;
303 BEAST_EXPECT (threadExited ==
false);
307 wrapped = boost::none;
308 BEAST_EXPECT (voidCounter.
count() == 0);
311 while (threadExited ==
false);