8#ifndef INCLUDED_BSLSTL_ALGORITHM
9#define INCLUDED_BSLSTL_ALGORITHM
67#include <bslscm_version.h>
79#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
98 template <
class t_INPUT_ITERATOR,
class t_SIZE,
class t_OUTPUT_ITERATOR>
100 t_OUTPUT_ITERATOR copyNImp(t_INPUT_ITERATOR first,
102 t_OUTPUT_ITERATOR result,
103 const bsl::input_iterator_tag&);
104 template <
class t_RANDOM_ACCESS_ITERATOR,
106 class t_OUTPUT_ITERATOR>
108 t_OUTPUT_ITERATOR copyNImp(t_RANDOM_ACCESS_ITERATOR first,
110 t_OUTPUT_ITERATOR result,
111 const bsl::random_access_iterator_tag&);
119 template <
class CONTAINER,
class PREDICATE>
121 typename CONTAINER::size_type
127 template <
class t_INPUT_ITERATOR,
class t_SIZE,
class t_OUTPUT_ITERATOR>
129 t_OUTPUT_ITERATOR
copyN(t_INPUT_ITERATOR first,
131 t_OUTPUT_ITERATOR result);
140 using std::adjacent_find;
141 using std::binary_search;
143 using std::copy_backward;
146 using std::equal_range;
151 using std::find_first_of;
155 using std::generate_n;
157 using std::inplace_merge;
158 using std::iter_swap;
159 using std::lexicographical_compare;
160 using std::lower_bound;
162 using std::make_heap;
164 using std::max_element;
167 using std::min_element;
169 using std::next_permutation;
170 using std::nth_element;
171 using std::partial_sort;
172 using std::partial_sort_copy;
173 using std::partition;
175 using std::prev_permutation;
176 using std::push_heap;
178 using std::remove_copy;
179 using std::remove_copy_if;
180 using std::remove_if;
182 using std::replace_copy;
183 using std::replace_copy_if;
184 using std::replace_if;
186 using std::reverse_copy;
188 using std::rotate_copy;
191 using std::set_difference;
192 using std::set_intersection;
193 using std::set_symmetric_difference;
194 using std::set_union;
196 using std::sort_heap;
197 using std::stable_partition;
198 using std::stable_sort;
200 using std::swap_ranges;
201 using std::transform;
203 using std::unique_copy;
204 using std::upper_bound;
206#if ! defined BSLS_LIBRARYFEATURES_HAS_CPP17_DEPRECATED_REMOVED
208 using std::random_shuffle;
211#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
217 #define BSLSTL_ALGORITHM_COPY_N_IS_ALIASED
219 using std::find_if_not;
221 using std::is_heap_until;
222 using std::is_partitioned;
223 using std::is_permutation;
224 using std::is_sorted;
225 using std::is_sorted_until;
227 using std::minmax_element;
229 using std::move_backward;
231 using std::partition_copy;
232 using std::partition_point;
241#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
243 using std::for_each_n;
247#ifdef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
248 using std::lexicographical_compare_three_way;
251#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_RANGES
256 using std::ranges::all_of;
257 using std::ranges::any_of;
258 using std::ranges::none_of;
259 using std::ranges::for_each;
260 using std::ranges::for_each_result;
261 using std::ranges::for_each_n;
262 using std::ranges::for_each_n_result;
263 using std::ranges::count;
264 using std::ranges::count_if;
265 using std::ranges::mismatch;
266 using std::ranges::mismatch_result;
267 using std::ranges::equal;
268 using std::ranges::lexicographical_compare;
269 using std::ranges::find;
270 using std::ranges::find_if;
271 using std::ranges::find_if_not;
272 using std::ranges::find_end;
273 using std::ranges::find_first_of;
274 using std::ranges::adjacent_find;
275 using std::ranges::search;
276 using std::ranges::search_n;
280 using std::ranges::copy;
281 using std::ranges::copy_result;
282 using std::ranges::copy_if;
283 using std::ranges::copy_if_result;
284 using std::ranges::copy_n;
285 using std::ranges::copy_n_result;
286 using std::ranges::copy_backward;
287 using std::ranges::copy_backward_result;
288 using std::ranges::move;
289 using std::ranges::move_result;
290 using std::ranges::move_backward;
291 using std::ranges::move_backward_result;
292 using std::ranges::fill;
293 using std::ranges::fill_n;
294 using std::ranges::transform;
295 using std::ranges::unary_transform_result;
296 using std::ranges::binary_transform_result;
297 using std::ranges::generate;
298 using std::ranges::generate_n;
299 using std::ranges::remove;
300 using std::ranges::remove_if;
301 using std::ranges::remove_copy;
302 using std::ranges::remove_copy_result;
303 using std::ranges::remove_copy_if;
304 using std::ranges::remove_copy_if_result;
305 using std::ranges::replace;
306 using std::ranges::replace_if;
307 using std::ranges::replace_copy;
308 using std::ranges::replace_copy_result;
309 using std::ranges::replace_copy_if;
310 using std::ranges::replace_copy_if_result;
311 using std::ranges::swap_ranges;
312 using std::ranges::swap_ranges_result;
313 using std::ranges::reverse;
314 using std::ranges::reverse_copy;
315 using std::ranges::reverse_copy_result;
316 using std::ranges::rotate;
317 using std::ranges::rotate_copy;
318 using std::ranges::rotate_copy_result;
319 using std::ranges::shuffle;
320 using std::ranges::sample;
321 using std::ranges::unique;
322 using std::ranges::unique_copy;
323 using std::ranges::unique_copy_result;
327 using std::ranges::is_partitioned;
328 using std::ranges::partition;
329 using std::ranges::partition_copy;
330 using std::ranges::partition_copy_result;
331 using std::ranges::stable_partition;
332 using std::ranges::partition_point;
336 using std::ranges::is_sorted;
337 using std::ranges::is_sorted_until;
338 using std::ranges::sort;
339 using std::ranges::partial_sort;
340 using std::ranges::partial_sort_copy;
341 using std::ranges::stable_sort;
342 using std::ranges::nth_element;
346 using std::ranges::lower_bound;
347 using std::ranges::upper_bound;
348 using std::ranges::binary_search;
349 using std::ranges::equal_range;
353 using std::ranges::merge;
354 using std::ranges::merge_result;
355 using std::ranges::inplace_merge;
359 using std::ranges::includes;
360 using std::ranges::set_difference;
361 using std::ranges::set_difference_result;
362 using std::ranges::set_intersection;
363 using std::ranges::set_intersection_result;
364 using std::ranges::set_symmetric_difference;
365 using std::ranges::set_symmetric_difference_result;
366 using std::ranges::set_union;
367 using std::ranges::set_union_result;
371 using std::ranges::is_heap;
372 using std::ranges::is_heap_until;
373 using std::ranges::make_heap;
374 using std::ranges::push_heap;
375 using std::ranges::pop_heap;
376 using std::ranges::sort_heap;
380 using std::ranges::max;
381 using std::ranges::max_element;
382 using std::ranges::min;
383 using std::ranges::min_element;
384 using std::ranges::minmax;
385 using std::ranges::minmax_result;
386 using std::ranges::minmax_element;
387 using std::ranges::minmax_element_result;
388 using std::ranges::clamp;
389 using std::ranges::is_permutation;
390 using std::ranges::next_permutation;
391 using std::ranges::next_permutation_result;
392 using std::ranges::prev_permutation;
393 using std::ranges::prev_permutation_result;
397 using std::ranges::in_fun_result;
398 using std::ranges::in_in_result;
399 using std::ranges::in_out_result;
400 using std::ranges::in_in_out_result;
401 using std::ranges::in_out_out_result;
402 using std::ranges::min_max_result;
403 using std::ranges::in_found_result;
407#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_SHIFT
409 using std::ranges::shift_left;
410 using std::ranges::shift_right;
414#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_STARTS_ENDS_WITH
416 using std::ranges::starts_with;
417 using std::ranges::ends_with;
421#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_FIND_LAST
423 using std::ranges::find_last;
424 using std::ranges::find_last_if;
425 using std::ranges::find_last_if_not;
429#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_CONTAINS
431 using std::ranges::contains;
432 using std::ranges::contains_subrange;
436#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_FOLD
438 using std::ranges::fold_left;
439 using std::ranges::fold_left_with_iter;
440 using std::ranges::fold_left_with_iter_result;
441 using std::ranges::fold_left_first;
442 using std::ranges::fold_left_first_with_iter;
443 using std::ranges::fold_left_first_with_iter_result;
444 using std::ranges::fold_right;
445 using std::ranges::fold_right_last;
446 using std::ranges::in_value_result;
450#ifdef BSLS_LIBRARYFEATURES_HAS_CPP23_RANGES_IOTA
452 using std::ranges::out_value_result;
456#ifndef BDE_OMIT_INTERNAL_DEPRECATED
460 using std::bad_alloc;
461 using std::bidirectional_iterator_tag;
462 using std::forward_iterator_tag;
463 using std::input_iterator_tag;
464# ifndef BSLS_PLATFORM_CMP_MSVC
467# ifndef BSLS_LIBRARYFEATURES_STDCPP_LLVM
468 using std::new_handler;
471 using std::nothrow_t;
472 using std::output_iterator_tag;
473 using std::random_access_iterator_tag;
474# ifndef BSLS_LIBRARYFEATURES_STDCPP_LLVM
475 using std::set_new_handler;
479#ifndef BSLSTL_ITERATOR_PROVIDE_SUN_CPP98_FIXES
488 template <
class InputIter,
class TYPE>
489 typename iterator_traits<InputIter>::difference_type
490 count(InputIter first, InputIter last,
const TYPE& value);
495 template <
class InputIter,
class PREDICATE>
496 typename iterator_traits<InputIter>::difference_type
497 count_if(InputIter first, InputIter last, PREDICATE pred);
501#ifndef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
508 template <
class INPUT_ITERATOR,
class PREDICATE>
509 bool all_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred);
517 template <
class INPUT_ITERATOR,
class PREDICATE>
518 bool any_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred);
526 template <
class INPUT_ITERATOR,
class PREDICATE>
527 bool none_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred);
529# if defined(BSLS_LIBRARYFEATURES_STDCPP_MSVC)
536# define BSLSTL_ALGORITHMWORKAROUND_IMPLEMENTS_COPY_IF 1
549 template <
class INPUT_ITERATOR,
class OUTPUT_ITERATOR,
class PREDICATE>
553 OUTPUT_ITERATOR result,
558#ifndef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
561 template<
class TYPE,
class COMPARE>
564 clamp(
const TYPE& value,
const TYPE& low,
const TYPE& high, COMPARE comp);
571 clamp(
const TYPE& value,
const TYPE& low,
const TYPE& high);
574#ifndef BSLS_LIBRARYFEATURES_HAS_CPP17_SEARCH_OVERLOAD
578 template<
class FORWARD_ITERATOR,
class SEARCHER>
580 FORWARD_ITERATOR
search(FORWARD_ITERATOR first,
581 FORWARD_ITERATOR last,
582 const SEARCHER& searcher);
589#ifndef BSLSTL_ALGORITHM_COPY_N_IS_ALIASED
594template <
class t_INPUT_ITERATOR,
class t_SIZE,
class t_OUTPUT_ITERATOR>
596t_OUTPUT_ITERATOR
copy_n(t_INPUT_ITERATOR first,
598 t_OUTPUT_ITERATOR result);
611template <
class t_INPUT_ITERATOR,
class t_SIZE,
class t_OUTPUT_ITERATOR>
613t_OUTPUT_ITERATOR BloombergLP::bslstl::AlgorithmUtil::copyNImp(
614 t_INPUT_ITERATOR first,
616 t_OUTPUT_ITERATOR result,
617 const bsl::input_iterator_tag&)
619 for ( ; count > 0; --count) {
627template <
class t_RANDOM_ACCESS_ITERATOR,
629 class t_OUTPUT_ITERATOR>
631t_OUTPUT_ITERATOR BloombergLP::bslstl::AlgorithmUtil::copyNImp(
632 t_RANDOM_ACCESS_ITERATOR first,
634 t_OUTPUT_ITERATOR result,
635 const bsl::random_access_iterator_tag&)
637 return std::copy(first, first + count, result);
641template <
class CONTAINER,
class PREDICATE>
643typename CONTAINER::size_type
644BloombergLP::bslstl::AlgorithmUtil::containerEraseIf(CONTAINER& container,
647 typename CONTAINER::size_type oldSize = container.size();
648 for (
typename CONTAINER::iterator it = container.begin();
649 it != container.end();) {
650 if (predicate(*it)) {
651 it = container.erase(it);
657 return oldSize - container.size();
660template <
class t_INPUT_ITERATOR,
class t_SIZE,
class t_OUTPUT_ITERATOR>
662t_OUTPUT_ITERATOR BloombergLP::bslstl::AlgorithmUtil::copyN(
663 t_INPUT_ITERATOR first,
665 t_OUTPUT_ITERATOR result)
667 typedef typename bsl::iterator_traits<t_INPUT_ITERATOR>::iterator_category
669 return BloombergLP::bslstl::AlgorithmUtil::copyNImp(first,
675#ifdef BSLSTL_ITERATOR_PROVIDE_SUN_CPP98_FIXES
676template <
class INPUT_ITERATOR,
class TYPE>
678typename bsl::iterator_traits<INPUT_ITERATOR>::difference_type
679bsl::count(INPUT_ITERATOR first, INPUT_ITERATOR last,
const TYPE& value)
681 typename bsl::iterator_traits<INPUT_ITERATOR>::difference_type ret = 0;
682 std::count(first, last, value, ret);
686template <
class INPUT_ITERATOR,
class PREDICATE>
688typename bsl::iterator_traits<INPUT_ITERATOR>::difference_type
689bsl::count_if(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred)
691 typename bsl::iterator_traits<INPUT_ITERATOR>::difference_type ret = 0;
692 std::count_if(first, last, pred, ret);
698#ifndef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
700template <
class INPUT_ITERATOR,
class PREDICATE>
701bool bsl::all_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred)
703 for (; first != last; ++first) {
711template <
class INPUT_ITERATOR,
class PREDICATE>
712bool bsl::any_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred)
714 for (; first != last; ++first) {
722template <
class INPUT_ITERATOR,
class PREDICATE>
723bool bsl::none_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred)
725 for (; first != last; ++first) {
733# ifdef BSLSTL_ALGORITHMWORKAROUND_IMPLEMENTS_COPY_IF
734template <
class INPUT_ITERATOR,
class OUTPUT_ITERATOR,
class PREDICATE>
735inline OUTPUT_ITERATOR
738 OUTPUT_ITERATOR result,
741 while(first != last) {
754#ifndef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
755template<
class TYPE,
class COMPARE>
758bsl::clamp(
const TYPE& value,
const TYPE& low,
const TYPE& high, COMPARE comp)
761 return comp(value, low) ? low : comp(high, value) ? high : value;
767bsl::clamp(
const TYPE& value,
const TYPE& low,
const TYPE& high)
769 return bsl::clamp(value, low, high, std::less<TYPE>());
774#ifndef BSLS_LIBRARYFEATURES_HAS_CPP17_SEARCH_OVERLOAD
775template<
class FORWARD_ITERATOR,
class SEARCHER>
779 FORWARD_ITERATOR last,
780 const SEARCHER& searcher)
787#ifndef BSLSTL_ALGORITHM_COPY_N_IS_ALIASED
788template <
class t_INPUT_ITERATOR,
class t_SIZE,
class t_OUTPUT_ITERATOR>
790t_OUTPUT_ITERATOR
bsl::copy_n(t_INPUT_ITERATOR first,
792 t_OUTPUT_ITERATOR result)
794 return BloombergLP::bslstl::AlgorithmUtil::copyN(first,
Definition bslstl_pair.h:1280
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_CONSTEXPR_CPP14
Definition bsls_keyword.h:631
Definition bdlat_valuetypefunctions.h:939
BSLS_KEYWORD_CONSTEXPR_CPP14 const TYPE & clamp(const TYPE &value, const TYPE &low, const TYPE &high, COMPARE comp)
BSLS_KEYWORD_CONSTEXPR_CPP14 FORWARD_ITERATOR search(FORWARD_ITERATOR first, FORWARD_ITERATOR last, const SEARCHER &searcher)
bool all_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred)
bool any_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred)
OUTPUT_ITERATOR copy_if(INPUT_ITERATOR first, INPUT_ITERATOR last, OUTPUT_ITERATOR result, PREDICATE pred)
t_OUTPUT_ITERATOR copy_n(t_INPUT_ITERATOR first, t_SIZE count, t_OUTPUT_ITERATOR result)
bool none_of(INPUT_ITERATOR first, INPUT_ITERATOR last, PREDICATE pred)
Definition bslstl_algorithm.h:84
TYPE first
Definition bslstl_pair.h:587
Definition bslstl_algorithm.h:90
static CONTAINER::size_type containerEraseIf(CONTAINER &container, PREDICATE predicate)
static t_OUTPUT_ITERATOR copyN(t_INPUT_ITERATOR first, t_SIZE count, t_OUTPUT_ITERATOR result)