This source file includes following definitions.
- sqr
- BOOST_AUTO_TEST_SUITE
- BOOST_AUTO_TEST_CASE_TEMPLATE
- BOOST_AUTO_TEST_SUITE_END
- BOOST_AUTO_TEST_CASE_TEMPLATE
- BOOST_AUTO_TEST_SUITE_END
- BOOST_AUTO_TEST_CASE_TEMPLATE
- BOOST_AUTO_TEST_SUITE_END
- BOOST_AUTO_TEST_CASE_TEMPLATE
- BOOST_AUTO_TEST_SUITE_END
- BOOST_AUTO_TEST_CASE_TEMPLATE
- BOOST_AUTO_TEST_SUITE_END
- BOOST_AUTO_TEST_CASE_TEMPLATE
- BOOST_AUTO_TEST_SUITE_END
- BOOST_AUTO_TEST_CASE_TEMPLATE
- BOOST_AUTO_TEST_SUITE_END
- BOOST_AUTO_TEST_CASE_TEMPLATE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include "stdafx.h"
22
23 #define BOOST_TEST_MODULE libjmmcg_tests
24 #include <boost/test/included/unit_test.hpp>
25
26 #include <boost/test/test_case_template.hpp>
27 #include <boost/mpl/list.hpp>
28
29 #include "core/thread_pool_sequential.hpp"
30 #include "core/thread_pool_master.hpp"
31 #include "core/thread_pool_workers.hpp"
32
33 using namespace jmmcg;
34 using namespace jmmcg::ppd;
35
36 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
37 struct erew_normal_fifo_t {
38 typedef api_lock_traits<platform_api, Mdl> lock_traits;
39 typedef safe_colln<
40 std::vector<long>,
41 typename lock_traits::nonrecursive_anon_mutex_type
42 > vtr_colln_t;
43
44 typedef pool_aspects<
45 Jn,
46 platform_api,
47 Mdl,
48 pool_traits::normal_fifo,
49 std::less,
50 GSSk
51 > thread_pool_traits;
52
53 typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
54
55 static const typename pool_type::pool_type::size_type pool_size=PoolSize;
56 };
57
58 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
59 const typename erew_normal_fifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_type::pool_type::size_type erew_normal_fifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_size;
60
61 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
62 struct erew_normal_lifo_t {
63 typedef api_lock_traits<platform_api, Mdl> lock_traits;
64 typedef safe_colln<
65 std::vector<long>,
66 typename lock_traits::nonrecursive_anon_mutex_type
67 > vtr_colln_t;
68
69 typedef pool_aspects<
70 Jn,
71 platform_api,
72 Mdl,
73 pool_traits::normal_lifo,
74 std::less,
75 GSSk
76 > thread_pool_traits;
77
78 typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
79
80 static const typename pool_type::pool_type::size_type pool_size=PoolSize;
81 };
82
83 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
84 const typename erew_normal_lifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_type::pool_type::size_type erew_normal_lifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_size;
85
86 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
87 struct erew_priority_queue_t {
88 typedef api_lock_traits<platform_api, Mdl> lock_traits;
89 typedef safe_colln<
90 std::vector<long>,
91 typename lock_traits::nonrecursive_anon_mutex_type
92 > vtr_colln_t;
93
94 typedef pool_aspects<
95 Jn,
96 platform_api,
97 Mdl,
98 pool_traits::prioritised_queue,
99 std::less,
100 GSSk
101 > thread_pool_traits;
102
103 typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
104
105 static const typename pool_type::pool_type::size_type pool_size=PoolSize;
106 };
107
108 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
109 const typename erew_priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_type::pool_type::size_type erew_priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_size;
110
111 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
112 struct crew_normal_fifo_t {
113 typedef api_lock_traits<platform_api, Mdl> lock_traits;
114 typedef safe_colln<
115 std::vector<long>,
116 typename lock::rw::locker<lock_traits>,
117 typename lock::rw::locker<lock_traits>::decaying_write_lock_type
118 > vtr_colln_t;
119
120 typedef pool_aspects<
121 Jn,
122 platform_api,
123 Mdl,
124 pool_traits::normal_fifo,
125 std::less,
126 GSSk
127 > thread_pool_traits;
128
129 typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
130
131 static const typename pool_type::pool_type::size_type pool_size=PoolSize;
132 };
133
134 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
135 const typename crew_normal_fifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_type::pool_type::size_type crew_normal_fifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_size;
136
137 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
138 struct crew_normal_lifo_t {
139 typedef api_lock_traits<platform_api, Mdl> lock_traits;
140 typedef safe_colln<
141 std::vector<long>,
142 typename lock::rw::locker<lock_traits>,
143 typename lock::rw::locker<lock_traits>::decaying_write_lock_type
144 > vtr_colln_t;
145
146 typedef pool_aspects<
147 Jn,
148 platform_api,
149 Mdl,
150 pool_traits::normal_lifo,
151 std::less,
152 GSSk
153 > thread_pool_traits;
154
155 typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
156
157 static const typename pool_type::pool_type::size_type pool_size=PoolSize;
158 };
159
160 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
161 const typename crew_normal_lifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_type::pool_type::size_type crew_normal_lifo_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_size;
162
163 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize=0, unsigned int GSSk=1>
164 struct crew_priority_queue_t {
165 typedef api_lock_traits<platform_api, Mdl> lock_traits;
166 typedef safe_colln<
167 std::vector<long>,
168 typename lock::rw::locker<lock_traits>,
169 typename lock::rw::locker<lock_traits>::decaying_write_lock_type
170 > vtr_colln_t;
171
172 typedef pool_aspects<
173 Jn,
174 platform_api,
175 Mdl,
176 pool_traits::prioritised_queue,
177 std::less,
178 GSSk
179 > thread_pool_traits;
180
181 typedef thread_pool<Db, Sz, thread_pool_traits> pool_type;
182
183 static const typename pool_type::pool_type::size_type pool_size=PoolSize;
184 };
185
186 template<class Db, pool_traits::size_mode_t Sz, generic_traits::return_data Jn, class Mdl, unsigned int PoolSize, unsigned int GSSk>
187 const typename crew_priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_type::pool_type::size_type crew_priority_queue_t<Db, Sz, Jn, Mdl, PoolSize, GSSk>::pool_size;
188
189 typedef boost::mpl::list<
190 erew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
191 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
192 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
193 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
194 erew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
195 crew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
196
197 erew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
198
199 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
200
201 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
202
203 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
204
205 erew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
206
207 crew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 1>,
208
209
210 erew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
211 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
212 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
213 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
214 erew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>,
215 crew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::fixed_size, generic_traits::return_data::joinable, heavyweight_threading, 2>
216 > finite_test_types;
217
218 typedef boost::mpl::list<
219 erew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
220 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
221 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
222 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
223 erew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
224 crew_priority_queue_t<pool_traits::work_distribution_mode_t::worker_threads_get_work<pool_traits::work_distribution_mode_t::queue_model_t::pool_owns_queue>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
225 erew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
226 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
227 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
228 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
229 erew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
230 crew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::sequential, generic_traits::return_data::joinable, sequential_mode>,
231
232
233
234
235
236
237
238 erew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
239 erew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading, 0, 2>,
240 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
241 crew_normal_fifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading, 0, 2>,
242 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
243 erew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading, 0, 2>,
244 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
245 crew_normal_lifo_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading, 0, 2>,
246 erew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
247 erew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading, 0, 2>,
248 crew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading>,
249 crew_priority_queue_t<pool_traits::work_distribution_mode_t::one_thread_distributes<>, pool_traits::size_mode_t::infinite, generic_traits::return_data::joinable, heavyweight_threading, 0, 2>
250 > infinite_test_types;
251
252
253
254 template<typename T>
255 struct square : std::unary_function<T, void> {
256 static T last;
257
258 void operator()(T t) {
259 last+=t;
260 };
261 };
262
263 template<typename T>
264 T square<T>::last;
265
266 inline int sqr() {
267 static int last=0;
268 return last++<<1;
269 }
270
271 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
272
273 BOOST_AUTO_TEST_SUITE(joinable_dataflow)
274
275 BOOST_AUTO_TEST_SUITE(finite)
276
277 BOOST_AUTO_TEST_SUITE(empty_colln)
278
279 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, finite_test_types) {
280 typedef typename T::vtr_colln_t vtr_colln_t;
281 typedef typename T::pool_type pool_type;
282 typedef typename pool_type::joinable joinable;
283
284 pool_type pool(T::pool_size);
285 vtr_colln_t v;
286 auto const &context=pool<<joinable()<<pool.accumulate(v, typename vtr_colln_t::value_type());
287 BOOST_CHECK_EQUAL(*context, 0);
288 BOOST_CHECK_EQUAL(v.empty(), true);
289 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
290 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
291 }
292
293 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate_op, T, finite_test_types) {
294 typedef typename T::vtr_colln_t vtr_colln_t;
295 typedef typename T::pool_type pool_type;
296 typedef typename pool_type::joinable joinable;
297
298 pool_type pool(T::pool_size);
299 vtr_colln_t v;
300 auto const &context=pool<<joinable()<<pool.accumulate(v, 1, std::multiplies<typename vtr_colln_t::value_type>());
301 pool.min_time(vtr_colln_t::memory_access_mode);
302 pool.min_processors(vtr_colln_t::memory_access_mode);
303 BOOST_CHECK_EQUAL(*context, 1);
304 BOOST_CHECK_EQUAL(v.empty(), true);
305 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
306 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
307 }
308
309 BOOST_AUTO_TEST_SUITE_END()
310
311 BOOST_AUTO_TEST_SUITE(nonempty_colln)
312
313 BOOST_AUTO_TEST_SUITE(one_element)
314
315 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, finite_test_types) {
316 typedef typename T::vtr_colln_t vtr_colln_t;
317 typedef typename T::pool_type pool_type;
318 typedef typename pool_type::joinable joinable;
319
320 pool_type pool(T::pool_size);
321 vtr_colln_t v;
322 v.push_back(1);
323 auto const &context=pool<<joinable()<<pool.accumulate(v, typename vtr_colln_t::value_type());
324 pool.min_time(vtr_colln_t::memory_access_mode);
325 pool.min_processors(vtr_colln_t::memory_access_mode);
326 BOOST_CHECK_EQUAL(*context, 1);
327 BOOST_CHECK_EQUAL(v.size(), 1U);
328 }
329
330 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate_op, T, finite_test_types) {
331 typedef typename T::vtr_colln_t vtr_colln_t;
332 typedef typename T::pool_type pool_type;
333 typedef typename pool_type::joinable joinable;
334
335 pool_type pool(T::pool_size);
336 vtr_colln_t v;
337 v.push_back(1);
338 auto const &context=pool<<joinable()<<pool.accumulate(v, 1, std::multiplies<typename vtr_colln_t::value_type>());
339 pool.min_time(vtr_colln_t::memory_access_mode);
340 pool.min_processors(vtr_colln_t::memory_access_mode);
341 BOOST_CHECK_EQUAL(*context, 1);
342 BOOST_CHECK_EQUAL(v.size(), 1U);
343 }
344
345 BOOST_AUTO_TEST_SUITE_END()
346
347 BOOST_AUTO_TEST_SUITE(two_elements)
348
349 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, finite_test_types) {
350 typedef typename T::vtr_colln_t vtr_colln_t;
351 typedef typename T::pool_type pool_type;
352 typedef typename pool_type::joinable joinable;
353
354 pool_type pool(T::pool_size);
355 vtr_colln_t v;
356 v.push_back(1);
357 v.push_back(2);
358 auto const &context=pool<<joinable()<<pool.accumulate(v, typename vtr_colln_t::value_type());
359 pool.min_time(vtr_colln_t::memory_access_mode);
360 pool.min_processors(vtr_colln_t::memory_access_mode);
361 BOOST_CHECK_EQUAL(*context, 3);
362 BOOST_CHECK_EQUAL(v.size(), 2U);
363 }
364
365 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate_op, T, finite_test_types) {
366 typedef typename T::vtr_colln_t vtr_colln_t;
367 typedef typename T::pool_type pool_type;
368 typedef typename pool_type::joinable joinable;
369
370 pool_type pool(T::pool_size);
371 vtr_colln_t v;
372 v.push_back(1);
373 v.push_back(2);
374 auto const &context=pool<<joinable()<<pool.accumulate(v, 1, std::multiplies<typename vtr_colln_t::value_type>());
375 pool.min_time(vtr_colln_t::memory_access_mode);
376 pool.min_processors(vtr_colln_t::memory_access_mode);
377 BOOST_CHECK_EQUAL(*context, 2);
378 BOOST_CHECK_EQUAL(v.size(), 2U);
379 }
380
381 BOOST_AUTO_TEST_SUITE_END()
382
383 BOOST_AUTO_TEST_SUITE(n_elements)
384
385 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, finite_test_types) {
386 typedef typename T::vtr_colln_t vtr_colln_t;
387 typedef typename T::pool_type pool_type;
388 typedef typename pool_type::joinable joinable;
389
390 pool_type pool(T::pool_size);
391 vtr_colln_t v;
392 v.push_back(1);
393 v.push_back(2);
394 v.push_back(3);
395 v.push_back(4);
396 v.push_back(5);
397 v.push_back(6);
398 v.push_back(7);
399 v.push_back(8);
400 auto const &context=pool<<joinable()<<pool.accumulate(v, typename vtr_colln_t::value_type());
401 pool.min_time(vtr_colln_t::memory_access_mode);
402 pool.min_processors(vtr_colln_t::memory_access_mode);
403 BOOST_CHECK_EQUAL(*context, 36);
404 BOOST_CHECK_EQUAL(v.size(), 8U);
405 }
406
407 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate_op, T, finite_test_types) {
408 typedef typename T::vtr_colln_t vtr_colln_t;
409 typedef typename T::pool_type pool_type;
410 typedef typename pool_type::joinable joinable;
411
412 pool_type pool(T::pool_size);
413 vtr_colln_t v;
414 v.push_back(1);
415 v.push_back(2);
416 v.push_back(3);
417 v.push_back(4);
418 v.push_back(5);
419 v.push_back(6);
420 v.push_back(7);
421 v.push_back(8);
422 auto const &context=pool<<joinable()<<pool.accumulate(v, 1, std::multiplies<typename vtr_colln_t::value_type>());
423 pool.min_time(vtr_colln_t::memory_access_mode);
424 pool.min_processors(vtr_colln_t::memory_access_mode);
425 BOOST_CHECK_EQUAL(*context, 40320);
426 BOOST_CHECK_EQUAL(v.size(), 8U);
427 }
428
429 BOOST_AUTO_TEST_SUITE_END()
430
431 BOOST_AUTO_TEST_SUITE_END()
432
433 BOOST_AUTO_TEST_SUITE_END()
434
435 BOOST_AUTO_TEST_SUITE(infinite)
436
437 BOOST_AUTO_TEST_SUITE(empty_colln)
438
439 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, infinite_test_types) {
440 typedef typename T::vtr_colln_t vtr_colln_t;
441 typedef typename T::pool_type pool_type;
442 typedef typename pool_type::joinable joinable;
443
444 pool_type pool;
445 vtr_colln_t v;
446 auto const &context=pool<<joinable()<<pool.accumulate(v, typename vtr_colln_t::value_type());
447 pool.min_time(vtr_colln_t::memory_access_mode);
448 pool.min_processors(vtr_colln_t::memory_access_mode);
449 BOOST_CHECK_EQUAL(*context, 0);
450 BOOST_CHECK_EQUAL(v.empty(), true);
451 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
452 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
453 }
454
455 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate_op, T, infinite_test_types) {
456 typedef typename T::vtr_colln_t vtr_colln_t;
457 typedef typename T::pool_type pool_type;
458 typedef typename pool_type::joinable joinable;
459
460 pool_type pool;
461 vtr_colln_t v;
462 auto const &context=pool<<joinable()<<pool.accumulate(v, 1, std::multiplies<typename vtr_colln_t::value_type>());
463 pool.min_time(vtr_colln_t::memory_access_mode);
464 pool.min_processors(vtr_colln_t::memory_access_mode);
465 BOOST_CHECK_EQUAL(*context, 1);
466 BOOST_CHECK_EQUAL(v.empty(), true);
467 BOOST_CHECK_EQUAL(pool.min_time(context), 0U);
468 BOOST_CHECK_EQUAL(pool.min_processors(context), 0U);
469 }
470
471 BOOST_AUTO_TEST_SUITE_END()
472
473 BOOST_AUTO_TEST_SUITE_END()
474
475 BOOST_AUTO_TEST_SUITE(nonempty_colln)
476
477 BOOST_AUTO_TEST_SUITE(one_element)
478
479 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, infinite_test_types) {
480 typedef typename T::vtr_colln_t vtr_colln_t;
481 typedef typename T::pool_type pool_type;
482 typedef typename pool_type::joinable joinable;
483
484 pool_type pool;
485 vtr_colln_t v;
486 v.push_back(1);
487 auto const &context=pool<<joinable()<<pool.accumulate(v, typename vtr_colln_t::value_type());
488 pool.min_time(vtr_colln_t::memory_access_mode);
489 pool.min_processors(vtr_colln_t::memory_access_mode);
490 BOOST_CHECK_EQUAL(*context, 1);
491 BOOST_CHECK_EQUAL(v.size(), 1U);
492 }
493
494 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate_op, T, infinite_test_types) {
495 typedef typename T::vtr_colln_t vtr_colln_t;
496 typedef typename T::pool_type pool_type;
497 typedef typename pool_type::joinable joinable;
498
499 pool_type pool;
500 vtr_colln_t v;
501 v.push_back(1);
502 auto const &context=pool<<joinable()<<pool.accumulate(v, 1, std::multiplies<typename vtr_colln_t::value_type>());
503 pool.min_time(vtr_colln_t::memory_access_mode);
504 pool.min_processors(vtr_colln_t::memory_access_mode);
505 BOOST_CHECK_EQUAL(*context, 1);
506 BOOST_CHECK_EQUAL(v.size(), 1U);
507 }
508
509 BOOST_AUTO_TEST_SUITE_END()
510
511 BOOST_AUTO_TEST_SUITE(two_elements)
512
513 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, infinite_test_types) {
514 typedef typename T::vtr_colln_t vtr_colln_t;
515 typedef typename T::pool_type pool_type;
516 typedef typename pool_type::joinable joinable;
517
518 pool_type pool;
519 vtr_colln_t v;
520 v.push_back(1);
521 v.push_back(2);
522 auto const &context=pool<<joinable()<<pool.accumulate(v, typename vtr_colln_t::value_type());
523 pool.min_time(vtr_colln_t::memory_access_mode);
524 pool.min_processors(vtr_colln_t::memory_access_mode);
525 BOOST_CHECK_EQUAL(*context, 3);
526 BOOST_CHECK_EQUAL(v.size(), 2U);
527 }
528
529 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate_op, T, infinite_test_types) {
530 typedef typename T::vtr_colln_t vtr_colln_t;
531 typedef typename T::pool_type pool_type;
532 typedef typename pool_type::joinable joinable;
533
534 pool_type pool;
535 vtr_colln_t v;
536 v.push_back(1);
537 v.push_back(2);
538 auto const &context=pool<<joinable()<<pool.accumulate(v, 1, std::multiplies<typename vtr_colln_t::value_type>());
539 pool.min_time(vtr_colln_t::memory_access_mode);
540 pool.min_processors(vtr_colln_t::memory_access_mode);
541 BOOST_CHECK_EQUAL(*context, 2);
542 BOOST_CHECK_EQUAL(v.size(), 2U);
543 }
544
545 BOOST_AUTO_TEST_SUITE_END()
546
547 BOOST_AUTO_TEST_SUITE(n_elements)
548
549 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate, T, infinite_test_types) {
550 typedef typename T::vtr_colln_t vtr_colln_t;
551 typedef typename T::pool_type pool_type;
552 typedef typename pool_type::joinable joinable;
553
554 pool_type pool;
555 vtr_colln_t v;
556 v.push_back(1);
557 v.push_back(2);
558 v.push_back(3);
559 v.push_back(4);
560 v.push_back(5);
561 v.push_back(6);
562 v.push_back(7);
563 v.push_back(8);
564 auto const &context=pool<<joinable()<<pool.accumulate(v, typename vtr_colln_t::value_type());
565 pool.min_time(vtr_colln_t::memory_access_mode);
566 pool.min_processors(vtr_colln_t::memory_access_mode);
567 BOOST_CHECK_EQUAL(*context, 36);
568 BOOST_CHECK_EQUAL(v.size(), 8U);
569 }
570
571 BOOST_AUTO_TEST_CASE_TEMPLATE(accumulate_op, T, infinite_test_types) {
572 typedef typename T::vtr_colln_t vtr_colln_t;
573 typedef typename T::pool_type pool_type;
574 typedef typename pool_type::joinable joinable;
575
576 pool_type pool;
577 vtr_colln_t v;
578 v.push_back(1);
579 v.push_back(2);
580 v.push_back(3);
581 v.push_back(4);
582 v.push_back(5);
583 v.push_back(6);
584 v.push_back(7);
585 v.push_back(8);
586 auto const &context=pool<<joinable()<<pool.accumulate(v, 1L, std::multiplies<typename vtr_colln_t::value_type>());
587 pool.min_time(vtr_colln_t::memory_access_mode);
588 pool.min_processors(vtr_colln_t::memory_access_mode);
589 BOOST_CHECK_EQUAL(*context, 40320);
590 BOOST_CHECK_EQUAL(v.size(), 8U);
591 }
592
593 BOOST_AUTO_TEST_SUITE_END()
594
595 BOOST_AUTO_TEST_SUITE_END()
596
597 BOOST_AUTO_TEST_SUITE_END()
598
599 BOOST_AUTO_TEST_SUITE_END()