xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/parallel/for_each_selectors.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
4*e4b17023SJohn Marino //
5*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
6*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the terms
7*e4b17023SJohn Marino // of the GNU General Public License as published by the Free Software
8*e4b17023SJohn Marino // Foundation; either version 3, or (at your option) any later
9*e4b17023SJohn Marino // version.
10*e4b17023SJohn Marino 
11*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, but
12*e4b17023SJohn Marino // WITHOUT ANY WARRANTY; without even the implied warranty of
13*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*e4b17023SJohn Marino // General Public License for more details.
15*e4b17023SJohn Marino 
16*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
17*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
18*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
19*e4b17023SJohn Marino 
20*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
21*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
22*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
24*e4b17023SJohn Marino 
25*e4b17023SJohn Marino /** @file parallel/for_each_selectors.h
26*e4b17023SJohn Marino  *  @brief Functors representing different tasks to be plugged into the
27*e4b17023SJohn Marino  *  generic parallelization methods for embarrassingly parallel functions.
28*e4b17023SJohn Marino  *  This file is a GNU parallel extension to the Standard C++ Library.
29*e4b17023SJohn Marino  */
30*e4b17023SJohn Marino 
31*e4b17023SJohn Marino // Written by Felix Putze.
32*e4b17023SJohn Marino 
33*e4b17023SJohn Marino #ifndef _GLIBCXX_PARALLEL_FOR_EACH_SELECTORS_H
34*e4b17023SJohn Marino #define _GLIBCXX_PARALLEL_FOR_EACH_SELECTORS_H 1
35*e4b17023SJohn Marino 
36*e4b17023SJohn Marino #include <parallel/basic_iterator.h>
37*e4b17023SJohn Marino 
38*e4b17023SJohn Marino namespace __gnu_parallel
39*e4b17023SJohn Marino {
40*e4b17023SJohn Marino   /** @brief Generic __selector for embarrassingly parallel functions. */
41*e4b17023SJohn Marino   template<typename _It>
42*e4b17023SJohn Marino     struct __generic_for_each_selector
43*e4b17023SJohn Marino     {
44*e4b17023SJohn Marino       /** @brief _Iterator on last element processed; needed for some
45*e4b17023SJohn Marino        *  algorithms (e. g. std::transform()).
46*e4b17023SJohn Marino        */
47*e4b17023SJohn Marino       _It _M_finish_iterator;
48*e4b17023SJohn Marino     };
49*e4b17023SJohn Marino 
50*e4b17023SJohn Marino   /** @brief std::for_each() selector. */
51*e4b17023SJohn Marino   template<typename _It>
52*e4b17023SJohn Marino     struct __for_each_selector : public __generic_for_each_selector<_It>
53*e4b17023SJohn Marino     {
54*e4b17023SJohn Marino       /** @brief Functor execution.
55*e4b17023SJohn Marino        *  @param __o Operator.
56*e4b17023SJohn Marino        *  @param __i iterator referencing object. */
57*e4b17023SJohn Marino       template<typename _Op>
58*e4b17023SJohn Marino         bool
operator__for_each_selector59*e4b17023SJohn Marino         operator()(_Op& __o, _It __i)
60*e4b17023SJohn Marino         {
61*e4b17023SJohn Marino           __o(*__i);
62*e4b17023SJohn Marino           return true;
63*e4b17023SJohn Marino         }
64*e4b17023SJohn Marino     };
65*e4b17023SJohn Marino 
66*e4b17023SJohn Marino   /** @brief std::generate() selector. */
67*e4b17023SJohn Marino   template<typename _It>
68*e4b17023SJohn Marino     struct __generate_selector : public __generic_for_each_selector<_It>
69*e4b17023SJohn Marino     {
70*e4b17023SJohn Marino       /** @brief Functor execution.
71*e4b17023SJohn Marino        *  @param __o Operator.
72*e4b17023SJohn Marino        *  @param __i iterator referencing object. */
73*e4b17023SJohn Marino       template<typename _Op>
74*e4b17023SJohn Marino         bool
operator__generate_selector75*e4b17023SJohn Marino         operator()(_Op& __o, _It __i)
76*e4b17023SJohn Marino         {
77*e4b17023SJohn Marino           *__i = __o();
78*e4b17023SJohn Marino           return true;
79*e4b17023SJohn Marino         }
80*e4b17023SJohn Marino     };
81*e4b17023SJohn Marino 
82*e4b17023SJohn Marino   /** @brief std::fill() selector. */
83*e4b17023SJohn Marino   template<typename _It>
84*e4b17023SJohn Marino     struct __fill_selector : public __generic_for_each_selector<_It>
85*e4b17023SJohn Marino     {
86*e4b17023SJohn Marino       /** @brief Functor execution.
87*e4b17023SJohn Marino        *  @param __v Current value.
88*e4b17023SJohn Marino        *  @param __i iterator referencing object. */
89*e4b17023SJohn Marino       template<typename _ValueType>
90*e4b17023SJohn Marino         bool
operator__fill_selector91*e4b17023SJohn Marino         operator()(_ValueType& __v, _It __i)
92*e4b17023SJohn Marino         {
93*e4b17023SJohn Marino           *__i = __v;
94*e4b17023SJohn Marino           return true;
95*e4b17023SJohn Marino         }
96*e4b17023SJohn Marino     };
97*e4b17023SJohn Marino 
98*e4b17023SJohn Marino   /** @brief std::transform() __selector, one input sequence variant. */
99*e4b17023SJohn Marino   template<typename _It>
100*e4b17023SJohn Marino     struct __transform1_selector : public __generic_for_each_selector<_It>
101*e4b17023SJohn Marino     {
102*e4b17023SJohn Marino       /** @brief Functor execution.
103*e4b17023SJohn Marino        *  @param __o Operator.
104*e4b17023SJohn Marino        *  @param __i iterator referencing object. */
105*e4b17023SJohn Marino       template<typename _Op>
106*e4b17023SJohn Marino         bool
operator__transform1_selector107*e4b17023SJohn Marino         operator()(_Op& __o, _It __i)
108*e4b17023SJohn Marino         {
109*e4b17023SJohn Marino           *__i.second = __o(*__i.first);
110*e4b17023SJohn Marino           return true;
111*e4b17023SJohn Marino         }
112*e4b17023SJohn Marino     };
113*e4b17023SJohn Marino 
114*e4b17023SJohn Marino   /** @brief std::transform() __selector, two input sequences variant. */
115*e4b17023SJohn Marino   template<typename _It>
116*e4b17023SJohn Marino     struct __transform2_selector : public __generic_for_each_selector<_It>
117*e4b17023SJohn Marino     {
118*e4b17023SJohn Marino       /** @brief Functor execution.
119*e4b17023SJohn Marino        *  @param __o Operator.
120*e4b17023SJohn Marino        *  @param __i iterator referencing object. */
121*e4b17023SJohn Marino       template<typename _Op>
122*e4b17023SJohn Marino         bool
operator__transform2_selector123*e4b17023SJohn Marino         operator()(_Op& __o, _It __i)
124*e4b17023SJohn Marino         {
125*e4b17023SJohn Marino           *__i._M_third = __o(*__i._M_first, *__i._M_second);
126*e4b17023SJohn Marino           return true;
127*e4b17023SJohn Marino         }
128*e4b17023SJohn Marino     };
129*e4b17023SJohn Marino 
130*e4b17023SJohn Marino   /** @brief std::replace() selector. */
131*e4b17023SJohn Marino   template<typename _It, typename _Tp>
132*e4b17023SJohn Marino     struct __replace_selector : public __generic_for_each_selector<_It>
133*e4b17023SJohn Marino     {
134*e4b17023SJohn Marino       /** @brief Value to replace with. */
135*e4b17023SJohn Marino       const _Tp& __new_val;
136*e4b17023SJohn Marino 
137*e4b17023SJohn Marino       /** @brief Constructor
138*e4b17023SJohn Marino        *  @param __new_val Value to replace with. */
139*e4b17023SJohn Marino       explicit
__replace_selector__replace_selector140*e4b17023SJohn Marino       __replace_selector(const _Tp &__new_val) : __new_val(__new_val) {}
141*e4b17023SJohn Marino 
142*e4b17023SJohn Marino       /** @brief Functor execution.
143*e4b17023SJohn Marino        *  @param __v Current value.
144*e4b17023SJohn Marino        *  @param __i iterator referencing object. */
145*e4b17023SJohn Marino       bool
operator__replace_selector146*e4b17023SJohn Marino       operator()(_Tp& __v, _It __i)
147*e4b17023SJohn Marino       {
148*e4b17023SJohn Marino         if (*__i == __v)
149*e4b17023SJohn Marino           *__i = __new_val;
150*e4b17023SJohn Marino         return true;
151*e4b17023SJohn Marino       }
152*e4b17023SJohn Marino     };
153*e4b17023SJohn Marino 
154*e4b17023SJohn Marino   /** @brief std::replace() selector. */
155*e4b17023SJohn Marino   template<typename _It, typename _Op, typename _Tp>
156*e4b17023SJohn Marino     struct __replace_if_selector : public __generic_for_each_selector<_It>
157*e4b17023SJohn Marino     {
158*e4b17023SJohn Marino       /** @brief Value to replace with. */
159*e4b17023SJohn Marino       const _Tp& __new_val;
160*e4b17023SJohn Marino 
161*e4b17023SJohn Marino       /** @brief Constructor.
162*e4b17023SJohn Marino        *  @param __new_val Value to replace with. */
163*e4b17023SJohn Marino       explicit
__replace_if_selector__replace_if_selector164*e4b17023SJohn Marino       __replace_if_selector(const _Tp &__new_val) : __new_val(__new_val) { }
165*e4b17023SJohn Marino 
166*e4b17023SJohn Marino       /** @brief Functor execution.
167*e4b17023SJohn Marino        *  @param __o Operator.
168*e4b17023SJohn Marino        *  @param __i iterator referencing object. */
169*e4b17023SJohn Marino       bool
operator__replace_if_selector170*e4b17023SJohn Marino       operator()(_Op& __o, _It __i)
171*e4b17023SJohn Marino       {
172*e4b17023SJohn Marino         if (__o(*__i))
173*e4b17023SJohn Marino           *__i = __new_val;
174*e4b17023SJohn Marino         return true;
175*e4b17023SJohn Marino       }
176*e4b17023SJohn Marino     };
177*e4b17023SJohn Marino 
178*e4b17023SJohn Marino   /** @brief std::count() selector. */
179*e4b17023SJohn Marino   template<typename _It, typename _Diff>
180*e4b17023SJohn Marino     struct __count_selector : public __generic_for_each_selector<_It>
181*e4b17023SJohn Marino     {
182*e4b17023SJohn Marino       /** @brief Functor execution.
183*e4b17023SJohn Marino        *  @param __v Current value.
184*e4b17023SJohn Marino        *  @param __i iterator referencing object.
185*e4b17023SJohn Marino        *  @return 1 if count, 0 if does not count. */
186*e4b17023SJohn Marino       template<typename _ValueType>
187*e4b17023SJohn Marino         _Diff
operator__count_selector188*e4b17023SJohn Marino         operator()(_ValueType& __v, _It __i)
189*e4b17023SJohn Marino         { return (__v == *__i) ? 1 : 0; }
190*e4b17023SJohn Marino     };
191*e4b17023SJohn Marino 
192*e4b17023SJohn Marino   /** @brief std::count_if () selector. */
193*e4b17023SJohn Marino   template<typename _It, typename _Diff>
194*e4b17023SJohn Marino     struct __count_if_selector : public __generic_for_each_selector<_It>
195*e4b17023SJohn Marino     {
196*e4b17023SJohn Marino       /** @brief Functor execution.
197*e4b17023SJohn Marino        *  @param __o Operator.
198*e4b17023SJohn Marino        *  @param __i iterator referencing object.
199*e4b17023SJohn Marino        *  @return 1 if count, 0 if does not count. */
200*e4b17023SJohn Marino       template<typename _Op>
201*e4b17023SJohn Marino         _Diff
operator__count_if_selector202*e4b17023SJohn Marino         operator()(_Op& __o, _It __i)
203*e4b17023SJohn Marino         { return (__o(*__i)) ? 1 : 0; }
204*e4b17023SJohn Marino     };
205*e4b17023SJohn Marino 
206*e4b17023SJohn Marino   /** @brief std::accumulate() selector. */
207*e4b17023SJohn Marino   template<typename _It>
208*e4b17023SJohn Marino     struct __accumulate_selector : public __generic_for_each_selector<_It>
209*e4b17023SJohn Marino     {
210*e4b17023SJohn Marino       /** @brief Functor execution.
211*e4b17023SJohn Marino        *  @param __o Operator (unused).
212*e4b17023SJohn Marino        *  @param __i iterator referencing object.
213*e4b17023SJohn Marino        *  @return The current value. */
214*e4b17023SJohn Marino       template<typename _Op>
215*e4b17023SJohn Marino         typename std::iterator_traits<_It>::value_type
operator__accumulate_selector216*e4b17023SJohn Marino         operator()(_Op __o, _It __i)
217*e4b17023SJohn Marino         { return *__i; }
218*e4b17023SJohn Marino     };
219*e4b17023SJohn Marino 
220*e4b17023SJohn Marino   /** @brief std::inner_product() selector. */
221*e4b17023SJohn Marino   template<typename _It, typename _It2, typename _Tp>
222*e4b17023SJohn Marino     struct __inner_product_selector : public __generic_for_each_selector<_It>
223*e4b17023SJohn Marino     {
224*e4b17023SJohn Marino       /** @brief Begin iterator of first sequence. */
225*e4b17023SJohn Marino       _It  __begin1_iterator;
226*e4b17023SJohn Marino 
227*e4b17023SJohn Marino       /** @brief Begin iterator of second sequence. */
228*e4b17023SJohn Marino       _It2 __begin2_iterator;
229*e4b17023SJohn Marino 
230*e4b17023SJohn Marino       /** @brief Constructor.
231*e4b17023SJohn Marino        *  @param __b1 Begin iterator of first sequence.
232*e4b17023SJohn Marino        *  @param __b2 Begin iterator of second sequence. */
233*e4b17023SJohn Marino       explicit
__inner_product_selector__inner_product_selector234*e4b17023SJohn Marino       __inner_product_selector(_It __b1, _It2 __b2)
235*e4b17023SJohn Marino       : __begin1_iterator(__b1), __begin2_iterator(__b2) { }
236*e4b17023SJohn Marino 
237*e4b17023SJohn Marino       /** @brief Functor execution.
238*e4b17023SJohn Marino        *  @param __mult Multiplication functor.
239*e4b17023SJohn Marino        *  @param __current iterator referencing object.
240*e4b17023SJohn Marino        *  @return Inner product elemental __result. */
241*e4b17023SJohn Marino       template<typename _Op>
242*e4b17023SJohn Marino         _Tp
operator__inner_product_selector243*e4b17023SJohn Marino         operator()(_Op __mult, _It __current)
244*e4b17023SJohn Marino         {
245*e4b17023SJohn Marino           typename std::iterator_traits<_It>::difference_type __position
246*e4b17023SJohn Marino             = __current - __begin1_iterator;
247*e4b17023SJohn Marino           return __mult(*__current, *(__begin2_iterator + __position));
248*e4b17023SJohn Marino         }
249*e4b17023SJohn Marino     };
250*e4b17023SJohn Marino 
251*e4b17023SJohn Marino   /** @brief Selector that just returns the passed iterator. */
252*e4b17023SJohn Marino   template<typename _It>
253*e4b17023SJohn Marino     struct __identity_selector : public __generic_for_each_selector<_It>
254*e4b17023SJohn Marino     {
255*e4b17023SJohn Marino       /** @brief Functor execution.
256*e4b17023SJohn Marino        *  @param __o Operator (unused).
257*e4b17023SJohn Marino        *  @param __i iterator referencing object.
258*e4b17023SJohn Marino        *  @return Passed iterator. */
259*e4b17023SJohn Marino       template<typename _Op>
260*e4b17023SJohn Marino         _It
operator__identity_selector261*e4b17023SJohn Marino         operator()(_Op __o, _It __i)
262*e4b17023SJohn Marino         { return __i; }
263*e4b17023SJohn Marino     };
264*e4b17023SJohn Marino 
265*e4b17023SJohn Marino   /** @brief Selector that returns the difference between two adjacent
266*e4b17023SJohn Marino    *  __elements.
267*e4b17023SJohn Marino    */
268*e4b17023SJohn Marino   template<typename _It>
269*e4b17023SJohn Marino     struct __adjacent_difference_selector
270*e4b17023SJohn Marino     : public __generic_for_each_selector<_It>
271*e4b17023SJohn Marino     {
272*e4b17023SJohn Marino       template<typename _Op>
273*e4b17023SJohn Marino         bool
operator__adjacent_difference_selector274*e4b17023SJohn Marino         operator()(_Op& __o, _It __i)
275*e4b17023SJohn Marino         {
276*e4b17023SJohn Marino           typename _It::first_type __go_back_one = __i.first;
277*e4b17023SJohn Marino           --__go_back_one;
278*e4b17023SJohn Marino           *__i.second = __o(*__i.first, *__go_back_one);
279*e4b17023SJohn Marino           return true;
280*e4b17023SJohn Marino         }
281*e4b17023SJohn Marino     };
282*e4b17023SJohn Marino 
283*e4b17023SJohn Marino   /** @brief Functor doing nothing
284*e4b17023SJohn Marino    *
285*e4b17023SJohn Marino    *  For some __reduction tasks (this is not a function object, but is
286*e4b17023SJohn Marino    *  passed as __selector __dummy parameter.
287*e4b17023SJohn Marino    */
288*e4b17023SJohn Marino   struct _Nothing
289*e4b17023SJohn Marino   {
290*e4b17023SJohn Marino     /** @brief Functor execution.
291*e4b17023SJohn Marino      *  @param __i iterator referencing object. */
292*e4b17023SJohn Marino     template<typename _It>
293*e4b17023SJohn Marino       void
operator_Nothing294*e4b17023SJohn Marino       operator()(_It __i) { }
295*e4b17023SJohn Marino   };
296*e4b17023SJohn Marino 
297*e4b17023SJohn Marino   /** @brief Reduction function doing nothing. */
298*e4b17023SJohn Marino   struct _DummyReduct
299*e4b17023SJohn Marino   {
300*e4b17023SJohn Marino     bool
operator_DummyReduct301*e4b17023SJohn Marino     operator()(bool, bool) const
302*e4b17023SJohn Marino     { return true; }
303*e4b17023SJohn Marino   };
304*e4b17023SJohn Marino 
305*e4b17023SJohn Marino   /** @brief Reduction for finding the maximum element, using a comparator. */
306*e4b17023SJohn Marino   template<typename _Compare, typename _It>
307*e4b17023SJohn Marino     struct __min_element_reduct
308*e4b17023SJohn Marino     {
309*e4b17023SJohn Marino       _Compare& __comp;
310*e4b17023SJohn Marino 
311*e4b17023SJohn Marino       explicit
__min_element_reduct__min_element_reduct312*e4b17023SJohn Marino       __min_element_reduct(_Compare &__c) : __comp(__c) { }
313*e4b17023SJohn Marino 
314*e4b17023SJohn Marino       _It
operator__min_element_reduct315*e4b17023SJohn Marino       operator()(_It __x, _It __y)
316*e4b17023SJohn Marino       { return (__comp(*__x, *__y)) ? __x : __y; }
317*e4b17023SJohn Marino     };
318*e4b17023SJohn Marino 
319*e4b17023SJohn Marino   /** @brief Reduction for finding the maximum element, using a comparator. */
320*e4b17023SJohn Marino   template<typename _Compare, typename _It>
321*e4b17023SJohn Marino     struct __max_element_reduct
322*e4b17023SJohn Marino     {
323*e4b17023SJohn Marino       _Compare& __comp;
324*e4b17023SJohn Marino 
325*e4b17023SJohn Marino       explicit
__max_element_reduct__max_element_reduct326*e4b17023SJohn Marino       __max_element_reduct(_Compare& __c) : __comp(__c) { }
327*e4b17023SJohn Marino 
328*e4b17023SJohn Marino       _It
operator__max_element_reduct329*e4b17023SJohn Marino       operator()(_It __x, _It __y)
330*e4b17023SJohn Marino       { return (__comp(*__x, *__y)) ? __y : __x; }
331*e4b17023SJohn Marino     };
332*e4b17023SJohn Marino 
333*e4b17023SJohn Marino   /** @brief General reduction, using a binary operator. */
334*e4b17023SJohn Marino   template<typename _BinOp>
335*e4b17023SJohn Marino     struct __accumulate_binop_reduct
336*e4b17023SJohn Marino     {
337*e4b17023SJohn Marino       _BinOp& __binop;
338*e4b17023SJohn Marino 
339*e4b17023SJohn Marino       explicit
__accumulate_binop_reduct__accumulate_binop_reduct340*e4b17023SJohn Marino       __accumulate_binop_reduct(_BinOp& __b) : __binop(__b) { }
341*e4b17023SJohn Marino 
342*e4b17023SJohn Marino       template<typename _Result, typename _Addend>
343*e4b17023SJohn Marino         _Result
operator__accumulate_binop_reduct344*e4b17023SJohn Marino         operator()(const _Result& __x, const _Addend& __y)
345*e4b17023SJohn Marino         { return __binop(__x, __y); }
346*e4b17023SJohn Marino     };
347*e4b17023SJohn Marino }
348*e4b17023SJohn Marino 
349*e4b17023SJohn Marino #endif /* _GLIBCXX_PARALLEL_FOR_EACH_SELECTORS_H */
350