SLIP  1.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
stl_numeric_ext.hpp
Go to the documentation of this file.
1 /*
2  * Copyright(c):
3  * Signal Image and Communications (SIC) Department
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * - University of Poitiers, France http://www.univ-poitiers.fr
6  * - XLIM Institute UMR CNRS 7252 http://www.xlim.fr/
7  *
8  * and
9  *
10  * D2 Fluid, Thermic and Combustion
11  * - University of Poitiers, France http://www.univ-poitiers.fr
12  * - PPRIME Institute - UPR CNRS 3346 http://www.pprime.fr
13  * - ISAE-ENSMA http://www.ensma.fr
14  *
15  * Contributor(s):
16  * The SLIP team,
17  * Benoit Tremblais <tremblais_AT_sic.univ-poitiers.fr>,
18  * Laurent David <laurent.david_AT_lea.univ-poitiers.fr>,
19  * Ludovic Chatellier <ludovic.chatellier_AT_univ-poitiers.fr>,
20  * Lionel Thomas <lionel.thomas_AT_univ-poitiers.fr>,
21  * Denis Arrivault <arrivault_AT_sic.univ-poitiers.fr>,
22  * Julien Dombre <julien.dombre_AT_univ-poitiers.fr>.
23  *
24  * Description:
25  * The Simple Library of Image Processing (SLIP) is a new image processing
26  * library. It is written in the C++ language following as much as possible
27  * the ISO/ANSI C++ standard. It is consequently compatible with any system
28  * satisfying the ANSI C++ complience. It works on different Unix , Linux ,
29  * Mircrosoft Windows and Mac OS X plateforms. SLIP is a research library that
30  * was created by the Signal, Image and Communications (SIC) departement of
31  * the XLIM, UMR 7252 CNRS Institute in collaboration with the Fluids, Thermic
32  * and Combustion departement of the P', UPR 3346 CNRS Institute of the
33  * University of Poitiers.
34  *
35  * The SLIP Library source code has been registered to the APP (French Agency
36  * for the Protection of Programs) by the University of Poitiers and CNRS,
37  * under registration number IDDN.FR.001.300034.000.S.P.2010.000.21000.
38 
39  * http://www.sic.sp2mi.univ-poitiers.fr/slip/
40  *
41  * This software is governed by the CeCILL-C license under French law and
42  * abiding by the rules of distribution of free software. You can use,
43  * modify and/ or redistribute the software under the terms of the CeCILL-C
44  * license as circulated by CEA, CNRS and INRIA at the following URL
45  * http://www.cecill.info.
46  * As a counterpart to the access to the source code and rights to copy,
47  * modify and redistribute granted by the license, users are provided only
48  * with a limited warranty and the software's author, the holder of the
49  * economic rights, and the successive licensors have only limited
50  * liability.
51  *
52  * In this respect, the user's attention is drawn to the risks associated
53  * with loading, using, modifying and/or developing or reproducing the
54  * software by the user in light of its specific status of free software,
55  * that may mean that it is complicated to manipulate, and that also
56  * therefore means that it is reserved for developers and experienced
57  * professionals having in-depth computer knowledge. Users are therefore
58  * encouraged to load and test the software's suitability as regards their
59  * requirements in conditions enabling the security of their systems and/or
60  * data to be ensured and, more generally, to use and operate it in the
61  * same conditions as regards security.
62  *
63  * The fact that you are presently reading this means that you have had
64  * knowledge of the CeCILL-C license and that you accept its terms.
65  */
66 
67 
74 #ifndef SLIP_STL_NUMERIC_EXT_HPP
75 #define SLIP_STL_NUMERIC_EXT_HPP
76 #include <iostream>
77 #include <cassert>
78 
79 
80 namespace slip
81 {
124  template<typename _InputIterator1, typename _InputIterator2,
125  typename _MaskIterator,
126  typename _Tp>
127  _Tp
128  inner_product_mask(_InputIterator1 first1, _InputIterator1 last1,
129  _MaskIterator mask_first,
130  _InputIterator2 first2, _Tp init,
131  typename std::iterator_traits<_MaskIterator>::value_type value=typename std::iterator_traits<_MaskIterator>::value_type(1))
132  {
133  assert(first1 != last1);
134 
135  for (; first1 != last1; ++first1, ++first2, ++mask_first)
136  {
137  if(*mask_first == value)
138  {
139  init = init + (*first1 * *first2);
140  }
141  }
142  return init;
143  }
144 
145 
146 
202  template<typename _InputIterator1, typename _InputIterator2,
203  typename _MaskIterator,
204  typename _Tp,
205  typename _BinaryOperation1, typename _BinaryOperation2>
206  _Tp
207  inner_product_mask(_InputIterator1 first1, _InputIterator1 last1,
208  _MaskIterator mask_first,
209  _InputIterator2 first2, _Tp init,
210  _BinaryOperation1 binary_op1,
211  _BinaryOperation2 binary_op2,
212  typename std::iterator_traits<_MaskIterator>::value_type value=typename std::iterator_traits<_MaskIterator>::value_type(1))
213  {
214  // concept requirements
215  assert(first1 != last1);
216 
217  for (; first1 != last1; ++first1, ++first2, ++mask_first)
218  {
219  if(*mask_first == value)
220  {
221  init = binary_op1(init, binary_op2(*first1, *first2));
222  }
223  }
224  return init;
225  }
226 
227 
228 
229 
271  template<typename _InputIterator1, typename _InputIterator2,
272  typename _Predicate,
273  typename _Tp>
274  _Tp
275  inner_product_if(_InputIterator1 first1, _InputIterator1 last1,
276  _InputIterator2 first2, _Tp init,
277  _Predicate pred)
278  {
279  assert(first1 != last1);
280 
281  for (; first1 != last1; ++first1, ++first2)
282  {
283  if(pred(*first1))
284  {
285  init = init + (*first1 * *first2);
286  }
287  }
288  return init;
289  }
290 
336  template<typename _InputIterator1, typename _InputIterator2,
337  typename _Tp,
338  typename _BinaryOperation1, typename _BinaryOperation2,
339  typename _Predicate>
340  _Tp
341  inner_product_if(_InputIterator1 first1, _InputIterator1 last1,
342  _InputIterator2 first2, _Tp init,
343  _BinaryOperation1 binary_op1,
344  _BinaryOperation2 binary_op2,
345  _Predicate pred)
346  {
347  // concept requirements
348  assert(first1 != last1);
349 
350  for (; first1 != last1; ++first1, ++first2)
351  {
352  if(pred(*first1))
353  {
354  init = binary_op1(init, binary_op2(*first1, *first2));
355  }
356  }
357  return init;
358  }
359 
360 
361 }//slip::
362 
363 #endif //SLIP_STL_NUMERIC_EXT_HPP
_Tp inner_product_mask(_InputIterator1 first1, _InputIterator1 last1, _MaskIterator mask_first, _InputIterator2 first2, _Tp init, typename std::iterator_traits< _MaskIterator >::value_type value=typename std::iterator_traits< _MaskIterator >::value_type(1))
Compute inner product of two ranges according to a mask range.
_Tp inner_product_if(_InputIterator1 first1, _InputIterator1 last1, _InputIterator2 first2, _Tp init, _Predicate pred)
Compute inner product of two ranges according to a Predicate.