libjmmcg  release_579_6_g8cffd
A C++ library containing an eclectic mix of useful, advanced components.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
thread_safe_colln.cpp
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright © 2010 by J.M.McGuiness, coder@hussar.me.uk
3 **
4 ** This library is free software; you can redistribute it and/or
5 ** modify it under the terms of the GNU Lesser General Public
6 ** License as published by the Free Software Foundation; either
7 ** version 2.1 of the License, or (at your option) any later version.
8 **
9 ** This library is distributed in the hope that it will be useful,
10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ** Lesser General Public License for more details.
13 **
14 ** You should have received a copy of the GNU Lesser General Public
15 ** License along with this library; if not, write to the Free Software
16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 
19 #include "stdafx.h"
20 
21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
23 
24 #include <boost/mpl/list.hpp>
25 
26 #include "core/thread_safe_adaptors.hpp"
27 #include "core/rw_locking.hpp"
28 
29 using namespace libjmmcg;
30 using namespace ppd;
31 
32 template<typename Mdl, template<class, class> class Colln>
33 struct erew_colln_t {
34  typedef api_lock_traits<platform_api, Mdl> lock_traits;
35  typedef safe_colln<
36  Colln<int, std::allocator<int> >,
38  > result;
39 };
40 
41 template<typename Mdl, template<class, class> class Colln>
42 struct crew_colln_t {
43  typedef api_lock_traits<platform_api, Mdl> lock_traits;
44  typedef safe_colln<
45  Colln<int, std::allocator<int> >,
46  lock::rw::template locker<lock_traits>,
47  typename lock::rw::template locker<lock_traits>::decaying_write_lock_type
48  > result;
49 };
50 
51 template<typename Mdl, template<class, class> class Colln>
52 struct erew_queue_t {
53  typedef api_lock_traits<platform_api, Mdl> lock_traits;
54  typedef queue<
55  Colln<int, std::allocator<int> >,
57  > result;
58 };
59 
60 template<typename Mdl, template<class, class> class Colln>
62  typedef api_lock_traits<platform_api, Mdl> lock_traits;
63  typedef funky_queue<
64  Colln<int, std::allocator<int> >,
66  > result;
67 };
68 
69 typedef boost::mpl::list<
73 
74 BOOST_AUTO_TEST_SUITE(thread_safe_colln)
75 
76 BOOST_AUTO_TEST_SUITE(list_tests)
77 
78 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, Mdl, test_types) {
79  typedef typename erew_colln_t<Mdl, std::list>::result colln_t;
80 
81  colln_t s1;
82  BOOST_CHECK(s1.empty());
83  BOOST_CHECK_EQUAL(s1.size(), 0U);
84  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
85 }
86 
87 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor, Mdl, test_types) {
88  typedef typename erew_colln_t<Mdl, std::list>::result colln_t;
89 
90  typename colln_t::container_type src;
91  colln_t s1(src);
92  BOOST_CHECK(s1.empty());
93  BOOST_CHECK_EQUAL(s1.size(), src.size());
94  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
95 }
96 
97 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor_1, Mdl, test_types) {
98  typedef typename erew_colln_t<Mdl, std::list>::result colln_t;
99 
100  typename colln_t::container_type src;
101  src.push_back(1);
102  colln_t s1(src);
103  BOOST_CHECK(!s1.empty());
104  BOOST_CHECK_EQUAL(s1.size(), src.size());
105  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
106 }
107 
108 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor_2, Mdl, test_types) {
109  typedef typename erew_colln_t<Mdl, std::list>::result colln_t;
110 
111  typename colln_t::container_type src;
112  src.push_back(1);
113  src.push_back(2);
114  colln_t s1(src);
115  BOOST_CHECK(!s1.empty());
116  BOOST_CHECK_EQUAL(s1.size(), src.size());
117  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
118 }
119 
120 BOOST_AUTO_TEST_CASE_TEMPLATE(assignment, Mdl, test_types) {
121  typedef typename erew_colln_t<Mdl, std::list>::result colln_t;
122 
123  colln_t s1,s2;
124  s1=s2;
125  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
126  BOOST_CHECK_EQUAL(s1.size(), s2.size());
127  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
128 }
129 
130 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item, Mdl, test_types) {
131  typedef typename erew_colln_t<Mdl, std::list>::result colln_t;
132 
133  colln_t s1;
134  s1.push_back(1);
135  BOOST_CHECK(!s1.empty());
136  BOOST_CHECK_EQUAL(s1.size(), 1U);
137  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
138  BOOST_CHECK_EQUAL(s1.colln().front(), 1);
139 }
140 
141 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_copy, Mdl, test_types) {
142  typedef typename erew_colln_t<Mdl, std::list>::result colln_t;
143 
144  colln_t s1,s2;
145  s1.push_back(1);
146  s2=s1;
147  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
148  BOOST_CHECK_EQUAL(s1.size(), s2.size());
149  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
150  BOOST_CHECK_EQUAL(s2.colln().front(), 1);
151 }
152 
153 BOOST_AUTO_TEST_CASE_TEMPLATE(clear, Mdl, test_types) {
154  typedef typename erew_colln_t<Mdl, std::list>::result colln_t;
155 
156  colln_t s1;
157  s1.push_back(1);
158  s1.clear();
159  BOOST_CHECK(s1.empty());
160  BOOST_CHECK_EQUAL(s1.size(), 0U);
161  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
162 }
163 
164 BOOST_AUTO_TEST_SUITE_END()
165 
166 BOOST_AUTO_TEST_SUITE(queue_tests)
167 
168 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, Mdl, test_types) {
169  typedef typename erew_queue_t<Mdl, std::list>::result colln_t;
170 
171  colln_t s1;
172  BOOST_CHECK(s1.empty());
173  BOOST_CHECK_EQUAL(s1.size(), 0U);
174  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
175 }
176 
177 BOOST_AUTO_TEST_CASE_TEMPLATE(assignment, Mdl, test_types) {
178  typedef typename erew_queue_t<Mdl, std::list>::result colln_t;
179 
180  colln_t s1,s2;
181  s1=s2;
182  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
183  BOOST_CHECK_EQUAL(s1.size(), s2.size());
184  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
185 }
186 
187 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item, Mdl, test_types) {
188  typedef typename erew_queue_t<Mdl, std::list>::result colln_t;
189 
190  colln_t s1;
191  s1.push_back(1);
192  BOOST_CHECK(!s1.empty());
193  BOOST_CHECK_EQUAL(s1.size(), 1U);
194  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
195  BOOST_CHECK_EQUAL(s1.front(), 1);
196 }
197 
198 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_copy, Mdl, test_types) {
199  typedef typename erew_queue_t<Mdl, std::list>::result colln_t;
200 
201  colln_t s1,s2;
202  s1.push_back(1);
203  s2=s1;
204  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
205  BOOST_CHECK_EQUAL(s1.size(), s2.size());
206  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
207  BOOST_CHECK_EQUAL(s2.front(), 1);
208 }
209 
210 BOOST_AUTO_TEST_CASE_TEMPLATE(clear, Mdl, test_types) {
211  typedef typename erew_queue_t<Mdl, std::list>::result colln_t;
212 
213  colln_t s1;
214  s1.push_back(1);
215  s1.clear();
216  BOOST_CHECK(s1.empty());
217  BOOST_CHECK_EQUAL(s1.size(), 0U);
218  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
219 }
220 
221 BOOST_AUTO_TEST_SUITE_END()
222 
223 BOOST_AUTO_TEST_SUITE(funky_queue_tests)
224 
225 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, Mdl, test_types) {
226  typedef typename erew_funky_queue_t<Mdl, std::list>::result colln_t;
227 
228  colln_t s1;
229  BOOST_CHECK(s1.empty());
230  BOOST_CHECK_EQUAL(s1.size(), 0U);
231 }
232 
233 BOOST_AUTO_TEST_CASE_TEMPLATE(assignment, Mdl, test_types) {
234  typedef typename erew_funky_queue_t<Mdl, std::list>::result colln_t;
235 
236  colln_t s1,s2;
237  s1=s2;
238  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
239  BOOST_CHECK_EQUAL(s1.size(), s2.size());
240  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
241 }
242 
243 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item, Mdl, test_types) {
244  typedef typename erew_funky_queue_t<Mdl, std::list>::result colln_t;
245 
246  colln_t s1;
247  s1.push_back(1);
248  BOOST_CHECK(!s1.empty());
249  BOOST_CHECK_EQUAL(s1.size(), 1U);
250  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
251  BOOST_CHECK_EQUAL(s1.front(), 1);
252 }
253 
254 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_copy, Mdl, test_types) {
255  typedef typename erew_funky_queue_t<Mdl, std::list>::result colln_t;
256 
257  colln_t s1,s2;
258  s1.push_back(1);
259  s2=s1;
260  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
261  BOOST_CHECK_EQUAL(s1.size(), s2.size());
262  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
263  BOOST_CHECK_EQUAL(s2.front(), 1);
264 }
265 
266 BOOST_AUTO_TEST_CASE_TEMPLATE(clear, Mdl, test_types) {
267  typedef typename erew_funky_queue_t<Mdl, std::list>::result colln_t;
268 
269  colln_t s1;
270  s1.push_back(1);
271  s1.clear();
272  BOOST_CHECK(s1.empty());
273  BOOST_CHECK_EQUAL(s1.size(), 0U);
274  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
275 }
276 
277 BOOST_AUTO_TEST_SUITE_END()
278 
279 BOOST_AUTO_TEST_SUITE(vector_tests)
280 
281 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, Mdl, test_types) {
282  typedef typename erew_colln_t<Mdl, std::vector>::result colln_t;
283 
284  colln_t s1;
285  BOOST_CHECK(s1.empty());
286  BOOST_CHECK_EQUAL(s1.size(), 0U);
287  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
288 }
289 
290 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor, Mdl, test_types) {
291  typedef typename erew_colln_t<Mdl, std::vector>::result colln_t;
292 
293  typename colln_t::container_type src;
294  colln_t s1(src);
295  BOOST_CHECK(s1.empty());
296  BOOST_CHECK_EQUAL(s1.size(), src.size());
297  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
298 }
299 
300 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor_1, Mdl, test_types) {
301  typedef typename erew_colln_t<Mdl, std::vector>::result colln_t;
302 
303  typename colln_t::container_type src;
304  src.push_back(1);
305  colln_t s1(src);
306  BOOST_CHECK(!s1.empty());
307  BOOST_CHECK_EQUAL(s1.size(), src.size());
308  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
309 }
310 
311 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor_2, Mdl, test_types) {
312  typedef typename erew_colln_t<Mdl, std::vector>::result colln_t;
313 
314  typename colln_t::container_type src;
315  src.push_back(1);
316  src.push_back(2);
317  colln_t s1(src);
318  BOOST_CHECK(!s1.empty());
319  BOOST_CHECK_EQUAL(s1.size(), src.size());
320  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
321 }
322 
323 BOOST_AUTO_TEST_CASE_TEMPLATE(assignment, Mdl, test_types) {
324  typedef typename erew_colln_t<Mdl, std::vector>::result colln_t;
325 
326  colln_t s1,s2;
327  s1=s2;
328  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
329  BOOST_CHECK_EQUAL(s1.size(), s2.size());
330  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
331 }
332 
333 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item, Mdl, test_types) {
334  typedef typename erew_colln_t<Mdl, std::vector>::result colln_t;
335 
336  colln_t s1;
337  s1.push_back(1);
338  BOOST_CHECK(!s1.empty());
339  BOOST_CHECK_EQUAL(s1.size(), 1U);
340  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
341  BOOST_CHECK_EQUAL(s1[0], 1);
342 }
343 
344 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_copy, Mdl, test_types) {
345  typedef typename erew_colln_t<Mdl, std::vector>::result colln_t;
346 
347  colln_t s1,s2;
348  s1.push_back(1);
349  s2=s1;
350  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
351  BOOST_CHECK_EQUAL(s1.size(), s2.size());
352  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
353  BOOST_CHECK_EQUAL(s2[0], 1);
354 }
355 
356 BOOST_AUTO_TEST_CASE_TEMPLATE(clear, Mdl, test_types) {
357  typedef typename erew_colln_t<Mdl, std::vector>::result colln_t;
358 
359  colln_t s1;
360  s1.push_back(1);
361  s1.clear();
362  BOOST_CHECK(s1.empty());
363  BOOST_CHECK_EQUAL(s1.size(), 0U);
364  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
365 }
366 
367 BOOST_AUTO_TEST_SUITE_END()
368 
369 BOOST_AUTO_TEST_SUITE(vector_rw_lk_tests)
370 
371 BOOST_AUTO_TEST_CASE_TEMPLATE(default_ctor, Mdl, test_types) {
372  typedef typename crew_colln_t<Mdl, std::vector>::result colln_t;
373 
374  colln_t s1;
375  BOOST_CHECK(s1.empty());
376  BOOST_CHECK_EQUAL(s1.size(), 0U);
377  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
378 }
379 
380 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor, Mdl, test_types) {
381  typedef typename crew_colln_t<Mdl, std::vector>::result colln_t;
382 
383  typename colln_t::container_type src;
384  colln_t s1(src);
385  BOOST_CHECK(s1.empty());
386  BOOST_CHECK_EQUAL(s1.size(), src.size());
387  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
388 }
389 
390 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor_1, Mdl, test_types) {
391  typedef typename crew_colln_t<Mdl, std::vector>::result colln_t;
392 
393  typename colln_t::container_type src;
394  src.push_back(1);
395  colln_t s1(src);
396  BOOST_CHECK(!s1.empty());
397  BOOST_CHECK_EQUAL(s1.size(), src.size());
398  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
399 }
400 
401 BOOST_AUTO_TEST_CASE_TEMPLATE(cctor_2, Mdl, test_types) {
402  typedef typename crew_colln_t<Mdl, std::vector>::result colln_t;
403 
404  typename colln_t::container_type src;
405  src.push_back(1);
406  src.push_back(2);
407  colln_t s1(src);
408  BOOST_CHECK(!s1.empty());
409  BOOST_CHECK_EQUAL(s1.size(), src.size());
410  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
411 }
412 
413 BOOST_AUTO_TEST_CASE_TEMPLATE(assignment, Mdl, test_types) {
414  typedef typename crew_colln_t<Mdl, std::vector>::result colln_t;
415 
416  colln_t s1,s2;
417  s1=s2;
418  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
419  BOOST_CHECK_EQUAL(s1.size(), s2.size());
420  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
421 }
422 
423 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item, Mdl, test_types) {
424  typedef typename crew_colln_t<Mdl, std::vector>::result colln_t;
425 
426  colln_t s1;
427  s1.push_back(1);
428  BOOST_CHECK(!s1.empty());
429  BOOST_CHECK_EQUAL(s1.size(), 1U);
430  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
431  BOOST_CHECK_EQUAL(s1[0], 1);
432 }
433 
434 BOOST_AUTO_TEST_CASE_TEMPLATE(add_item_copy, Mdl, test_types) {
435  typedef typename crew_colln_t<Mdl, std::vector>::result colln_t;
436 
437  colln_t s1,s2;
438  s1.push_back(1);
439  s2=s1;
440  BOOST_CHECK_EQUAL(s1.empty(), s2.empty());
441  BOOST_CHECK_EQUAL(s1.size(), s2.size());
442  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
443  BOOST_CHECK_EQUAL(s2[0], 1);
444 }
445 
446 BOOST_AUTO_TEST_CASE_TEMPLATE(clear, Mdl, test_types) {
447  typedef typename crew_colln_t<Mdl, std::vector>::result colln_t;
448 
449  colln_t s1;
450  s1.push_back(1);
451  s1.clear();
452  BOOST_CHECK(s1.empty());
453  BOOST_CHECK_EQUAL(s1.size(), 0U);
454  BOOST_CHECK_EQUAL(s1.size(), s1.colln().size());
455 }
456 
457 BOOST_AUTO_TEST_SUITE_END()
458 
459 BOOST_AUTO_TEST_SUITE_END()