50#ifndef LASS_GUARDIAN_OF_INCLUSION_STDE_RANGE_ALGORITHM_H
51#define LASS_GUARDIAN_OF_INCLUSION_STDE_RANGE_ALGORITHM_H
55#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
57# pragma warning(disable: 4996)
68template <
typename InputRange,
typename Op>
inline
71 return std::for_each(range.begin(), range.end(), op);
77template <
typename InputRange,
typename T>
inline
78typename InputRange::iterator
79find_r(
const InputRange& range,
const T& value)
81 return std::find(range.begin(), range.end(), value);
87template <
typename InputRange,
typename Predicate>
inline
88typename InputRange::iterator
91 return std::find(range.begin(), range.end(), pred);
97template <
typename ForwardRange1,
typename ForwardRange2>
inline
98typename ForwardRange1::iterator
99find_end_r(
const ForwardRange1& range1,
const ForwardRange2& range2)
101 return std::find_end(range1.begin(), range1.end(), range2.begin(), range2.end());
107template <
typename ForwardRange1,
typename ForwardRange2,
typename BinaryPredicate>
inline
108typename ForwardRange1::iterator
109find_end_r(
const ForwardRange1& range1,
const ForwardRange2& range2, BinaryPredicate pred)
111 return std::find_end(range1.begin(), range1.end(), range2.begin(), range2.end(), pred);
117template <
typename ForwardRange1,
typename ForwardRange2>
inline
118typename ForwardRange1::iterator
121 return std::find_first_of(range1.begin(), range1.end(), range2.begin(), range2.end());
127template <
typename ForwardRange1,
typename ForwardRange2,
typename BinaryPredicate>
inline
128typename ForwardRange1::iterator
129find_first_of_r(
const ForwardRange1& range1,
const ForwardRange2& range2, BinaryPredicate pred)
131 return std::find_first_of(range1.begin(), range1.end(), range2.begin(), range2.end(), pred);
137template <
typename ForwardRange>
inline
138typename ForwardRange::iterator
141 return std::adjacent_find(range.begin(), range.end());
147template <
typename ForwardRange,
typename Predicate>
inline
148typename ForwardRange::iterator
151 return std::adjacent_find(range.begin(), range.end(), pred);
157template <
typename InputRange,
typename T>
inline
158typename std::iterator_traits<typename InputRange::iterator>::difference_type
159count_r(
const InputRange& range,
const T& value)
161 return std::count(range.begin(), range.end(), value);
167template <
typename InputRange,
typename Predicate>
inline
168typename std::iterator_traits<typename InputRange::iterator>::difference_type
171 return std::count_if(range.begin(), range.end(), pred);
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)
181 return std::mismatch(range1.begin(), range1.end(), range2.begin(), range2.end(), pred);
187template <
typename InputRange1,
typename InputRange2>
inline
188std::pair<typename InputRange1::iterator, typename InputRange2::iterator>
189mismatch_r(
const InputRange1& range1,
const InputRange2& range2)
191 return std::mismatch(range1.begin(), range1.end(), range2.begin(), range2.end());
197template <
typename InputRange1,
typename InputRange2>
inline
198bool equal_r(
const InputRange1& range1,
const InputRange2& range2)
200 return std::equal(range1.begin(), range1.end(), range2.begin());
206template <
typename InputRange1,
typename InputRange2,
typename BinaryPredicate>
inline
207bool equal_r(
const InputRange1& range1,
const InputRange2& range2, BinaryPredicate pred)
209 return std::equal(range1.begin(), range1.end(), range2.begin(), pred);
215template <
typename ForwardRange1,
typename ForwardRange2>
inline
216typename ForwardRange1::iterator
217search_r(
const ForwardRange1& range1,
const ForwardRange2& range2)
219 return std::search(range1.begin(), range1.end(), range2.begin(), range2.end());
225template <
typename ForwardRange1,
typename ForwardRange2,
typename BinaryPredicate>
inline
226typename ForwardRange1::iterator
227search_r(
const ForwardRange1& range1,
const ForwardRange2& range2, BinaryPredicate pred)
229 return std::search(range1.begin(), range1.end(), range2.begin(), range2.end(), pred);
235template <
typename ForwardRange,
typename Size,
typename T>
inline
236typename ForwardRange::iterator
237search_n_r(
const ForwardRange& range, Size count,
const T& value)
239 return std::search_n(range.begin(), range.end(), count, value);
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)
249 return std::search_n(range.begin(), range.end(), count, value, pred);
255template <
typename InputRange,
typename OutputIterator>
inline
256OutputIterator
copy_r(
const InputRange& range, OutputIterator result)
258 return std::copy(range.begin(), range.end(), result);
264template <
typename B
idirectionalRange,
typename B
idirectionalIterator>
inline
265BidirectionalIterator
copy_backward_r(
const BidirectionalRange& range, BidirectionalIterator result)
267 return std::copy_backward(range.begin(), range.end(), result);
273template <
typename ForwardRange1,
typename ForwardRange2>
inline
274typename ForwardRange2::iterator
277 return std::swap_ranges(range1.begin(), range1.end(), range2.begin());
283template <
typename InputRange,
typename OutputIterator,
typename UnaryOperation>
inline
284OutputIterator
transform_r(
const InputRange& range, OutputIterator result, UnaryOperation op)
286 return std::transform(range.begin(), range.end(), result, op);
294template <
typename InputRange,
typename OutputType,
size_t N,
typename UnaryOperation>
inline
295OutputType*
transform_r(
const InputRange& range, OutputType (&result)[N], UnaryOperation op)
297 return std::transform(range.begin(), range.end(), result, op);
303template <
typename InputRange1,
typename InputRange2,
typename OutputIterator,
typename BinaryOperation>
inline
304OutputIterator
transform_r(
const InputRange1& range1,
const InputRange2& range2, OutputIterator result, BinaryOperation op)
306 return std::transform(range1.begin(), range1.end(), range2.begin(), range2.end(), result, op);
312template <
typename ForwardRange,
typename T>
inline
313void replace_r(ForwardRange& range,
const T& old_value,
const T& new_value)
315 std::replace(range.begin(), range.end(), old_value, new_value);
321template <
typename ForwardRange,
typename Predicate,
typename T>
inline
322void replace_if_r(ForwardRange& range, Predicate pred,
const T& new_value)
324 std::replace_if(range.begin(), range.end(), pred, new_value);
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)
333 return std::replace(range.begin(), range.end(), result, old_value, new_value);
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)
342 return std::replace_if(range.begin(), range.end(), result, pred, new_value);
348template <
typename ForwardRange,
typename T>
inline
349void fill_r(ForwardRange& range,
const T& value)
351 std::fill(range.begin(), range.end(), value);
357template <
typename ForwardRange,
typename Generator>
inline
360 std::generate(range.begin(), range.end(), gen);
366template <
typename ForwardRange,
typename T>
inline
367typename ForwardRange::iterator
370 return std::remove(range.begin(), range.end(), value);
376template <
typename ForwardRange,
typename Predicate>
inline
377typename ForwardRange::iterator
380 return std::remove_if(range.begin(), range.end(), pred);
386template <
typename InputRange,
typename OutputIterator,
typename T>
inline
387OutputIterator
remove_copy_r(
const InputRange& range, OutputIterator result,
const T& value)
389 return std::remove_copy(range.begin(), range.end(), result, value);
395template <
typename InputRange,
typename OutputIterator,
typename Predicate>
inline
396OutputIterator
remove_copy_if_r(
const InputRange& range, OutputIterator result, Predicate pred)
398 return std::remove_copy_if(range.begin(), range.end(), result, pred);
404template <
typename ForwardRange>
inline
405typename ForwardRange::iterator
408 return std::unique(range.begin(), range.end());
414template <
typename ForwardRange,
typename Predicate>
inline
415typename ForwardRange::iterator
418 return std::unique(range.begin(), range.end(), pred);
424template <
typename InputRange,
typename OutputIterator>
inline
427 return std::unique_copy(range.begin(), range.end(), result);
433template <
typename InputRange,
typename OutputIterator,
typename Predicate>
inline
434OutputIterator
unique_copy_r(
const InputRange& range, OutputIterator result, Predicate pred)
436 return std::unique_copy(range.begin(), range.end(), result, pred);
442template <
typename B
idirectionalRange>
inline
445 std::reverse(range.begin(), range.end());
451template <
typename B
idirectionalRange,
typename OutputIterator>
inline
452OutputIterator
reverse_copy_r(
const BidirectionalRange& range, OutputIterator result)
454 return std::reverse_copy(range.begin(), range.end(), result);
460template <
typename ForwardRange>
inline
461void rotate_r(ForwardRange& range,
typename ForwardRange::iterator middle)
463 return std::rotate(range.begin(), middle, range.end());
469template <
typename ForwardRange,
typename OutputIterator>
inline
470void rotate_copy_r(
const ForwardRange& range,
typename ForwardRange::iterator middle, OutputIterator result)
472 return std::rotate_copy(range.begin(), middle, range.end(), result);
478template <
typename RandomAccessRange,
typename UniformRandomBitGenerator>
inline
479void shuffle_r(RandomAccessRange& range, UniformRandomBitGenerator&& urbg)
481 return std::shuffle(range.begin(), range.end(), std::forward<UniformRandomBitGenerator>(urbg));
487template <
typename B
idirectionalRange,
typename Predicate>
488typename BidirectionalRange::iterator
491 return std::partition(range.begin(), range.end(), pred);
497template <
typename B
idirectionalRange,
typename Predicate>
498typename BidirectionalRange::iterator
501 return std::stable_partition(range.begin(), range.end(), pred);
508#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
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.