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