33#ifndef ETL_ALGORITHM_INCLUDED
34#define ETL_ALGORITHM_INCLUDED
67 template <
typename TIterator>
68#if ETL_USING_STD_NAMESPACE
73 void shell_sort(TIterator first, TIterator last);
75 template <
typename TIterator,
typename TCompare>
76#if ETL_USING_STD_NAMESPACE
83 template <
typename TIterator>
84 ETL_CONSTEXPR14
void insertion_sort(TIterator first, TIterator last);
86 template <
typename TIterator,
typename TCompare>
93 algorithm_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
94 :
exception(reason_, file_name_, line_number_)
99 class algorithm_error :
public algorithm_exception
103 algorithm_error(string_type file_name_, numeric_type line_number_)
104 : algorithm_exception(ETL_ERROR_TEXT(
"algorithm:error", ETL_ALGORITHM_FILE_ID
"A"), file_name_, line_number_)
116 namespace private_algorithm
118 template <
bool use_swap>
125 template <
typename TIterator1,
typename TIterator2>
126 static void do_swap(TIterator1 a, TIterator2 b)
128 typename etl::iterator_traits<TIterator1>::value_type tmp = *a;
138 template <
typename TIterator1,
typename TIterator2>
139 static void do_swap(TIterator1 a, TIterator2 b)
141 using ETL_OR_STD::swap;
150 template <
typename TIterator1,
typename TIterator2>
151#if ETL_USING_STD_NAMESPACE
156 void iter_swap(TIterator1 a, TIterator2 b)
161 typedef typename traits1::value_type v1;
162 typedef typename traits2::value_type v2;
164 typedef typename traits1::reference r1;
165 typedef typename traits2::reference r2;
177 template <
typename TIterator1,
typename TIterator2>
178#if ETL_USING_STD_NAMESPACE
183 TIterator2 swap_ranges(TIterator1 first1,
187 while (first1 != last1)
189 iter_swap(first1, first2);
199 template <
typename TIterator,
typename TFunction>
201 void generate(TIterator db, TIterator de, TFunction funct)
211#if ETL_USING_STL && ETL_USING_CPP20
213 template <
typename TIterator1,
typename TIterator2>
214 constexpr TIterator2 copy(TIterator1 sb, TIterator1 se, TIterator2 db)
216 return std::copy(sb, se, db);
220 template <
typename TIterator1,
typename TIterator2>
221 ETL_CONSTEXPR14 TIterator2 copy(TIterator1 sb, TIterator1 se, TIterator2 db)
236#if ETL_USING_STL && ETL_USING_CPP20
237 template <
typename TIterator1,
typename TIterator2>
238 constexpr TIterator2 reverse_copy(TIterator1 sb, TIterator1 se, TIterator2 db)
240 return std::reverse_copy(sb, se, db);
243 template <
typename TIterator1,
typename TIterator2>
245 TIterator2 reverse_copy(TIterator1 sb, TIterator1 se, TIterator2 db)
259#if ETL_USING_STL && ETL_USING_CPP20
261 template <
typename TIterator1,
typename TSize,
typename TIterator2>
262 constexpr TIterator2 copy_n(TIterator1 sb, TSize count, TIterator2 db)
264 return std::copy_n(sb, count, db);
268 template <
typename TIterator1,
typename TSize,
typename TIterator2>
269 ETL_CONSTEXPR14 TIterator2 copy_n(TIterator1 sb, TSize count, TIterator2 db)
285#if ETL_USING_STL && ETL_USING_CPP20
286 template <
typename TIterator1,
typename TIterator2>
287 constexpr TIterator2 copy_backward(TIterator1 sb, TIterator1 se, TIterator2 de)
289 return std::copy_backward(sb, se, de);
292 template <
typename TIterator1,
typename TIterator2>
293 ETL_CONSTEXPR14 TIterator2 copy_backward(TIterator1 sb, TIterator1 se, TIterator2 de)
306#if ETL_USING_STL && ETL_USING_CPP20
307 template <
typename TIterator1,
typename TIterator2>
308 constexpr TIterator2 move(TIterator1 sb, TIterator1 se, TIterator2 db)
310 return std::move(sb, se, db);
314 template <
typename TIterator1,
typename TIterator2>
315 ETL_CONSTEXPR14 TIterator2 move(TIterator1 sb, TIterator1 se, TIterator2 db)
319 *db = etl::move(*sb);
328 template <
typename TIterator1,
typename TIterator2>
329 ETL_CONSTEXPR14 TIterator2 move(TIterator1 sb, TIterator1 se, TIterator2 db)
331 return copy(sb, se, db);
337#if ETL_USING_STL && ETL_USING_CPP20
338 template <
typename TIterator1,
typename TIterator2>
339 ETL_CONSTEXPR20 TIterator2 move_backward(TIterator1 sb, TIterator1 se, TIterator2 de)
341 return std::move_backward(sb, se, de);
345 template <
typename TIterator1,
typename TIterator2>
346 ETL_CONSTEXPR14 TIterator2 move_backward(TIterator1 sb, TIterator1 se, TIterator2 de)
350 *(--de) = etl::move(*(--se));
357 template <
typename TIterator1,
typename TIterator2>
358 ETL_CONSTEXPR14 TIterator2 move_backward(TIterator1 sb, TIterator1 se, TIterator2 de)
360 return etl::copy_backward(sb, se, de);
368 template <
typename TIterator>
370 typename etl::enable_if<etl::is_pointer<TIterator>::value,
void>::type
371 reverse(TIterator b, TIterator e)
377 etl::iter_swap(b, e);
384 template <
typename TIterator>
386 typename etl::enable_if<!etl::is_pointer<TIterator>::value,
void>::type
387 reverse(TIterator b, TIterator e)
389 while ((b != e) && (b != --e))
391 etl::iter_swap(b++, e);
398 template<
typename TIterator,
typename TValue,
typename TCompare>
401 TIterator lower_bound(TIterator first, TIterator last,
const TValue& value, TCompare
compare)
403 typedef typename etl::iterator_traits<TIterator>::difference_type difference_t;
405 difference_t count = etl::distance(first, last);
409 TIterator itr = first;
410 difference_t step = count / 2;
412 etl::advance(itr, step);
428 template<
typename TIterator,
typename TValue>
431 TIterator lower_bound(TIterator first, TIterator last,
const TValue& value)
433 typedef etl::less<typename etl::iterator_traits<TIterator>::value_type>
compare;
435 return etl::lower_bound(first, last, value,
compare());
441 template<
typename TIterator,
typename TValue,
typename TCompare>
444 TIterator upper_bound(TIterator first, TIterator last,
const TValue& value, TCompare
compare)
446 typedef typename etl::iterator_traits<TIterator>::difference_type difference_t;
448 difference_t count = etl::distance(first, last);
452 TIterator itr = first;
453 difference_t step = count / 2;
455 etl::advance(itr, step);
471 template<
typename TIterator,
typename TValue>
474 TIterator upper_bound(TIterator first, TIterator last,
const TValue& value)
476 typedef etl::less<typename etl::iterator_traits<TIterator>::value_type>
compare;
478 return etl::upper_bound(first, last, value,
compare());
484 template<
typename TIterator,
typename TValue,
typename TCompare>
487 ETL_OR_STD::pair<TIterator, TIterator> equal_range(TIterator first, TIterator last,
const TValue& value, TCompare
compare)
489 return ETL_OR_STD::make_pair(etl::lower_bound(first, last, value,
compare),
490 etl::upper_bound(first, last, value,
compare));
493 template<
typename TIterator,
typename TValue>
495 ETL_OR_STD::pair<TIterator, TIterator> equal_range(TIterator first, TIterator last,
const TValue& value)
497 typedef etl::less<typename etl::iterator_traits<TIterator>::value_type>
compare;
499 return ETL_OR_STD::make_pair(etl::lower_bound(first, last, value,
compare()),
500 etl::upper_bound(first, last, value,
compare()));
506 template <
typename TIterator,
typename T,
typename Compare>
508 bool binary_search(TIterator first, TIterator last,
const T& value, Compare
compare)
510 first = etl::lower_bound(first, last, value,
compare);
512 return (!(first == last) && !(
compare(value, *first)));
515 template <
typename TIterator,
typename T>
517 bool binary_search(TIterator first, TIterator last,
const T& value)
519 typedef etl::less<typename etl::iterator_traits<TIterator>::value_type>
compare;
521 return binary_search(first, last, value,
compare());
527 template <
typename TIterator,
typename TUnaryPredicate>
530 TIterator find_if(TIterator first, TIterator last, TUnaryPredicate predicate)
532 while (first != last)
534 if (predicate(*first))
548 template <
typename TIterator,
typename T>
551 TIterator find(TIterator first, TIterator last,
const T& value)
553 while (first != last)
568#if ETL_USING_STL && ETL_USING_CPP20
569 template<
typename TIterator,
typename TValue>
570 constexpr void fill(TIterator first, TIterator last,
const TValue& value)
572 std::fill(first, last, value);
575 template<
typename TIterator,
typename TValue>
576 ETL_CONSTEXPR14
void fill(TIterator first, TIterator last,
const TValue& value)
578 while (first != last)
588#if ETL_USING_STL && ETL_USING_CPP20
589 template<
typename TIterator,
typename TSize,
typename TValue>
590 constexpr TIterator fill_n(TIterator first, TSize count,
const TValue& value)
592 return std::fill_n(first, count, value);
595 template<
typename TIterator,
typename TSize,
typename TValue>
596 ETL_CONSTEXPR14 TIterator fill_n(TIterator first, TSize count,
const TValue& value)
611 template <
typename TIterator,
typename T>
614 typename etl::iterator_traits<TIterator>::difference_type count(TIterator first, TIterator last,
const T& value)
616 typename iterator_traits<TIterator>::difference_type n = 0;
618 while (first != last)
634 template <
typename TIterator,
typename TUnaryPredicate>
637 typename etl::iterator_traits<TIterator>::difference_type
638 count_if(TIterator first, TIterator last, TUnaryPredicate predicate)
640 typename iterator_traits<TIterator>::difference_type n = 0;
642 while (first != last)
644 if (predicate(*first))
657#if ETL_USING_STL && ETL_USING_CPP20
659 template <
typename TIterator1,
typename TIterator2>
662 bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2)
664 return std::equal(first1, last1, first2);
668 template <
typename TIterator1,
typename TIterator2,
typename TPredicate>
671 bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TPredicate predicate)
673 return std::equal(first1, last1, first2, predicate);
677 template <
typename TIterator1,
typename TIterator2>
680 bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2)
682 return std::equal(first1, last1, first2, last2);
686 template <
typename TIterator1,
typename TIterator2,
typename TPredicate>
689 bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2, TPredicate predicate)
691 return std::equal(first1, last1, first2, last2, predicate);
696 template <
typename TIterator1,
typename TIterator2>
699 bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2)
701 while (first1 != last1)
703 if (*first1 != *first2)
716 template <
typename TIterator1,
typename TIterator2,
typename TPredicate>
719 bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TPredicate predicate)
721 while (first1 != last1)
723 if (!predicate(*first1, *first2))
736 template <
typename TIterator1,
typename TIterator2>
739 bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2)
741 while ((first1 != last1) && (first2 != last2))
743 if (*first1 != *first2)
752 return (first1 == last1) && (first2 == last2);
756 template <
typename TIterator1,
typename TIterator2,
typename TPredicate>
759 bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2, TPredicate predicate)
761 while ((first1 != last1) && (first2 != last2))
763 if (!predicate(*first1 , *first2))
772 return (first1 == last1) && (first2 == last2);
779 template <
typename TIterator1,
typename TIterator2,
typename TCompare>
782 bool lexicographical_compare(TIterator1 first1, TIterator1 last1,
783 TIterator2 first2, TIterator2 last2,
786 while ((first1 != last1) && (first2 != last2))
802 return (first1 == last1) && (first2 != last2);
806 template <
typename TIterator1,
typename TIterator2>
809 bool lexicographical_compare(TIterator1 first1, TIterator1 last1,
810 TIterator2 first2, TIterator2 last2)
812 typedef etl::less<typename etl::iterator_traits<TIterator1>::value_type>
compare;
814 return etl::lexicographical_compare(first1, last1, first2, last2,
compare());
820 template <
typename T,
typename TCompare>
823 const T& min(
const T& a,
const T& b, TCompare
compare)
825 return (
compare(a, b)) ? a : b;
828 template <
typename T>
831 const T& min(
const T& a,
const T& b)
835 return etl::min(a, b,
compare());
841 template <
typename T,
typename TCompare>
844 const T& max(
const T& a,
const T& b, TCompare
compare)
846 return (
compare(a, b)) ? b : a;
849 template <
typename T>
852 const T& max(
const T& a,
const T& b)
856 return etl::max(a, b,
compare());
862 template <
typename TIterator,
typename TUnaryOperation>
864 TUnaryOperation for_each(TIterator first, TIterator last, TUnaryOperation unary_operation)
866 while (first != last)
868 unary_operation(*first);
872 return unary_operation;
878 template <
typename TIteratorIn,
typename TIteratorOut,
typename TUnaryOperation>
880 TIteratorOut transform(TIteratorIn first1, TIteratorIn last1, TIteratorOut d_first, TUnaryOperation unary_operation)
882 while (first1 != last1)
884 *d_first = unary_operation(*first1);
893 template <
typename TIteratorIn1,
typename TIteratorIn2,
typename TIteratorOut,
typename TBinaryOperation>
895 TIteratorOut transform(TIteratorIn1 first1, TIteratorIn1 last1, TIteratorIn2 first2, TIteratorOut d_first, TBinaryOperation binary_operation)
897 while (first1 != last1)
899 *d_first = binary_operation(*first1, *first2);
912 template <
typename TIterator,
typename T>
913 ETL_CONSTEXPR14
void replace(TIterator first, TIterator last,
const T& old_value,
const T& new_value)
915 while (first != last)
917 if (*first == old_value)
929 template <
typename TIterator,
typename TPredicate,
typename T>
930 ETL_CONSTEXPR14
void replace_if(TIterator first, TIterator last, TPredicate predicate,
const T& new_value)
932 while (first != last)
934 if (predicate(*first))
946 namespace private_heap
949 template <
typename TIterator,
typename TDistance,
typename TValue,
typename TCompare>
950 void push_heap(TIterator first, TDistance value_index, TDistance top_index, TValue value, TCompare compare)
952 TDistance parent = (value_index - 1) / 2;
954 while ((value_index > top_index) && compare(first[parent], value))
956 first[value_index] = ETL_MOVE(first[parent]);
957 value_index = parent;
958 parent = (value_index - 1) / 2;
961 first[value_index] = ETL_MOVE(value);
965 template <
typename TIterator,
typename TDistance,
typename TValue,
typename TCompare>
966 void adjust_heap(TIterator first, TDistance value_index, TDistance length, TValue value, TCompare compare)
968 TDistance top_index = value_index;
969 TDistance child2nd = (2 * value_index) + 2;
971 while (child2nd < length)
973 if (compare(first[child2nd], first[child2nd - 1]))
978 first[value_index] = ETL_MOVE(first[child2nd]);
979 value_index = child2nd;
980 child2nd = 2 * (child2nd + 1);
983 if (child2nd == length)
985 first[value_index] = ETL_MOVE(first[child2nd - 1]);
986 value_index = child2nd - 1;
989 push_heap(first, value_index, top_index, ETL_MOVE(value), compare);
993 template <
typename TIterator,
typename TDistance,
typename TCompare>
994 bool is_heap(
const TIterator first,
const TDistance n, TCompare compare)
996 TDistance parent = 0;
998 for (TDistance child = 1; child < n; ++child)
1000 if (compare(first[parent], first[child]))
1005 if ((child & 1) == 0)
1016 template <
typename TIterator,
typename TCompare>
1017 void pop_heap(TIterator first, TIterator last, TCompare
compare)
1019 typedef typename etl::iterator_traits<TIterator>::value_type value_t;
1020 typedef typename etl::iterator_traits<TIterator>::difference_type distance_t;
1022 value_t value = ETL_MOVE(last[-1]);
1023 last[-1] = ETL_MOVE(first[0]);
1025 private_heap::adjust_heap(first, distance_t(0), distance_t(last - first - 1), ETL_MOVE(value),
compare);
1029 template <
typename TIterator>
1030 void pop_heap(TIterator first, TIterator last)
1032 typedef etl::less<typename etl::iterator_traits<TIterator>::value_type>
compare;
1034 etl::pop_heap(first, last,
compare());
1038 template <
typename TIterator,
typename TCompare>
1039 void push_heap(TIterator first, TIterator last, TCompare
compare)
1041 typedef typename etl::iterator_traits<TIterator>::difference_type difference_t;
1042 typedef typename etl::iterator_traits<TIterator>::value_type value_t;
1044 private_heap::push_heap(first, difference_t(last - first - 1), difference_t(0), value_t(ETL_MOVE(*(last - 1))),
compare);
1048 template <
typename TIterator>
1049 void push_heap(TIterator first, TIterator last)
1051 typedef etl::less<typename etl::iterator_traits<TIterator>::value_type>
compare;
1053 etl::push_heap(first, last,
compare());
1057 template <
typename TIterator,
typename TCompare>
1058 void make_heap(TIterator first, TIterator last, TCompare
compare)
1060 typedef typename etl::iterator_traits<TIterator>::difference_type difference_t;
1062 if ((last - first) < 2)
1067 difference_t length = last - first;
1068 difference_t parent = (length - 2) / 2;
1072 private_heap::adjust_heap(first, parent, length, ETL_MOVE(*(first + parent)),
compare);
1084 template <
typename TIterator>
1085 void make_heap(TIterator first, TIterator last)
1087 typedef etl::less<typename etl::iterator_traits<TIterator>::value_type>
compare;
1089 etl::make_heap(first, last,
compare());
1093 template <
typename TIterator>
1095 bool is_heap(TIterator first, TIterator last)
1097 typedef etl::less<typename etl::iterator_traits<TIterator>::value_type>
compare;
1099 return private_heap::is_heap(first, last - first,
compare());
1103 template <
typename TIterator,
typename TCompare>
1105 bool is_heap(TIterator first, TIterator last, TCompare
compare)
1107 return private_heap::is_heap(first, last - first,
compare);
1111 template <
typename TIterator>
1112 void sort_heap(TIterator first, TIterator last)
1114 while (first != last)
1116 etl::pop_heap(first, last);
1122 template <
typename TIterator,
typename TCompare>
1123 void sort_heap(TIterator first, TIterator last, TCompare
compare)
1125 while (first != last)
1127 etl::pop_heap(first, last,
compare);
1135 template<
typename TIterator1,
typename TIterator2,
typename TCompare>
1138 TIterator1 search(TIterator1 first, TIterator1 last, TIterator2 search_first, TIterator2 search_last, TCompare
compare)
1142 TIterator1 itr = first;
1143 TIterator2 search_itr = search_first;
1147 if (search_itr == search_last)
1157 if (!
compare(*itr, *search_itr))
1171 template<
typename TIterator1,
typename TIterator2>
1174 TIterator1 search(TIterator1 first, TIterator1 last, TIterator2 search_first, TIterator2 search_last)
1176 typedef etl::equal_to<typename etl::iterator_traits<TIterator1>::value_type>
compare;
1178 return etl::search(first, last, search_first, search_last,
compare());
1184 namespace private_algorithm
1189 template <
typename TIterator>
1191 typename etl::enable_if<etl::is_random_access_iterator<TIterator>::value, TIterator>::type
1192 rotate_general(TIterator first, TIterator middle, TIterator last)
1194 if (first == middle || middle == last)
1199 typedef typename etl::iterator_traits<TIterator>::value_type value_type;
1201 int n = last - first;
1202 int m = middle - first;
1203 int gcd_nm = (n == 0 || m == 0) ? n + m : etl::gcd(n, m);
1205 TIterator result = first + (last - middle);
1207 for (
int i = 0; i < gcd_nm; i++)
1209 value_type temp = ETL_MOVE(*(first + i));
1226 *(first + j) = ETL_MOVE(*(first + k));
1230 *(first + j) = ETL_MOVE(temp);
1238 template <
typename TIterator>
1240 typename etl::enable_if<etl::is_random_access_iterator<TIterator>::value, TIterator>::type
1241 rotate_general(TIterator first, TIterator middle, TIterator last)
1243 if (first == middle || middle == last)
1248 typedef typename etl::iterator_traits<TIterator>::value_type value_type;
1250 int n = last - first;
1251 int m = middle - first;
1252 int gcd_nm = (n == 0 || m == 0) ? n + m : etl::gcd(n, m);
1254 TIterator result = first + (last - middle);
1256 for (
int i = 0; i < gcd_nm; i++)
1258 value_type temp = *(first + i);
1275 *(first + j) = *(first + k);
1279 *(first + j) = temp;
1288 template <
typename TIterator>
1290 typename etl::enable_if<etl::is_bidirectional_iterator<TIterator>::value, TIterator>::type
1291 rotate_general(TIterator first, TIterator middle, TIterator last)
1293 if (first == middle || middle == last)
1298 TIterator result = first;
1299 etl::advance(result, etl::distance(middle, last));
1301 reverse(first, middle);
1302 reverse(middle, last);
1303 reverse(first, last);
1310 template <
typename TIterator>
1312 typename etl::enable_if<etl::is_forward_iterator<TIterator>::value, TIterator>::type
1313 rotate_general(TIterator first, TIterator middle, TIterator last)
1315 if (first == middle || middle == last)
1320 TIterator next = middle;
1321 TIterator result = first;
1322 etl::advance(result, etl::distance(middle, last));
1324 while (first != next)
1326 using ETL_OR_STD::swap;
1327 swap(*first++, *next++);
1333 else if (first == middle)
1344 template <
typename TIterator>
1346 TIterator rotate_left_by_one(TIterator first, TIterator last)
1348 typedef typename etl::iterator_traits<TIterator>::value_type value_type;
1351 value_type temp(ETL_MOVE(*first));
1354 TIterator result = etl::move(etl::next(first), last, first);
1357 *result = ETL_MOVE(temp);
1365 template <
typename TIterator>
1367 TIterator rotate_right_by_one(TIterator first, TIterator last)
1369 typedef typename etl::iterator_traits<TIterator>::value_type value_type;
1372 TIterator previous = etl::prev(last);
1373 value_type temp(ETL_MOVE(*previous));
1376 TIterator result = etl::move_backward(first, previous, last);
1379 *first = ETL_MOVE(temp);
1387 template<
typename TIterator>
1389 TIterator rotate(TIterator first, TIterator middle, TIterator last)
1391 if (etl::next(first) == middle)
1393 return private_algorithm::rotate_left_by_one(first, last);
1396 if (etl::next(middle) == last)
1399 if ETL_IF_CONSTEXPR(etl::is_forward_iterator<TIterator>::value)
1401 return private_algorithm::rotate_general(first, middle, last);
1405 return private_algorithm::rotate_right_by_one(first, last);
1408 return private_algorithm::rotate_general(first, middle, last);
1412 return private_algorithm::rotate_general(first, middle, last);
1419 template <
typename TIterator1,
typename TIterator2,
typename TPredicate>
1422 TIterator1 find_end(TIterator1 b, TIterator1 e,
1423 TIterator2 sb, TIterator2 se,
1424 TPredicate predicate)
1431 TIterator1 result = e;
1435 TIterator1 new_result = etl::search(b, e, sb, se, predicate);
1437 if (new_result == e)
1443 result = new_result;
1452 template <
typename TIterator1,
typename TIterator2>
1455 TIterator1 find_end(TIterator1 b, TIterator1 e,
1456 TIterator2 sb, TIterator2 se)
1458 typedef etl::equal_to<typename etl::iterator_traits<TIterator1>::value_type> predicate;
1460 return find_end(b, e, sb, se, predicate());
1468 template <
typename TIterator,
typename TCompare>
1475 TIterator minimum =
begin;
1500 template <
typename TIterator>
1506 typedef typename etl::iterator_traits<TIterator>::value_type value_t;
1516 template <
typename TIterator,
typename TCompare>
1523 TIterator maximum =
begin;
1548 template <
typename TIterator>
1554 typedef typename etl::iterator_traits<TIterator>::value_type value_t;
1564 template <
typename TIterator,
typename TCompare>
1571 TIterator minimum =
begin;
1572 TIterator maximum =
begin;
1594 return ETL_OR_STD::pair<TIterator, TIterator>(minimum, maximum);
1602 template <
typename TIterator>
1608 typedef typename etl::iterator_traits<TIterator>::value_type value_t;
1618 template <
typename T>
1621 ETL_OR_STD::pair<const T&, const T&>
minmax(
const T& a,
1624 return (b < a) ? ETL_OR_STD::pair<const T&, const T&>(b, a) : ETL_OR_STD::pair<const T&, const T&>(a, b);
1632 template <
typename T,
typename TCompare>
1635 ETL_OR_STD::pair<const T&, const T&>
minmax(
const T& a,
1639 return compare(b, a) ? ETL_OR_STD::pair<const T&, const T&>(b, a) : ETL_OR_STD::pair<const T&, const T&>(a, b);
1647 template <
typename TIterator>
1655 TIterator next =
begin;
1657 while (++next !=
end)
1676 template <
typename TIterator,
typename TCompare>
1685 TIterator next =
begin;
1687 while (++next !=
end)
1706 template<
typename TIterator>
1720 template<
typename TIterator,
typename TCompare>
1734 template <
typename TIterator,
typename TCompare>
1743 TIterator next =
begin;
1745 while (++next !=
end)
1763 template <
typename TIterator>
1771 TIterator next =
begin;
1773 while (++next !=
end)
1775 if (!(*
begin < *next))
1791 template<
typename TIterator>
1804 template<
typename TIterator,
typename TCompare>
1819 template <
typename TIterator,
typename TUnaryPredicate>
1824 TUnaryPredicate predicate)
1828 if (!predicate(*
begin))
1844 template <
typename TIterator1,
typename TIterator2>
1853 TIterator2 end2 = begin2;
1855 etl::advance(end2, etl::distance(begin1, end1));
1857 for (TIterator1 i = begin1; i != end1; ++i)
1859 if (i == etl::find(begin1, i, *i))
1861 size_t n = etl::count(begin2, end2, *i);
1863 if (n == 0 ||
size_t(etl::count(i, end1, *i)) != n)
1879 template <
typename TIterator1,
typename TIterator2,
typename TBinaryPredicate>
1885 TBinaryPredicate predicate)
1889 TIterator2 end2 = begin2;
1891 etl::advance(end2, etl::distance(begin1, end1));
1893 for (TIterator1 i = begin1; i != end1; ++i)
1895 if (i == etl::find_if(begin1, i, etl::bind1st(predicate, *i)))
1897 size_t n = etl::count(begin2, end2, *i);
1899 if (n == 0 ||
size_t(etl::count(i, end1, *i)) != n)
1915 template <
typename TIterator1,
typename TIterator2>
1925 for (TIterator1 i = begin1; i != end1; ++i)
1927 if (i == etl::find(begin1, i, *i))
1929 size_t n = etl::count(begin2, end2, *i);
1931 if (n == 0 ||
size_t(etl::count(i, end1, *i)) != n)
1947 template <
typename TIterator1,
typename TIterator2,
typename TBinaryPredicate>
1953 TBinaryPredicate predicate)
1957 for (TIterator1 i = begin1; i != end1; ++i)
1959 if (i == etl::find_if(begin1, i, etl::bind1st(predicate, *i)))
1961 size_t n = etl::count(begin2, end2, *i);
1963 if (n == 0 ||
size_t(etl::count(i, end1, *i)) != n)
1979 template <
typename TIterator,
typename TUnaryPredicate>
1984 TUnaryPredicate predicate)
1988 if (!predicate(*
begin))
1998 if (predicate(*
begin))
2014 template <
typename TIterator,
typename TUnaryPredicate>
2019 TUnaryPredicate predicate)
2023 if (!predicate(*
begin))
2040 template <
typename TSource,
typename TDestinationTrue,
typename TDestinationFalse,
typename TUnaryPredicate>
2044 TDestinationTrue destination_true,
2045 TDestinationFalse destination_false,
2046 TUnaryPredicate predicate)
2050 if (predicate(*
begin))
2052 *destination_true = *
begin;
2057 *destination_false = *
begin;
2058 ++destination_false;
2064 return ETL_OR_STD::pair<TDestinationTrue, TDestinationFalse>(destination_true, destination_false);
2072 template <
typename TIterator,
typename TOutputIterator,
typename TUnaryPredicate>
2076 TOutputIterator out,
2077 TUnaryPredicate predicate)
2081 if (predicate(*
begin))
2098 template <
typename TIterator,
typename TUnaryPredicate>
2103 TUnaryPredicate predicate)
2113 template <
typename TIterator,
typename TUnaryPredicate>
2118 TUnaryPredicate predicate)
2120 return etl::find_if(
begin,
end, predicate) !=
end;
2128 template <
typename TIterator,
typename TUnaryPredicate>
2133 TUnaryPredicate predicate)
2135 return etl::find_if(
begin,
end, predicate) ==
end;
2138#if ETL_NOT_USING_STL
2144 template <
typename TIterator,
typename TCompare>
2145 void sort(TIterator first, TIterator last, TCompare compare)
2154 template <
typename TIterator>
2155 void sort(TIterator first, TIterator last)
2157 etl::shell_sort(first, last, etl::less<
typename etl::iterator_traits<TIterator>::value_type>());
2166 template <
typename TIterator,
typename TCompare>
2177 template <
typename TIterator>
2180 etl::insertion_sort(first, last, etl::less<
typename etl::iterator_traits<TIterator>::value_type>());
2188 template <
typename TIterator,
typename TCompare>
2191 std::sort(first, last,
compare);
2198 template <
typename TIterator>
2199 void sort(TIterator first, TIterator last)
2201 std::sort(first, last);
2210 template <
typename TIterator,
typename TCompare>
2213 std::stable_sort(first, last,
compare);
2221 template <
typename TIterator>
2224 std::stable_sort(first, last);
2232 template <
typename TIterator,
typename T>
2236 while (first != last)
2238 sum = ETL_MOVE(sum) + *first;
2249 template <
typename TIterator,
typename T,
typename TBinaryOperation>
2251 T
accumulate(TIterator first, TIterator last, T sum, TBinaryOperation operation)
2253 while (first != last)
2255 sum = operation(ETL_MOVE(sum), *first);
2266 template<
typename T,
typename TCompare>
2270 return compare(value, low) ? low :
compare(high, value) ? high : value;
2273 template <
typename T>
2275 T
clamp(
const T& value,
const T& low,
const T& high)
2280 template<
typename T, T Low, T High,
typename TCompare>
2284 return compare(value, Low) ? Low :
compare(High, value) ? High : value;
2287 template <
typename T, T Low, T High>
2289 T
clamp(
const T& value)
2298 template <
typename TIterator,
typename T>
2300 TIterator
remove(TIterator first, TIterator last,
const T& value)
2302 first = etl::find(first, last, value);
2306 TIterator itr = first;
2308 while (++itr != last)
2310 if (!(*itr == value))
2312 *first++ = ETL_MOVE(*itr);
2324 template <
typename TIterator,
typename TUnaryPredicate>
2326 TIterator
remove_if(TIterator first, TIterator last, TUnaryPredicate predicate)
2328 first = etl::find_if(first, last, predicate);
2332 TIterator itr = first;
2334 while (++itr != last)
2336 if (!predicate(*itr))
2338 *first++ = ETL_MOVE(*itr);
2363 template <
typename TInputIterator,
2364 typename TOutputIterator>
2366 typename etl::enable_if<etl::is_random_iterator<TInputIterator>::value &&
2367 etl::is_random_iterator<TOutputIterator>::value, TOutputIterator>::type
2369 TInputIterator i_end,
2370 TOutputIterator o_begin,
2371 TOutputIterator o_end)
2373 typedef typename iterator_traits<TInputIterator>::difference_type s_size_type;
2374 typedef typename iterator_traits<TOutputIterator>::difference_type d_size_type;
2377 typedef typename etl::common_type<s_size_type, d_size_type>::type min_size_type;
2379 typedef typename etl::largest_type<s_size_type, d_size_type>::type min_size_type;
2382 s_size_type s_size = etl::distance(i_begin, i_end);
2383 d_size_type d_size = etl::distance(o_begin, o_end);
2384 min_size_type min_size = etl::min<min_size_type>(s_size, d_size);
2386 return etl::copy(i_begin, i_begin + min_size, o_begin);
2400 template <
typename TInputIterator,
2401 typename TOutputIterator>
2404 !etl::is_random_iterator<TOutputIterator>::value, TOutputIterator>::type
2406 TInputIterator i_end,
2407 TOutputIterator o_begin,
2408 TOutputIterator o_end)
2410 while ((i_begin != i_end) && (o_begin != o_end))
2412 *o_begin = *i_begin;
2425 template <
typename TInputIterator,
2427 typename TOutputIterator>
2431 TOutputIterator o_begin,
2432 TOutputIterator o_end)
2434 while ((n-- > 0) && (o_begin != o_end))
2436 *o_begin = *i_begin;
2449 template <
typename TInputIterator,
2451 typename TOutputIterator,
2456 TOutputIterator o_begin,
2459 while ((n1-- > 0) && (n2-- > 0))
2461 *o_begin = *i_begin;
2475 template <
typename TInputIterator,
2476 typename TOutputIterator,
2477 typename TUnaryPredicate>
2480 TInputIterator i_end,
2481 TOutputIterator o_begin,
2482 TOutputIterator o_end,
2483 TUnaryPredicate predicate)
2485 while ((i_begin != i_end) && (o_begin != o_end))
2487 if (predicate(*i_begin))
2489 *o_begin = *i_begin;
2504 template <
typename TInputIterator,
2506 typename TOutputIterator,
2507 typename TUnaryPredicate>
2511 TOutputIterator o_begin,
2512 TUnaryPredicate predicate)
2516 if (predicate(*i_begin))
2518 *o_begin = *i_begin;
2540 template <
typename TInputIterator,
typename TOutputIterator>
2543 etl::is_random_iterator<TOutputIterator>::value, TOutputIterator>::type
2544 move_s(TInputIterator i_begin,
2545 TInputIterator i_end,
2546 TOutputIterator o_begin,
2547 TOutputIterator o_end)
2549 using s_size_type =
typename iterator_traits<TInputIterator>::difference_type;
2550 using d_size_type =
typename iterator_traits<TOutputIterator>::difference_type;
2551 using min_size_type =
typename etl::common_type<s_size_type, d_size_type>::type;
2553 s_size_type s_size = etl::distance(i_begin, i_end);
2554 d_size_type d_size = etl::distance(o_begin, o_end);
2555 min_size_type min_size = etl::min<min_size_type>(s_size, d_size);
2557 return etl::move(i_begin, i_begin + min_size, o_begin);
2571 template <
typename TInputIterator,
typename TOutputIterator>
2573 typename etl::enable_if<!etl::is_random_iterator<TInputIterator>::value ||
2574 !etl::is_random_iterator<TOutputIterator>::value, TOutputIterator>::type
2575 move_s(TInputIterator i_begin,
2576 TInputIterator i_end,
2577 TOutputIterator o_begin,
2578 TOutputIterator o_end)
2580 while ((i_begin != i_end) && (o_begin != o_end))
2582 *o_begin = etl::move(*i_begin);
2602 template <
typename TInputIterator,
typename TOutputIterator>
2603 TOutputIterator
move_s(TInputIterator i_begin,
2604 TInputIterator i_end,
2605 TOutputIterator o_begin,
2606 TOutputIterator o_end)
2609 return etl::copy_s(i_begin, i_end, o_begin, o_end);
2618 template <
typename TIterator,
typename TValue>
2623 const TValue& value)
2625 TIterator it = etl::lower_bound(
begin,
end, value);
2627 if ((it ==
end) || (*it != value))
2640 template <
typename TIterator,
2642 typename TBinaryPredicate,
2643 typename TBinaryEquality>
2648 const TValue& value,
2649 TBinaryPredicate predicate,
2650 TBinaryEquality equality)
2652 TIterator it = etl::lower_bound(
begin,
end, value, predicate);
2654 if ((it ==
end) || !equality(*it, value))
2666 template <
typename TIterator,
2667 typename TUnaryFunction,
2668 typename TUnaryPredicate>
2671 const TIterator
end,
2673 TUnaryPredicate predicate)
2677 if (predicate(*
begin))
2692 template <
typename TIterator,
2694 typename TUnaryFunction>
2713 template <
typename TIterator,
2715 typename TUnaryFunction,
2716 typename TUnaryPredicate>
2721 TUnaryPredicate predicate)
2725 if (predicate(*
begin))
2742 template <
typename TInputIterator,
typename TOutputIterator,
typename TUnaryFunction>
2745 TInputIterator i_end,
2746 TOutputIterator o_begin,
2747 TOutputIterator o_end,
2750 while ((i_begin != i_end) && (o_begin != o_end))
2766 template <
typename TInputIterator,
2768 typename TOutputIterator,
2769 typename TUnaryFunction>
2773 TOutputIterator o_begin,
2776 TInputIterator i_end(i_begin);
2777 etl::advance(i_end, n);
2779 etl::transform(i_begin, i_end, o_begin,
function);
2788 template <
typename TInputIterator1,
2789 typename TInputIterator2,
2791 typename TOutputIterator,
2792 typename TBinaryFunction>
2795 TInputIterator2 i_begin2,
2797 TOutputIterator o_begin,
2800 TInputIterator1 i_end1(i_begin1);
2801 etl::advance(i_end1, n);
2803 etl::transform(i_begin1, i_end1, i_begin2, o_begin,
function);
2810 template <
typename TInputIterator,
2811 typename TOutputIterator,
2812 typename TUnaryFunction,
2813 typename TUnaryPredicate>
2816 const TInputIterator i_end,
2817 TOutputIterator o_begin,
2819 TUnaryPredicate predicate)
2821 while (i_begin != i_end)
2823 if (predicate(*i_begin))
2839 template <
typename TInputIterator1,
2840 typename TInputIterator2,
2841 typename TOutputIterator,
2842 typename TBinaryFunction,
2843 typename TBinaryPredicate>
2846 const TInputIterator1 i_end1,
2847 TInputIterator2 i_begin2,
2848 TOutputIterator o_begin,
2850 TBinaryPredicate predicate)
2852 while (i_begin1 != i_end1)
2854 if (predicate(*i_begin1, *i_begin2))
2856 *o_begin =
function(*i_begin1, *i_begin2);
2871 template <
typename TInputIterator,
2873 typename TOutputIterator,
2874 typename TUnaryFunction,
2875 typename TUnaryPredicate>
2879 TOutputIterator o_begin,
2881 TUnaryPredicate predicate)
2885 if (predicate(*i_begin))
2901 template <
typename TInputIterator1,
2902 typename TInputIterator2,
2904 typename TOutputIterator,
2905 typename TBinaryFunction,
2906 typename TBinaryPredicate>
2909 TInputIterator2 i_begin2,
2911 TOutputIterator o_begin,
2913 TBinaryPredicate predicate)
2917 if (predicate(*i_begin1, *i_begin2))
2919 *o_begin++ =
function(*i_begin1, *i_begin2);
2934 template <
typename TSource,
typename TDestinationTrue,
typename TDestinationFalse,
2935 typename TUnaryFunctionTrue,
typename TUnaryFunctionFalse,
2936 typename TUnaryPredicate>
2940 TDestinationTrue destination_true,
2941 TDestinationFalse destination_false,
2942 TUnaryFunctionTrue function_true,
2943 TUnaryFunctionFalse function_false,
2944 TUnaryPredicate predicate)
2948 if (predicate(*
begin))
2950 *destination_true = function_true(*
begin);
2955 *destination_false = function_false(*
begin);
2956 ++destination_false;
2962 return ETL_OR_STD::pair<TDestinationTrue, TDestinationFalse>(destination_true, destination_false);
2970 template <
typename TSource1,
2972 typename TDestinationTrue,
2973 typename TDestinationFalse,
2974 typename TBinaryFunctionTrue,
2975 typename TBinaryFunctionFalse,
2976 typename TBinaryPredicate>
2981 TDestinationTrue destination_true,
2982 TDestinationFalse destination_false,
2983 TBinaryFunctionTrue function_true,
2984 TBinaryFunctionFalse function_false,
2985 TBinaryPredicate predicate)
2987 while (begin1 != end1)
2989 if (predicate(*begin1, *begin2))
2991 *destination_true = function_true(*begin1, *begin2);
2996 *destination_false = function_false(*begin1, *begin2);
2997 ++destination_false;
3004 return ETL_OR_STD::pair<TDestinationTrue, TDestinationFalse>(destination_true, destination_false);
3012 template <
typename TIterator,
typename TCompare>
3013#if ETL_USING_STD_NAMESPACE
3025 typedef typename etl::iterator_traits<TIterator>::difference_type difference_t;
3027 difference_t n = etl::distance(first, last);
3029 for (difference_t i = n / 2; i > 0; i /= 2)
3031 for (difference_t j = i; j < n; ++j)
3033 for (difference_t k = j - i; k >= 0; k -= i)
3035 TIterator itr1 = first;
3036 TIterator itr2 = first;
3038 etl::advance(itr1, k);
3039 etl::advance(itr2, k + i);
3043 etl::iter_swap(itr1, itr2);
3054 template <
typename TIterator>
3055#if ETL_USING_STD_NAMESPACE
3070 template <
typename TIterator,
typename TCompare>
3074 for (TIterator itr = first; itr != last; ++itr)
3076 etl::rotate(etl::upper_bound(first, itr, *itr,
compare), itr, etl::next(itr));
3084 template <
typename TIterator>
3092 namespace private_algorithm
3094 template <
typename TIterator>
3097 get_before_last(TIterator first_, TIterator last_)
3099 TIterator last = first_;
3100 TIterator lastplus1 = first_;
3103 while (lastplus1 != last_)
3112 template <
typename TIterator>
3114 typename etl::enable_if<etl::is_bidirectional_iterator<TIterator>::value, TIterator>::type
3115 get_before_last(TIterator , TIterator last_)
3117 TIterator last = last_;
3123 template <
typename TIterator>
3125 typename etl::enable_if<etl::is_random_access_iterator<TIterator>::value, TIterator>::type
3126 get_before_last(TIterator , TIterator last_)
3137 template <
typename TIterator,
typename TCompare>
3142 const TIterator ilast = private_algorithm::get_before_last(first, last);
3143 const TIterator jlast = last;
3145 for (TIterator i = first; i != ilast; ++i)
3152 for (; j != jlast; ++j)
3160 using ETL_OR_STD::swap;
3169 template <
typename TIterator>
3181 template <
typename TIterator,
typename TCompare>
3185 if (!etl::is_heap(first, last,
compare))
3187 etl::make_heap(first, last,
compare);
3190 etl::sort_heap(first, last,
compare);
3197 template <
typename TIterator>
3201 if (!etl::is_heap(first, last))
3203 etl::make_heap(first, last);
3206 etl::sort_heap(first, last);
3213 template <
typename T>
3215 constexpr const T& multimax(
const T& a,
const T& b)
3217 return a < b ? b : a;
3220 template <
typename T,
typename... Tx>
3222 constexpr const T& multimax(
const T& t,
const Tx&... tx)
3224 return multimax(t, multimax(tx...));
3233 template <
typename TCompare,
typename T>
3235 constexpr const T& multimax_compare(TCompare
compare,
const T& a,
const T& b)
3240 template <
typename TCompare,
typename T,
typename... Tx>
3242 constexpr const T& multimax_compare(TCompare
compare,
const T& t,
const Tx&... tx)
3244 return multimax_compare(
compare, t, multimax_compare(
compare, tx...));
3252 template <
typename T>
3254 constexpr const T& multimin(
const T& a,
const T& b)
3256 return a < b ? a : b;
3259 template <
typename T,
typename... Tx>
3261 constexpr const T& multimin(
const T& t,
const Tx&... tx)
3263 return multimin(t, multimin(tx...));
3272 template <
typename TCompare,
typename T>
3274 constexpr const T& multimin_compare(TCompare
compare,
const T& a,
const T& b)
3279 template <
typename TCompare,
typename T,
typename... Tx>
3281 constexpr const T& multimin_compare(TCompare
compare,
const T& t,
const Tx&... tx)
3283 return multimin_compare(
compare, t, multimin_compare(
compare, tx...));
3291 template <
typename TIterator>
3293 constexpr const TIterator& multimax_iter(
const TIterator& a,
const TIterator& b)
3295 return *a < *b ? b : a;
3298 template <
typename TIterator,
typename... TIteratorx>
3300 constexpr const TIterator& multimax_iter(
const TIterator& t,
const TIteratorx&... tx)
3302 return multimax_iter(t, multimax_iter(tx...));
3311 template <
typename TCompare,
typename TIterator>
3313 constexpr const TIterator& multimax_iter_compare(TCompare
compare,
const TIterator& a,
const TIterator& b)
3315 return compare(*a, *b) ? b : a;
3318 template <
typename TCompare,
typename TIterator,
typename... TIteratorx>
3320 constexpr const TIterator& multimax_iter_compare(TCompare
compare,
const TIterator& t,
const TIteratorx&... tx)
3322 return multimax_iter_compare(
compare, t, multimax_iter_compare(
compare, tx...));
3330 template <
typename TIterator>
3332 constexpr const TIterator& multimin_iter(
const TIterator& a,
const TIterator& b)
3334 return *a < *b ? a : b;
3337 template <
typename TIterator,
typename... Tx>
3339 constexpr const TIterator& multimin_iter(
const TIterator& t,
const Tx&... tx)
3341 return multimin_iter(t, multimin_iter(tx...));
3350 template <
typename TCompare,
typename TIterator>
3352 constexpr const TIterator& multimin_iter_compare(TCompare
compare,
const TIterator& a,
const TIterator& b)
3354 return compare(*a, *b) ? a : b;
3357 template <
typename TCompare,
typename TIterator,
typename... Tx>
3359 constexpr const TIterator& multimin_iter_compare(TCompare
compare,
const TIterator& t,
const Tx&... tx)
3361 return multimin_iter_compare(
compare, t, multimin_iter_compare(
compare, tx...));
3370 template <
typename TIterator,
typename TPredicate>
3372 typename etl::enable_if<etl::is_forward_iterator<TIterator>::value, TIterator>::type
3373 partition(TIterator first, TIterator last, TPredicate predicate)
3382 for (TIterator i = etl::next(first); i != last; ++i)
3386 using ETL_OR_STD::swap;
3400 template <
typename TIterator,
typename TPredicate>
3403 partition(TIterator first, TIterator last, TPredicate predicate)
3405 while (first != last)
3424 using ETL_OR_STD::swap;
3425 swap(*first, *last);
3433 namespace private_algorithm
3435 using ETL_OR_STD::swap;
3437 template <
typename TIterator,
typename TCompare>
3438#if (ETL_USING_CPP20 && ETL_USING_STL) || (ETL_USING_CPP14 && ETL_NOT_USING_STL && !defined(ETL_IN_UNIT_TEST))
3441 TIterator nth_partition(TIterator first, TIterator last, TCompare compare)
3443 typedef typename etl::iterator_traits<TIterator>::value_type value_type;
3445 TIterator pivot = last;
3446 value_type pivot_value = *pivot;
3451 swap(*pivot, *last);
3454 TIterator i = first;
3456 for (TIterator j = first; j < last; ++j)
3458 if (!compare(pivot_value, *j))
3476 template <typename TIterator, typename TCompare = etl::less<typename etl::iterator_traits<TIterator>::value_type>>
3477#if (ETL_USING_CPP20 && ETL_USING_STL) || (ETL_USING_CPP14 && ETL_NOT_USING_STL && !defined(ETL_IN_UNIT_TEST))
3480 typename etl::enable_if<etl::is_random_access_iterator_concept<TIterator>::value,
void>::type
3481 nth_element(TIterator first, TIterator nth, TIterator last, TCompare
compare = TCompare())
3491 while (first <= last)
3493 TIterator p = private_algorithm::nth_partition(first, last,
compare);
3513 template <
typename TIterator,
typename TCompare>
3514 typename etl::enable_if<etl::is_random_access_iterator_concept<TIterator>::value,
void>::type
3525 while (first <= last)
3527 TIterator p = private_algorithm::nth_partition(first, last,
compare);
3545 template <
typename TIterator>
3547 nth_element(TIterator first, TIterator nth, TIterator last)
Definition iterator.h:228
ETL_CONSTEXPR T clamp(const T &value, const T &low, const T &high, TCompare compare)
Definition algorithm.h:2268
ETL_CONSTEXPR20 void shell_sort(TIterator first, TIterator last)
Definition algorithm.h:3060
ETL_CONSTEXPR14 TOutputIterator copy_if(TIterator begin, TIterator end, TOutputIterator out, TUnaryPredicate predicate)
Definition algorithm.h:2074
ETL_CONSTEXPR14 ETL_OR_STD::pair< TDestinationTrue, TDestinationFalse > partition_transform(TSource begin, TSource end, TDestinationTrue destination_true, TDestinationFalse destination_false, TUnaryFunctionTrue function_true, TUnaryFunctionFalse function_false, TUnaryPredicate predicate)
Definition algorithm.h:2938
ETL_NODISCARD ETL_CONSTEXPR14 bool any_of(TIterator begin, TIterator end, TUnaryPredicate predicate)
Definition algorithm.h:2116
ETL_NODISCARD ETL_CONSTEXPR14 TIterator min_element(TIterator begin, TIterator end, TCompare compare)
Definition algorithm.h:1471
ETL_CONSTEXPR14 TOutputIterator transform_n_if(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TUnaryFunction function, TUnaryPredicate predicate)
Definition algorithm.h:2877
ETL_CONSTEXPR14 T accumulate(TIterator first, TIterator last, T sum)
Definition algorithm.h:2234
ETL_NODISCARD ETL_CONSTEXPR14 bool all_of(TIterator begin, TIterator end, TUnaryPredicate predicate)
Definition algorithm.h:2101
ETL_NODISCARD ETL_CONSTEXPR14 ETL_OR_STD::pair< TIterator, TIterator > minmax_element(TIterator begin, TIterator end, TCompare compare)
Definition algorithm.h:1567
ETL_CONSTEXPR14 TOutputIterator transform_if(TInputIterator i_begin, const TInputIterator i_end, TOutputIterator o_begin, TUnaryFunction function, TUnaryPredicate predicate)
Definition algorithm.h:2815
ETL_CONSTEXPR14 TUnaryFunction for_each_if(TIterator begin, const TIterator end, TUnaryFunction function, TUnaryPredicate predicate)
Definition algorithm.h:2670
ETL_NODISCARD ETL_CONSTEXPR14 TIterator find_if_not(TIterator begin, TIterator end, TUnaryPredicate predicate)
Definition algorithm.h:1822
ETL_NODISCARD ETL_CONSTEXPR14 bool is_sorted(TIterator begin, TIterator end)
Definition algorithm.h:1709
ETL_CONSTEXPR14 TOutputIterator transform_s(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TOutputIterator o_end, TUnaryFunction function)
Definition algorithm.h:2744
ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T &value)
Definition algorithm.h:2300
ETL_CONSTEXPR14 void transform_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TUnaryFunction function)
Definition algorithm.h:2771
ETL_CONSTEXPR14 TOutputIterator copy_n_if(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TUnaryPredicate predicate)
Definition algorithm.h:2509
ETL_NODISCARD ETL_CONSTEXPR14 TIterator is_sorted_until(TIterator begin, TIterator end)
Definition algorithm.h:1650
ETL_CONSTEXPR14 void insertion_sort(TIterator first, TIterator last)
Definition algorithm.h:3086
void sort(TIterator first, TIterator last, TCompare compare)
Definition algorithm.h:2189
ETL_NODISCARD ETL_CONSTEXPR14 bool is_unique_sorted(TIterator begin, TIterator end)
Definition algorithm.h:1794
ETL_NODISCARD ETL_CONSTEXPR14 ETL_OR_STD::pair< const T &, const T & > minmax(const T &a, const T &b)
Definition algorithm.h:1621
ETL_CONSTEXPR14 etl::enable_if< etl::is_random_iterator< TInputIterator >::value &&etl::is_random_iterator< TOutputIterator >::value, TOutputIterator >::type copy_s(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TOutputIterator o_end)
Definition algorithm.h:2368
ETL_CONSTEXPR14 TIterator remove_if(TIterator first, TIterator last, TUnaryPredicate predicate)
Definition algorithm.h:2326
ETL_CONSTEXPR14 ETL_OR_STD::pair< TDestinationTrue, TDestinationFalse > partition_copy(TSource begin, TSource end, TDestinationTrue destination_true, TDestinationFalse destination_false, TUnaryPredicate predicate)
Definition algorithm.h:2042
ETL_CONSTEXPR14 TIterator for_each_n(TIterator begin, TSize n, TUnaryFunction function)
Definition algorithm.h:2696
ETL_NODISCARD ETL_CONSTEXPR14 TIterator binary_find(TIterator begin, TIterator end, const TValue &value)
Definition algorithm.h:2621
ETL_CONSTEXPR14 void heap_sort(TIterator first, TIterator last, TCompare compare)
Definition algorithm.h:3183
ETL_NODISCARD ETL_CONSTEXPR14 bool none_of(TIterator begin, TIterator end, TUnaryPredicate predicate)
Definition algorithm.h:2131
ETL_CONSTEXPR20 void selection_sort(TIterator first, TIterator last, TCompare compare)
Definition algorithm.h:3139
ETL_CONSTEXPR14 TOutputIterator copy_n_s(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TOutputIterator o_end)
Definition algorithm.h:2429
ETL_NODISCARD ETL_CONSTEXPR14 TIterator is_unique_sorted_until(TIterator begin, TIterator end, TCompare compare)
Definition algorithm.h:1737
TOutputIterator move_s(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TOutputIterator o_end)
Definition algorithm.h:2603
ETL_CONSTEXPR14 TOutputIterator copy_if_s(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TOutputIterator o_end, TUnaryPredicate predicate)
Definition algorithm.h:2479
ETL_CONSTEXPR14 TIterator for_each_n_if(TIterator begin, TSize n, TUnaryFunction function, TUnaryPredicate predicate)
Definition algorithm.h:2718
void stable_sort(TIterator first, TIterator last, TCompare compare)
Definition algorithm.h:2211
ETL_NODISCARD ETL_CONSTEXPR14 bool is_partitioned(TIterator begin, TIterator end, TUnaryPredicate predicate)
Definition algorithm.h:1982
ETL_NODISCARD ETL_CONSTEXPR14 TIterator max_element(TIterator begin, TIterator end, TCompare compare)
Definition algorithm.h:1519
ETL_NODISCARD ETL_CONSTEXPR14 TIterator partition_point(TIterator begin, TIterator end, TUnaryPredicate predicate)
Definition algorithm.h:2017
ETL_NODISCARD ETL_CONSTEXPR14 bool is_permutation(TIterator1 begin1, TIterator1 end1, TIterator2 begin2)
Definition algorithm.h:1847
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
Definition exception.h:47
enable_if
Definition type_traits_generator.h:1254
is_reference
Definition type_traits_generator.h:1174
is_same
Definition type_traits_generator.h:1104
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR14 void swap(etl::typed_storage_ext< T > &lhs, etl::typed_storage_ext< T > &rhs) ETL_NOEXCEPT
Swap two etl::typed_storage_ext.
Definition alignment.h:838
etl::enable_if< etl::is_random_access_iterator_concept< TIterator >::value, void >::type nth_element(TIterator first, TIterator nth, TIterator last, TCompare compare)
Definition algorithm.h:3515
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:962
ETL_CONSTEXPR14 etl::enable_if< etl::is_forward_iterator< TIterator >::value, TIterator >::type partition(TIterator first, TIterator last, TPredicate predicate)
Returns the maximum value.
Definition algorithm.h:3373
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:992
Definition functional.h:170
Definition algorithm.h:119