Library of Assembled Shared Sources
range_algorithm.h
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2011 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43
44
45/** @defgroup range_algorithm
46 * @brief extra algorithms
47 * @author Bram de Greve [BdG]
48 */
49
50#ifndef LASS_GUARDIAN_OF_INCLUSION_STDE_RANGE_ALGORITHM_H
51#define LASS_GUARDIAN_OF_INCLUSION_STDE_RANGE_ALGORITHM_H
52
53#include "stde_common.h"
54
55#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
56# pragma warning(push)
57# pragma warning(disable: 4996)
58#endif
59
60namespace lass
61{
62namespace stde
63{
64
65/** std::for_each wrapper for ranges
66 * @ingroup range_algorithm
67 */
68template <typename InputRange, typename Op> inline
69Op for_each_r(InputRange& range, Op op)
70{
71 return std::for_each(range.begin(), range.end(), op);
72}
73
74/** std::find wrapper for ranges
75 * @ingroup range_algorithm
76 */
77template <typename InputRange, typename T> inline
78typename InputRange::iterator
79find_r(const InputRange& range, const T& value)
80{
81 return std::find(range.begin(), range.end(), value);
82}
83
84/** std::find_if wrapper for ranges
85 * @ingroup range_algorithm
86 */
87template <typename InputRange, typename Predicate> inline
88typename InputRange::iterator
89find_if_r(const InputRange& range, Predicate pred)
90{
91 return std::find(range.begin(), range.end(), pred);
92}
93
94/** std::find_end wrapper for ranges
95 * @ingroup range_algorithm
96 */
97template <typename ForwardRange1, typename ForwardRange2> inline
98typename ForwardRange1::iterator
99find_end_r(const ForwardRange1& range1, const ForwardRange2& range2)
100{
101 return std::find_end(range1.begin(), range1.end(), range2.begin(), range2.end());
102}
103
104/** std::find_end wrapper for ranges
105 * @ingroup range_algorithm
106 */
107template <typename ForwardRange1, typename ForwardRange2, typename BinaryPredicate> inline
108typename ForwardRange1::iterator
109find_end_r(const ForwardRange1& range1, const ForwardRange2& range2, BinaryPredicate pred)
110{
111 return std::find_end(range1.begin(), range1.end(), range2.begin(), range2.end(), pred);
112}
113
114/** std::find_first_of wrapper for ranges
115 * @ingroup range_algorithm
116 */
117template <typename ForwardRange1, typename ForwardRange2> inline
118typename ForwardRange1::iterator
119find_first_of_r(const ForwardRange1& range1, const ForwardRange2& range2)
120{
121 return std::find_first_of(range1.begin(), range1.end(), range2.begin(), range2.end());
122}
123
124/** std::find_first_of wrapper for ranges
125 * @ingroup range_algorithm
126 */
127template <typename ForwardRange1, typename ForwardRange2, typename BinaryPredicate> inline
128typename ForwardRange1::iterator
129find_first_of_r(const ForwardRange1& range1,const ForwardRange2& range2, BinaryPredicate pred)
130{
131 return std::find_first_of(range1.begin(), range1.end(), range2.begin(), range2.end(), pred);
132}
133
134/** std::adjacent_find wrapper for ranges
135 * @ingroup range_algorithm
136 */
137template <typename ForwardRange> inline
138typename ForwardRange::iterator
139adjacent_find_r(const ForwardRange& range)
140{
141 return std::adjacent_find(range.begin(), range.end());
142}
143
144/** std::adjacent_find wrapper for ranges
145 * @ingroup range_algorithm
146 */
147template <typename ForwardRange, typename Predicate> inline
148typename ForwardRange::iterator
149adjacent_find_r(const ForwardRange& range, Predicate pred)
150{
151 return std::adjacent_find(range.begin(), range.end(), pred);
152}
153
154/** std::count wrapper for ranges
155 * @ingroup range_algorithm
156 */
157template <typename InputRange, typename T> inline
158typename std::iterator_traits<typename InputRange::iterator>::difference_type
159count_r(const InputRange& range, const T& value)
160{
161 return std::count(range.begin(), range.end(), value);
162}
163
164/** std::count_if wrapper for ranges
165 * @ingroup range_algorithm
166 */
167template <typename InputRange, typename Predicate> inline
168typename std::iterator_traits<typename InputRange::iterator>::difference_type
169count_if_r(const InputRange& range, Predicate pred)
170{
171 return std::count_if(range.begin(), range.end(), pred);
172}
173
174/** std::mismatch wrapper for ranges
175 * @ingroup range_algorithm
176 */
177template <typename InputRange1, typename InputRange2, typename BinaryPredicate> inline
178std::pair<typename InputRange1::iterator, typename InputRange2::iterator>
179mismatch_r(const InputRange1& range1, const InputRange2& range2, BinaryPredicate pred)
180{
181 return std::mismatch(range1.begin(), range1.end(), range2.begin(), range2.end(), pred);
182}
183
184/** std::mismatch wrapper for ranges
185 * @ingroup range_algorithm
186 */
187template <typename InputRange1, typename InputRange2> inline
188std::pair<typename InputRange1::iterator, typename InputRange2::iterator>
189mismatch_r(const InputRange1& range1, const InputRange2& range2)
190{
191 return std::mismatch(range1.begin(), range1.end(), range2.begin(), range2.end());
192}
193
194/** std::mismatch wrapper for ranges
195 * @ingroup range_algorithm
196 */
197template <typename InputRange1, typename InputRange2> inline
198bool equal_r(const InputRange1& range1, const InputRange2& range2)
199{
200 return std::equal(range1.begin(), range1.end(), range2.begin());
201}
202
203/** std::mismatch wrapper for ranges
204 * @ingroup range_algorithm
205 */
206template <typename InputRange1, typename InputRange2, typename BinaryPredicate> inline
207bool equal_r(const InputRange1& range1, const InputRange2& range2, BinaryPredicate pred)
208{
209 return std::equal(range1.begin(), range1.end(), range2.begin(), pred);
210}
211
212/** std::search wrapper for ranges
213 * @ingroup range_algorithm
214 */
215template <typename ForwardRange1, typename ForwardRange2> inline
216typename ForwardRange1::iterator
217search_r(const ForwardRange1& range1,const ForwardRange2& range2)
218{
219 return std::search(range1.begin(), range1.end(), range2.begin(), range2.end());
220}
221
222/** std::search wrapper for ranges
223 * @ingroup range_algorithm
224 */
225template <typename ForwardRange1, typename ForwardRange2, typename BinaryPredicate> inline
226typename ForwardRange1::iterator
227search_r(const ForwardRange1& range1,const ForwardRange2& range2, BinaryPredicate pred)
228{
229 return std::search(range1.begin(), range1.end(), range2.begin(), range2.end(), pred);
230}
231
232/** std::search_n wrapper for ranges
233 * @ingroup range_algorithm
234 */
235template <typename ForwardRange, typename Size, typename T> inline
236typename ForwardRange::iterator
237search_n_r(const ForwardRange& range, Size count, const T& value)
238{
239 return std::search_n(range.begin(), range.end(), count, value);
240}
241
242/** std::search_n wrapper for ranges
243 * @ingroup range_algorithm
244 */
245template <typename ForwardRange, typename Size, typename T, typename BinaryPredicate> inline
246typename ForwardRange::iterator
247search_n_r(const ForwardRange& range, Size count, const T& value, BinaryPredicate pred)
248{
249 return std::search_n(range.begin(), range.end(), count, value, pred);
250}
251
252/** std::copy wrapper for ranges
253 * @ingroup range_algorithm
254 */
255template <typename InputRange, typename OutputIterator> inline
256OutputIterator copy_r(const InputRange& range, OutputIterator result)
257{
258 return std::copy(range.begin(), range.end(), result);
259}
260
261/** std::copy_backward wrapper for ranges
262 * @ingroup range_algorithm
263 */
264template <typename BidirectionalRange, typename BidirectionalIterator> inline
265BidirectionalIterator copy_backward_r(const BidirectionalRange& range, BidirectionalIterator result)
266{
267 return std::copy_backward(range.begin(), range.end(), result);
268}
269
270/** std::swap_ranges wrapper for ranges
271 * @ingroup range_algorithm
272 */
273template <typename ForwardRange1, typename ForwardRange2> inline
274typename ForwardRange2::iterator
275swap_ranges_r(ForwardRange1& range1, ForwardRange2& range2)
276{
277 return std::swap_ranges(range1.begin(), range1.end(), range2.begin());
278}
279
280/** std::transform wrapper for ranges
281 * @ingroup range_algorithm
282 */
283template <typename InputRange, typename OutputIterator, typename UnaryOperation> inline
284OutputIterator transform_r(const InputRange& range, OutputIterator result, UnaryOperation op)
285{
286 return std::transform(range.begin(), range.end(), result, op);
287}
288
289/** std::transform wrapper for ranges
290* @ingroup range_algorithm
291*
292* Overload for MSVC compiler to preserve output array as checked iterator.
293*/
294template <typename InputRange, typename OutputType, size_t N, typename UnaryOperation> inline
295OutputType* transform_r(const InputRange& range, OutputType (&result)[N], UnaryOperation op)
296{
297 return std::transform(range.begin(), range.end(), result, op);
298}
299
300/** std::transform wrapper for ranges
301 * @ingroup range_algorithm
302 */
303template <typename InputRange1, typename InputRange2, typename OutputIterator, typename BinaryOperation> inline
304OutputIterator transform_r(const InputRange1& range1, const InputRange2& range2, OutputIterator result, BinaryOperation op)
305{
306 return std::transform(range1.begin(), range1.end(), range2.begin(), range2.end(), result, op);
307}
308
309/** std::replace wrapper for ranges
310 * @ingroup range_algorithm
311 */
312template <typename ForwardRange, typename T> inline
313void replace_r(ForwardRange& range, const T& old_value, const T& new_value)
314{
315 std::replace(range.begin(), range.end(), old_value, new_value);
316}
317
318/** std::replace_if wrapper for ranges
319 * @ingroup range_algorithm
320 */
321template <typename ForwardRange, typename Predicate, typename T> inline
322void replace_if_r(ForwardRange& range, Predicate pred, const T& new_value)
323{
324 std::replace_if(range.begin(), range.end(), pred, new_value);
325}
326
327/** std::replace_copy wrapper for ranges
328 * @ingroup range_algorithm
329 */
330template <typename InputRange, typename OutputIterator, typename T> inline
331OutputIterator replace_copy_r(const InputRange& range, OutputIterator result, const T& old_value, const T& new_value)
332{
333 return std::replace(range.begin(), range.end(), result, old_value, new_value);
334}
335
336/** std::replace_copy_if wrapper for ranges
337 * @ingroup range_algorithm
338 */
339template <typename InputRange, typename OutputIterator, typename Predicate, typename T> inline
340OutputIterator replace_copy_if_r(const InputRange& range, OutputIterator result, Predicate pred, const T& new_value)
341{
342 return std::replace_if(range.begin(), range.end(), result, pred, new_value);
343}
344
345/** std::fill wrapper for ranges
346 * @ingroup range_algorithm
347 */
348template <typename ForwardRange, typename T> inline
349void fill_r(ForwardRange& range, const T& value)
350{
351 std::fill(range.begin(), range.end(), value);
352}
353
354/** std::generate wrapper for ranges
355 * @ingroup range_algorithm
356 */
357template <typename ForwardRange, typename Generator> inline
358void generate_r(ForwardRange& range, Generator gen)
359{
360 std::generate(range.begin(), range.end(), gen);
361}
362
363/** std::remove wrapper for ranges
364 * @ingroup range_algorithm
365 */
366template <typename ForwardRange, typename T> inline
367typename ForwardRange::iterator
368remove_r(ForwardRange& range, const T& value)
369{
370 return std::remove(range.begin(), range.end(), value);
371}
372
373/** std::remove wrapper for ranges
374 * @ingroup range_algorithm
375 */
376template <typename ForwardRange, typename Predicate> inline
377typename ForwardRange::iterator
378remove_if_r(ForwardRange& range, Predicate pred)
379{
380 return std::remove_if(range.begin(), range.end(), pred);
381}
382
383/** std::remove_copy wrapper for ranges
384 * @ingroup range_algorithm
385 */
386template <typename InputRange, typename OutputIterator, typename T> inline
387OutputIterator remove_copy_r(const InputRange& range, OutputIterator result, const T& value)
388{
389 return std::remove_copy(range.begin(), range.end(), result, value);
390}
391
392/** std::remove_copy wrapper for ranges
393 * @ingroup range_algorithm
394 */
395template <typename InputRange, typename OutputIterator, typename Predicate> inline
396OutputIterator remove_copy_if_r(const InputRange& range, OutputIterator result, Predicate pred)
397{
398 return std::remove_copy_if(range.begin(), range.end(), result, pred);
399}
400
401/** std::unique wrapper for ranges
402 * @ingroup range_algorithm
403 */
404template <typename ForwardRange> inline
405typename ForwardRange::iterator
406unique_r(ForwardRange& range)
407{
408 return std::unique(range.begin(), range.end());
409}
410
411/** std::unique wrapper for ranges
412 * @ingroup range_algorithm
413 */
414template <typename ForwardRange, typename Predicate> inline
415typename ForwardRange::iterator
416unique_r(ForwardRange& range, Predicate pred)
417{
418 return std::unique(range.begin(), range.end(), pred);
419}
420
421/** std::unique_copy_r wrapper for ranges
422 * @ingroup range_algorithm
423 */
424template <typename InputRange, typename OutputIterator> inline
425OutputIterator unique_copy_r(const InputRange& range, OutputIterator result)
426{
427 return std::unique_copy(range.begin(), range.end(), result);
428}
429
430/** std::unique_copy_r wrapper for ranges
431 * @ingroup range_algorithm
432 */
433template <typename InputRange, typename OutputIterator, typename Predicate> inline
434OutputIterator unique_copy_r(const InputRange& range, OutputIterator result, Predicate pred)
435{
436 return std::unique_copy(range.begin(), range.end(), result, pred);
437}
438
439/** std::reverse wrapper for ranges
440 * @ingroup range_algorithm
441 */
442template <typename BidirectionalRange> inline
443void reverse_r(BidirectionalRange& range)
444{
445 std::reverse(range.begin(), range.end());
446}
447
448/** std::reverse_copy wrapper for ranges
449 * @ingroup range_algorithm
450 */
451template <typename BidirectionalRange, typename OutputIterator> inline
452OutputIterator reverse_copy_r(const BidirectionalRange& range, OutputIterator result)
453{
454 return std::reverse_copy(range.begin(), range.end(), result);
455}
456
457/** std::rotate wrapper for ranges
458 * @ingroup range_algorithm
459 */
460template <typename ForwardRange> inline
461void rotate_r(ForwardRange& range, typename ForwardRange::iterator middle)
462{
463 return std::rotate(range.begin(), middle, range.end());
464}
465
466/** std::rotate_copy wrapper for ranges
467 * @ingroup range_algorithm
468 */
469template <typename ForwardRange, typename OutputIterator> inline
470void rotate_copy_r(const ForwardRange& range, typename ForwardRange::iterator middle, OutputIterator result)
471{
472 return std::rotate_copy(range.begin(), middle, range.end(), result);
473}
474
475/** std::shuffle wrapper for ranges
476 * @ingroup range_algorithm
477 */
478template <typename RandomAccessRange, typename UniformRandomBitGenerator> inline
479void shuffle_r(RandomAccessRange& range, UniformRandomBitGenerator&& urbg)
480{
481 return std::shuffle(range.begin(), range.end(), std::forward<UniformRandomBitGenerator>(urbg));
482}
483
484/** std::partition wrapper for ranges
485 * @ingroup range_algorithm
486 */
487template <typename BidirectionalRange, typename Predicate>
488typename BidirectionalRange::iterator
489partition_r(BidirectionalRange& range, Predicate pred)
490{
491 return std::partition(range.begin(), range.end(), pred);
492}
493
494/** std::stable_partition wrapper for ranges
495 * @ingroup range_algorithm
496 */
497template <typename BidirectionalRange, typename Predicate>
498typename BidirectionalRange::iterator
499stable_partition_r(BidirectionalRange& range, Predicate pred)
500{
501 return std::stable_partition(range.begin(), range.end(), pred);
502}
503
504}
505
506}
507
508#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
509# pragma warning(pop)
510#endif
511
512#endif
513
514// EOF
OutputIterator remove_copy_if_r(const InputRange &range, OutputIterator result, Predicate pred)
std::remove_copy wrapper for ranges
void reverse_r(BidirectionalRange &range)
std::reverse wrapper for ranges
ForwardRange1::iterator find_end_r(const ForwardRange1 &range1, const ForwardRange2 &range2)
std::find_end wrapper for ranges
OutputIterator replace_copy_r(const InputRange &range, OutputIterator result, const T &old_value, const T &new_value)
std::replace_copy wrapper for ranges
ForwardRange::iterator remove_r(ForwardRange &range, const T &value)
std::remove wrapper for ranges
ForwardRange::iterator adjacent_find_r(const ForwardRange &range)
std::adjacent_find wrapper for ranges
ForwardRange1::iterator search_r(const ForwardRange1 &range1, const ForwardRange2 &range2)
std::search wrapper for ranges
BidirectionalIterator copy_backward_r(const BidirectionalRange &range, BidirectionalIterator result)
std::copy_backward wrapper for ranges
Op for_each_r(InputRange &range, Op op)
std::for_each wrapper for ranges
InputRange::iterator find_if_r(const InputRange &range, Predicate pred)
std::find_if wrapper for ranges
OutputIterator reverse_copy_r(const BidirectionalRange &range, OutputIterator result)
std::reverse_copy wrapper for ranges
std::pair< typename InputRange1::iterator, typename InputRange2::iterator > mismatch_r(const InputRange1 &range1, const InputRange2 &range2, BinaryPredicate pred)
std::mismatch wrapper for ranges
ForwardRange::iterator unique_r(ForwardRange &range)
std::unique wrapper for ranges
BidirectionalRange::iterator partition_r(BidirectionalRange &range, Predicate pred)
std::partition wrapper for ranges
void shuffle_r(RandomAccessRange &range, UniformRandomBitGenerator &&urbg)
std::shuffle wrapper for ranges
void replace_if_r(ForwardRange &range, Predicate pred, const T &new_value)
std::replace_if wrapper for ranges
OutputIterator unique_copy_r(const InputRange &range, OutputIterator result)
std::unique_copy_r wrapper for ranges
void rotate_r(ForwardRange &range, typename ForwardRange::iterator middle)
std::rotate wrapper for ranges
InputRange::iterator find_r(const InputRange &range, const T &value)
std::find wrapper for ranges
OutputIterator copy_r(const InputRange &range, OutputIterator result)
std::copy wrapper for ranges
bool equal_r(const InputRange1 &range1, const InputRange2 &range2)
std::mismatch wrapper for ranges
void rotate_copy_r(const ForwardRange &range, typename ForwardRange::iterator middle, OutputIterator result)
std::rotate_copy wrapper for ranges
std::iterator_traits< typenameInputRange::iterator >::difference_type count_if_r(const InputRange &range, Predicate pred)
std::count_if wrapper for ranges
OutputIterator remove_copy_r(const InputRange &range, OutputIterator result, const T &value)
std::remove_copy wrapper for ranges
BidirectionalRange::iterator stable_partition_r(BidirectionalRange &range, Predicate pred)
std::stable_partition wrapper for ranges
void replace_r(ForwardRange &range, const T &old_value, const T &new_value)
std::replace wrapper for ranges
ForwardRange::iterator remove_if_r(ForwardRange &range, Predicate pred)
std::remove wrapper for ranges
void fill_r(ForwardRange &range, const T &value)
std::fill wrapper for ranges
ForwardRange2::iterator swap_ranges_r(ForwardRange1 &range1, ForwardRange2 &range2)
std::swap_ranges wrapper for ranges
std::iterator_traits< typenameInputRange::iterator >::difference_type count_r(const InputRange &range, const T &value)
std::count wrapper for ranges
OutputIterator transform_r(const InputRange &range, OutputIterator result, UnaryOperation op)
std::transform wrapper for ranges
ForwardRange1::iterator find_first_of_r(const ForwardRange1 &range1, const ForwardRange2 &range2)
std::find_first_of wrapper for ranges
ForwardRange::iterator search_n_r(const ForwardRange &range, Size count, const T &value)
std::search_n wrapper for ranges
void generate_r(ForwardRange &range, Generator gen)
std::generate wrapper for ranges
OutputIterator replace_copy_if_r(const InputRange &range, OutputIterator result, Predicate pred, const T &new_value)
std::replace_copy_if wrapper for ranges
lass extensions to the standard library
Library for Assembled Shared Sources.
Definition config.h:53