File Coverage

/usr/include/c++/5/bits/stl_numeric.h
Criterion Covered Total %
statement 0 4 0.0
branch 0 2 0.0
condition n/a
subroutine n/a
pod n/a
total 0 6 0.0


line stmt bran cond sub pod time code
1             // Numeric functions implementation -*- C++ -*-
2              
3             // Copyright (C) 2001-2015 Free Software Foundation, Inc.
4             //
5             // This file is part of the GNU ISO C++ Library. This library is free
6             // software; you can redistribute it and/or modify it under the
7             // terms of the GNU General Public License as published by the
8             // Free Software Foundation; either version 3, or (at your option)
9             // any later version.
10              
11             // This library is distributed in the hope that it will be useful,
12             // but WITHOUT ANY WARRANTY; without even the implied warranty of
13             // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14             // GNU General Public License for more details.
15              
16             // Under Section 7 of GPL version 3, you are granted additional
17             // permissions described in the GCC Runtime Library Exception, version
18             // 3.1, as published by the Free Software Foundation.
19              
20             // You should have received a copy of the GNU General Public License and
21             // a copy of the GCC Runtime Library Exception along with this program;
22             // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23             // .
24              
25             /*
26             *
27             * Copyright (c) 1994
28             * Hewlett-Packard Company
29             *
30             * Permission to use, copy, modify, distribute and sell this software
31             * and its documentation for any purpose is hereby granted without fee,
32             * provided that the above copyright notice appear in all copies and
33             * that both that copyright notice and this permission notice appear
34             * in supporting documentation. Hewlett-Packard Company makes no
35             * representations about the suitability of this software for any
36             * purpose. It is provided "as is" without express or implied warranty.
37             *
38             *
39             * Copyright (c) 1996,1997
40             * Silicon Graphics Computer Systems, Inc.
41             *
42             * Permission to use, copy, modify, distribute and sell this software
43             * and its documentation for any purpose is hereby granted without fee,
44             * provided that the above copyright notice appear in all copies and
45             * that both that copyright notice and this permission notice appear
46             * in supporting documentation. Silicon Graphics makes no
47             * representations about the suitability of this software for any
48             * purpose. It is provided "as is" without express or implied warranty.
49             */
50              
51             /** @file bits/stl_numeric.h
52             * This is an internal header file, included by other library headers.
53             * Do not attempt to use it directly. @headername{numeric}
54             */
55              
56             #ifndef _STL_NUMERIC_H
57             #define _STL_NUMERIC_H 1
58              
59             #include
60             #include
61             #include // For _GLIBCXX_MOVE
62              
63             #if __cplusplus >= 201103L
64              
65             namespace std _GLIBCXX_VISIBILITY(default)
66             {
67             _GLIBCXX_BEGIN_NAMESPACE_VERSION
68              
69             /**
70             * @brief Create a range of sequentially increasing values.
71             *
72             * For each element in the range @p [first,last) assigns @p value and
73             * increments @p value as if by @p ++value.
74             *
75             * @param __first Start of range.
76             * @param __last End of range.
77             * @param __value Starting value.
78             * @return Nothing.
79             */
80             template
81             void
82             iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value)
83             {
84             // concept requirements
85             __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
86             _ForwardIterator>)
87             __glibcxx_function_requires(_ConvertibleConcept<_Tp,
88             typename iterator_traits<_ForwardIterator>::value_type>)
89             __glibcxx_requires_valid_range(__first, __last);
90              
91             for (; __first != __last; ++__first)
92             {
93             *__first = __value;
94             ++__value;
95             }
96             }
97              
98             _GLIBCXX_END_NAMESPACE_VERSION
99             } // namespace std
100              
101             #endif
102              
103             namespace std _GLIBCXX_VISIBILITY(default)
104             {
105             _GLIBCXX_BEGIN_NAMESPACE_ALGO
106              
107             /**
108             * @brief Accumulate values in a range.
109             *
110             * Accumulates the values in the range [first,last) using operator+(). The
111             * initial value is @a init. The values are processed in order.
112             *
113             * @param __first Start of range.
114             * @param __last End of range.
115             * @param __init Starting value to add other values to.
116             * @return The final sum.
117             */
118             template
119             inline _Tp
120 0           accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
121             {
122             // concept requirements
123             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
124             __glibcxx_requires_valid_range(__first, __last);
125              
126 0 0         for (; __first != __last; ++__first)
127 0           __init = __init + *__first;
128 0           return __init;
129             }
130              
131             /**
132             * @brief Accumulate values in a range with operation.
133             *
134             * Accumulates the values in the range [first,last) using the function
135             * object @p __binary_op. The initial value is @p __init. The values are
136             * processed in order.
137             *
138             * @param __first Start of range.
139             * @param __last End of range.
140             * @param __init Starting value to add other values to.
141             * @param __binary_op Function object to accumulate with.
142             * @return The final sum.
143             */
144             template
145             inline _Tp
146             accumulate(_InputIterator __first, _InputIterator __last, _Tp __init,
147             _BinaryOperation __binary_op)
148             {
149             // concept requirements
150             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
151             __glibcxx_requires_valid_range(__first, __last);
152              
153             for (; __first != __last; ++__first)
154             __init = __binary_op(__init, *__first);
155             return __init;
156             }
157              
158             /**
159             * @brief Compute inner product of two ranges.
160             *
161             * Starting with an initial value of @p __init, multiplies successive
162             * elements from the two ranges and adds each product into the accumulated
163             * value using operator+(). The values in the ranges are processed in
164             * order.
165             *
166             * @param __first1 Start of range 1.
167             * @param __last1 End of range 1.
168             * @param __first2 Start of range 2.
169             * @param __init Starting value to add other values to.
170             * @return The final inner product.
171             */
172             template
173             inline _Tp
174             inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
175             _InputIterator2 __first2, _Tp __init)
176             {
177             // concept requirements
178             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
179             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
180             __glibcxx_requires_valid_range(__first1, __last1);
181              
182             for (; __first1 != __last1; ++__first1, ++__first2)
183             __init = __init + (*__first1 * *__first2);
184             return __init;
185             }
186              
187             /**
188             * @brief Compute inner product of two ranges.
189             *
190             * Starting with an initial value of @p __init, applies @p __binary_op2 to
191             * successive elements from the two ranges and accumulates each result into
192             * the accumulated value using @p __binary_op1. The values in the ranges are
193             * processed in order.
194             *
195             * @param __first1 Start of range 1.
196             * @param __last1 End of range 1.
197             * @param __first2 Start of range 2.
198             * @param __init Starting value to add other values to.
199             * @param __binary_op1 Function object to accumulate with.
200             * @param __binary_op2 Function object to apply to pairs of input values.
201             * @return The final inner product.
202             */
203             template
204             typename _BinaryOperation1, typename _BinaryOperation2>
205             inline _Tp
206             inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
207             _InputIterator2 __first2, _Tp __init,
208             _BinaryOperation1 __binary_op1,
209             _BinaryOperation2 __binary_op2)
210             {
211             // concept requirements
212             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
213             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
214             __glibcxx_requires_valid_range(__first1, __last1);
215              
216             for (; __first1 != __last1; ++__first1, ++__first2)
217             __init = __binary_op1(__init, __binary_op2(*__first1, *__first2));
218             return __init;
219             }
220              
221             /**
222             * @brief Return list of partial sums
223             *
224             * Accumulates the values in the range [first,last) using the @c + operator.
225             * As each successive input value is added into the total, that partial sum
226             * is written to @p __result. Therefore, the first value in @p __result is
227             * the first value of the input, the second value in @p __result is the sum
228             * of the first and second input values, and so on.
229             *
230             * @param __first Start of input range.
231             * @param __last End of input range.
232             * @param __result Output sum.
233             * @return Iterator pointing just beyond the values written to __result.
234             */
235             template
236             _OutputIterator
237             partial_sum(_InputIterator __first, _InputIterator __last,
238             _OutputIterator __result)
239             {
240             typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
241              
242             // concept requirements
243             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
244             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
245             _ValueType>)
246             __glibcxx_requires_valid_range(__first, __last);
247              
248             if (__first == __last)
249             return __result;
250             _ValueType __value = *__first;
251             *__result = __value;
252             while (++__first != __last)
253             {
254             __value = __value + *__first;
255             *++__result = __value;
256             }
257             return ++__result;
258             }
259              
260             /**
261             * @brief Return list of partial sums
262             *
263             * Accumulates the values in the range [first,last) using @p __binary_op.
264             * As each successive input value is added into the total, that partial sum
265             * is written to @p __result. Therefore, the first value in @p __result is
266             * the first value of the input, the second value in @p __result is the sum
267             * of the first and second input values, and so on.
268             *
269             * @param __first Start of input range.
270             * @param __last End of input range.
271             * @param __result Output sum.
272             * @param __binary_op Function object.
273             * @return Iterator pointing just beyond the values written to __result.
274             */
275             template
276             typename _BinaryOperation>
277             _OutputIterator
278             partial_sum(_InputIterator __first, _InputIterator __last,
279             _OutputIterator __result, _BinaryOperation __binary_op)
280             {
281             typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
282              
283             // concept requirements
284             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
285             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
286             _ValueType>)
287             __glibcxx_requires_valid_range(__first, __last);
288              
289             if (__first == __last)
290             return __result;
291             _ValueType __value = *__first;
292             *__result = __value;
293             while (++__first != __last)
294             {
295             __value = __binary_op(__value, *__first);
296             *++__result = __value;
297             }
298             return ++__result;
299             }
300              
301             /**
302             * @brief Return differences between adjacent values.
303             *
304             * Computes the difference between adjacent values in the range
305             * [first,last) using operator-() and writes the result to @p __result.
306             *
307             * @param __first Start of input range.
308             * @param __last End of input range.
309             * @param __result Output sums.
310             * @return Iterator pointing just beyond the values written to result.
311             *
312             * _GLIBCXX_RESOLVE_LIB_DEFECTS
313             * DR 539. partial_sum and adjacent_difference should mention requirements
314             */
315             template
316             _OutputIterator
317             adjacent_difference(_InputIterator __first,
318             _InputIterator __last, _OutputIterator __result)
319             {
320             typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
321              
322             // concept requirements
323             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
324             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
325             _ValueType>)
326             __glibcxx_requires_valid_range(__first, __last);
327              
328             if (__first == __last)
329             return __result;
330             _ValueType __value = *__first;
331             *__result = __value;
332             while (++__first != __last)
333             {
334             _ValueType __tmp = *__first;
335             *++__result = __tmp - __value;
336             __value = _GLIBCXX_MOVE(__tmp);
337             }
338             return ++__result;
339             }
340              
341             /**
342             * @brief Return differences between adjacent values.
343             *
344             * Computes the difference between adjacent values in the range
345             * [__first,__last) using the function object @p __binary_op and writes the
346             * result to @p __result.
347             *
348             * @param __first Start of input range.
349             * @param __last End of input range.
350             * @param __result Output sum.
351             * @param __binary_op Function object.
352             * @return Iterator pointing just beyond the values written to result.
353             *
354             * _GLIBCXX_RESOLVE_LIB_DEFECTS
355             * DR 539. partial_sum and adjacent_difference should mention requirements
356             */
357             template
358             typename _BinaryOperation>
359             _OutputIterator
360             adjacent_difference(_InputIterator __first, _InputIterator __last,
361             _OutputIterator __result, _BinaryOperation __binary_op)
362             {
363             typedef typename iterator_traits<_InputIterator>::value_type _ValueType;
364              
365             // concept requirements
366             __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
367             __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
368             _ValueType>)
369             __glibcxx_requires_valid_range(__first, __last);
370              
371             if (__first == __last)
372             return __result;
373             _ValueType __value = *__first;
374             *__result = __value;
375             while (++__first != __last)
376             {
377             _ValueType __tmp = *__first;
378             *++__result = __binary_op(__tmp, __value);
379             __value = _GLIBCXX_MOVE(__tmp);
380             }
381             return ++__result;
382             }
383              
384             _GLIBCXX_END_NAMESPACE_ALGO
385             } // namespace std
386              
387             #endif /* _STL_NUMERIC_H */