40 #ifndef ABSL_ALGORITHM_CONTAINER_H_
41 #define ABSL_ALGORITHM_CONTAINER_H_
47 #include <type_traits>
48 #include <unordered_map>
49 #include <unordered_set>
53 #include "absl/algorithm/algorithm.h"
54 #include "absl/base/macros.h"
55 #include "absl/meta/type_traits.h"
59 namespace container_algorithm_internal {
75 template <
typename C1,
typename C2>
77 decltype(std::make_pair(ContainerIter<C1>(), ContainerIter<C2>()));
81 decltype(std::distance(std::declval<ContainerIter<C>>(),
82 std::declval<ContainerIter<C>>()));
86 typename std::iterator_traits<ContainerIter<C>>::pointer;
102 template <
typename C>
103 ContainerIter<C>
c_end(C& c) {
return end(c); }
105 template <
typename T>
108 template <
class Key,
class T,
class Hash,
class KeyEqual,
class Allocator>
109 struct IsUnorderedContainer<
112 template <
class Key,
class Hash,
class KeyEqual,
class Allocator>
113 struct IsUnorderedContainer<
std::unordered_set<Key, Hash, KeyEqual, Allocator>>
119 auto c_size(C& c) -> decltype(
c.size()) {
123 template <
class T, std::
size_t N>
124 constexpr std::size_t
c_size(
T (&)[
N]) {
140 template <
typename C,
typename EqualityComparable>
144 std::forward<EqualityComparable>(
value));
155 template <
typename C>
156 container_algorithm_internal::ContainerDifferenceType<const C>
c_distance(
170 template <
typename C,
typename Pred>
171 bool c_all_of(
const C& c, Pred&& pred) {
174 std::forward<Pred>(pred));
181 template <
typename C,
typename Pred>
182 bool c_any_of(
const C& c, Pred&& pred) {
185 std::forward<Pred>(pred));
192 template <
typename C,
typename Pred>
193 bool c_none_of(
const C& c, Pred&& pred) {
196 std::forward<Pred>(pred));
203 template <
typename C,
typename Function>
207 std::forward<Function>(f));
214 template <
typename C,
typename T>
215 container_algorithm_internal::ContainerIter<C>
c_find(C& c,
T&&
value) {
218 std::forward<T>(
value));
225 template <
typename C,
typename Pred>
226 container_algorithm_internal::ContainerIter<C>
c_find_if(C& c, Pred&& pred) {
229 std::forward<Pred>(pred));
236 template <
typename C,
typename Pred>
237 container_algorithm_internal::ContainerIter<C>
c_find_if_not(C& c,
241 std::forward<Pred>(pred));
248 template <
typename Sequence1,
typename Sequence2>
249 container_algorithm_internal::ContainerIter<Sequence1>
c_find_end(
250 Sequence1& sequence, Sequence2& subsequence) {
259 template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
260 container_algorithm_internal::ContainerIter<Sequence1>
c_find_end(
261 Sequence1& sequence, Sequence2& subsequence, BinaryPredicate&& pred) {
266 std::forward<BinaryPredicate>(pred));
274 template <
typename C1,
typename C2>
285 template <
typename C1,
typename C2,
typename BinaryPredicate>
292 std::forward<BinaryPredicate>(pred));
299 template <
typename Sequence>
301 Sequence& sequence) {
308 template <
typename Sequence,
typename BinaryPredicate>
310 Sequence& sequence, BinaryPredicate&& pred) {
313 std::forward<BinaryPredicate>(pred));
320 template <
typename C,
typename T>
321 container_algorithm_internal::ContainerDifferenceType<const C>
c_count(
325 std::forward<T>(
value));
332 template <
typename C,
typename Pred>
333 container_algorithm_internal::ContainerDifferenceType<const C>
c_count_if(
334 const C& c, Pred&& pred) {
337 std::forward<Pred>(pred));
345 template <
typename C1,
typename C2>
346 container_algorithm_internal::ContainerIterPairType<C1, C2>
353 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
356 if (!(*first1 == *first2)) {
361 return std::make_pair(first1, first2);
367 template <
typename C1,
typename C2,
typename BinaryPredicate>
368 container_algorithm_internal::ContainerIterPairType<C1, C2>
375 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
376 if (!pred(*first1, *first2)) {
381 return std::make_pair(first1, first2);
401 template <
typename C1,
typename C2>
412 template <
typename C1,
typename C2,
typename BinaryPredicate>
413 bool c_equal(
const C1&
c1,
const C2&
c2, BinaryPredicate&& pred) {
419 std::forward<BinaryPredicate>(pred)));
426 template <
typename C1,
typename C2>
430 return c1.size() ==
c2.size() &&
436 template <
typename C1,
typename C2,
typename BinaryPredicate>
440 return c1.size() ==
c2.size() &&
442 std::forward<BinaryPredicate>(pred));
449 template <
typename Sequence1,
typename Sequence2>
450 container_algorithm_internal::ContainerIter<Sequence1>
c_search(
451 Sequence1& sequence, Sequence2& subsequence) {
460 template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
461 container_algorithm_internal::ContainerIter<Sequence1>
c_search(
462 Sequence1& sequence, Sequence2& subsequence, BinaryPredicate&& pred) {
467 std::forward<BinaryPredicate>(pred));
474 template <
typename Sequence,
typename Size,
typename T>
475 container_algorithm_internal::ContainerIter<Sequence>
c_search_n(
479 std::forward<T>(
value));
484 template <
typename Sequence,
typename Size,
typename T,
485 typename BinaryPredicate>
486 container_algorithm_internal::ContainerIter<Sequence>
c_search_n(
487 Sequence& sequence, Size
count,
T&&
value, BinaryPredicate&& pred) {
490 std::forward<T>(
value),
491 std::forward<BinaryPredicate>(pred));
502 template <
typename InputSequence,
typename OutputIterator>
512 template <
typename C,
typename Size,
typename OutputIterator>
521 template <
typename InputSequence,
typename OutputIterator,
typename Pred>
526 std::forward<Pred>(pred));
533 template <
typename C,
typename B
idirectionalIterator>
535 BidirectionalIterator
dest) {
544 template <
typename C,
typename OutputIterator>
545 OutputIterator
c_move(C&& src, OutputIterator
dest) {
554 template <
typename C,
typename B
idirectionalIterator>
565 template <
typename C1,
typename C2>
573 for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
574 swap(*first1, *first2);
585 template <
typename InputSequence,
typename OutputIterator,
typename UnaryOp>
587 UnaryOp&& unary_op) {
590 std::forward<UnaryOp>(unary_op));
596 template <
typename InputSequence1,
typename InputSequence2,
597 typename OutputIterator,
typename BinaryOp>
598 OutputIterator
c_transform(
const InputSequence1& input1,
599 const InputSequence2& input2, OutputIterator
output,
600 BinaryOp&& binary_op) {
605 for (; first1 != last1 && first2 != last2;
606 ++first1, (void)++first2, ++
output) {
607 *
output = binary_op(*first1, *first2);
618 template <
typename Sequence,
typename T>
630 template <
typename C,
typename Pred,
typename T>
634 std::forward<Pred>(pred), std::forward<T>(new_value));
642 template <
typename C,
typename OutputIterator,
typename T>
648 std::forward<T>(new_value));
656 template <
typename C,
typename OutputIterator,
typename Pred,
typename T>
661 std::forward<Pred>(pred),
662 std::forward<T>(new_value));
669 template <
typename C,
typename T>
679 template <
typename C,
typename Size,
typename T>
682 std::forward<T>(
value));
689 template <
typename C,
typename Generator>
693 std::forward<Generator>(
gen));
701 template <
typename C,
typename Size,
typename Generator>
702 container_algorithm_internal::ContainerIter<C>
c_generate_n(C& c, Size n,
705 std::forward<Generator>(
gen));
718 template <
typename C,
typename OutputIterator,
typename T>
722 std::forward<T>(
value));
730 template <
typename C,
typename OutputIterator,
typename Pred>
735 std::forward<Pred>(pred));
743 template <
typename C,
typename OutputIterator>
751 template <
typename C,
typename OutputIterator,
typename BinaryPredicate>
753 BinaryPredicate&& pred) {
756 std::forward<BinaryPredicate>(pred));
763 template <
typename Sequence>
773 template <
typename C,
typename OutputIterator>
785 template <
typename C,
786 typename Iterator = container_algorithm_internal::ContainerIter<C>>
797 template <
typename C,
typename OutputIterator>
800 container_algorithm_internal::ContainerIter<const C> middle,
812 template <
typename RandomAccessContainer,
typename UniformRandomBitGenerator>
813 void c_shuffle(RandomAccessContainer& c, UniformRandomBitGenerator&&
gen) {
816 std::forward<UniformRandomBitGenerator>(
gen));
828 template <
typename C,
typename Pred>
832 std::forward<Pred>(pred));
841 template <
typename C,
typename Pred>
842 container_algorithm_internal::ContainerIter<C>
c_partition(C& c, Pred&& pred) {
845 std::forward<Pred>(pred));
855 template <
typename C,
typename Pred>
860 std::forward<Pred>(pred));
869 template <
typename C,
typename OutputIterator1,
typename OutputIterator2,
872 const C& c, OutputIterator1 out_true, OutputIterator2 out_false,
876 out_false, std::forward<Pred>(pred));
884 template <
typename C,
typename Pred>
889 std::forward<Pred>(pred));
900 template <
typename C>
908 template <
typename C,
typename LessThan>
909 void c_sort(C& c, LessThan&& comp) {
912 std::forward<LessThan>(comp));
920 template <
typename C>
928 template <
typename C,
typename LessThan>
932 std::forward<LessThan>(comp));
939 template <
typename C>
947 template <
typename C,
typename LessThan>
951 std::forward<LessThan>(comp));
959 template <
typename RandomAccessContainer>
961 RandomAccessContainer& sequence,
962 container_algorithm_internal::ContainerIter<RandomAccessContainer> middle) {
969 template <
typename RandomAccessContainer,
typename LessThan>
971 RandomAccessContainer& sequence,
972 container_algorithm_internal::ContainerIter<RandomAccessContainer> middle,
976 std::forward<LessThan>(comp));
986 template <
typename C,
typename RandomAccessContainer>
987 container_algorithm_internal::ContainerIter<RandomAccessContainer>
997 template <
typename C,
typename RandomAccessContainer,
typename LessThan>
998 container_algorithm_internal::ContainerIter<RandomAccessContainer>
1005 std::forward<LessThan>(comp));
1013 template <
typename C>
1021 template <
typename C,
typename LessThan>
1023 C& c, LessThan&& comp) {
1026 std::forward<LessThan>(comp));
1036 template <
typename RandomAccessContainer>
1038 RandomAccessContainer& sequence,
1039 container_algorithm_internal::ContainerIter<RandomAccessContainer> nth) {
1046 template <
typename RandomAccessContainer,
typename LessThan>
1048 RandomAccessContainer& sequence,
1049 container_algorithm_internal::ContainerIter<RandomAccessContainer> nth,
1053 std::forward<LessThan>(comp));
1065 template <
typename Sequence,
typename T>
1066 container_algorithm_internal::ContainerIter<Sequence>
c_lower_bound(
1067 Sequence& sequence,
T&&
value) {
1070 std::forward<T>(
value));
1075 template <
typename Sequence,
typename T,
typename LessThan>
1076 container_algorithm_internal::ContainerIter<Sequence>
c_lower_bound(
1077 Sequence& sequence,
T&&
value, LessThan&& comp) {
1080 std::forward<T>(
value), std::forward<LessThan>(comp));
1088 template <
typename Sequence,
typename T>
1089 container_algorithm_internal::ContainerIter<Sequence>
c_upper_bound(
1090 Sequence& sequence,
T&&
value) {
1093 std::forward<T>(
value));
1098 template <
typename Sequence,
typename T,
typename LessThan>
1099 container_algorithm_internal::ContainerIter<Sequence>
c_upper_bound(
1100 Sequence& sequence,
T&&
value, LessThan&& comp) {
1103 std::forward<T>(
value), std::forward<LessThan>(comp));
1111 template <
typename Sequence,
typename T>
1112 container_algorithm_internal::ContainerIterPairType<Sequence, Sequence>
1116 std::forward<T>(
value));
1121 template <
typename Sequence,
typename T,
typename LessThan>
1122 container_algorithm_internal::ContainerIterPairType<Sequence, Sequence>
1126 std::forward<T>(
value), std::forward<LessThan>(comp));
1134 template <
typename Sequence,
typename T>
1138 std::forward<T>(
value));
1143 template <
typename Sequence,
typename T,
typename LessThan>
1147 std::forward<T>(
value),
1148 std::forward<LessThan>(comp));
1159 template <
typename C1,
typename C2,
typename OutputIterator>
1169 template <
typename C1,
typename C2,
typename OutputIterator,
typename LessThan>
1176 std::forward<LessThan>(comp));
1183 template <
typename C>
1185 container_algorithm_internal::ContainerIter<C> middle) {
1192 template <
typename C,
typename LessThan>
1194 container_algorithm_internal::ContainerIter<C> middle,
1198 std::forward<LessThan>(comp));
1206 template <
typename C1,
typename C2>
1216 template <
typename C1,
typename C2,
typename LessThan>
1222 std::forward<LessThan>(comp));
1230 template <
typename C1,
typename C2,
typename OutputIterator,
1231 typename =
typename std::enable_if<
1234 typename =
typename std::enable_if<
1246 template <
typename C1,
typename C2,
typename OutputIterator,
typename LessThan,
1247 typename =
typename std::enable_if<
1250 typename =
typename std::enable_if<
1259 std::forward<LessThan>(comp));
1266 template <
typename C1,
typename C2,
typename OutputIterator,
1267 typename =
typename std::enable_if<
1270 typename =
typename std::enable_if<
1283 template <
typename C1,
typename C2,
typename OutputIterator,
typename LessThan,
1284 typename =
typename std::enable_if<
1287 typename =
typename std::enable_if<
1291 OutputIterator
output, LessThan&& comp) {
1296 std::forward<LessThan>(comp));
1304 template <
typename C1,
typename C2,
typename OutputIterator,
1305 typename =
typename std::enable_if<
1308 typename =
typename std::enable_if<
1321 template <
typename C1,
typename C2,
typename OutputIterator,
typename LessThan,
1322 typename =
typename std::enable_if<
1325 typename =
typename std::enable_if<
1329 OutputIterator
output, LessThan&& comp) {
1334 std::forward<LessThan>(comp));
1342 template <
typename C1,
typename C2,
typename OutputIterator,
1343 typename =
typename std::enable_if<
1346 typename =
typename std::enable_if<
1351 return std::set_symmetric_difference(
1360 template <
typename C1,
typename C2,
typename OutputIterator,
typename LessThan,
1361 typename =
typename std::enable_if<
1364 typename =
typename std::enable_if<
1370 return std::set_symmetric_difference(
1375 std::forward<LessThan>(comp));
1386 template <
typename RandomAccessContainer>
1387 void c_push_heap(RandomAccessContainer& sequence) {
1394 template <
typename RandomAccessContainer,
typename LessThan>
1395 void c_push_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1398 std::forward<LessThan>(comp));
1405 template <
typename RandomAccessContainer>
1406 void c_pop_heap(RandomAccessContainer& sequence) {
1413 template <
typename RandomAccessContainer,
typename LessThan>
1414 void c_pop_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1417 std::forward<LessThan>(comp));
1424 template <
typename RandomAccessContainer>
1425 void c_make_heap(RandomAccessContainer& sequence) {
1432 template <
typename RandomAccessContainer,
typename LessThan>
1433 void c_make_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1436 std::forward<LessThan>(comp));
1443 template <
typename RandomAccessContainer>
1444 void c_sort_heap(RandomAccessContainer& sequence) {
1451 template <
typename RandomAccessContainer,
typename LessThan>
1452 void c_sort_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1455 std::forward<LessThan>(comp));
1462 template <
typename RandomAccessContainer>
1463 bool c_is_heap(
const RandomAccessContainer& sequence) {
1470 template <
typename RandomAccessContainer,
typename LessThan>
1471 bool c_is_heap(
const RandomAccessContainer& sequence, LessThan&& comp) {
1474 std::forward<LessThan>(comp));
1481 template <
typename RandomAccessContainer>
1482 container_algorithm_internal::ContainerIter<RandomAccessContainer>
1490 template <
typename RandomAccessContainer,
typename LessThan>
1491 container_algorithm_internal::ContainerIter<RandomAccessContainer>
1495 std::forward<LessThan>(comp));
1507 template <
typename Sequence>
1508 container_algorithm_internal::ContainerIter<Sequence>
c_min_element(
1509 Sequence& sequence) {
1516 template <
typename Sequence,
typename LessThan>
1517 container_algorithm_internal::ContainerIter<Sequence>
c_min_element(
1518 Sequence& sequence, LessThan&& comp) {
1521 std::forward<LessThan>(comp));
1529 template <
typename Sequence>
1530 container_algorithm_internal::ContainerIter<Sequence>
c_max_element(
1531 Sequence& sequence) {
1538 template <
typename Sequence,
typename LessThan>
1539 container_algorithm_internal::ContainerIter<Sequence>
c_max_element(
1540 Sequence& sequence, LessThan&& comp) {
1543 std::forward<LessThan>(comp));
1552 template <
typename C>
1553 container_algorithm_internal::ContainerIterPairType<C, C>
1561 template <
typename C,
typename LessThan>
1562 container_algorithm_internal::ContainerIterPairType<C, C>
1566 std::forward<LessThan>(comp));
1580 template <
typename Sequence1,
typename Sequence2>
1582 return std::lexicographical_compare(
1591 template <
typename Sequence1,
typename Sequence2,
typename LessThan>
1594 return std::lexicographical_compare(
1599 std::forward<LessThan>(comp));
1607 template <
typename C>
1615 template <
typename C,
typename LessThan>
1619 std::forward<LessThan>(comp));
1627 template <
typename C>
1635 template <
typename C,
typename LessThan>
1639 std::forward<LessThan>(comp));
1651 template <
typename Sequence,
typename T>
1655 std::forward<T>(
value));
1666 template <
typename Sequence,
typename T>
1670 std::forward<T>(
init));
1675 template <
typename Sequence,
typename T,
typename BinaryOp>
1677 BinaryOp&& binary_op) {
1680 std::forward<T>(
init),
1681 std::forward<BinaryOp>(binary_op));
1692 template <
typename Sequence1,
typename Sequence2,
typename T>
1693 decay_t<T>
c_inner_product(
const Sequence1& factors1,
const Sequence2& factors2,
1698 std::forward<T>(
sum));
1704 template <
typename Sequence1,
typename Sequence2,
typename T,
1705 typename BinaryOp1,
typename BinaryOp2>
1706 decay_t<T>
c_inner_product(
const Sequence1& factors1,
const Sequence2& factors2,
1707 T&&
sum, BinaryOp1&& op1, BinaryOp2&& op2) {
1711 std::forward<T>(
sum), std::forward<BinaryOp1>(op1),
1712 std::forward<BinaryOp2>(op2));
1720 template <
typename InputSequence,
typename OutputIt>
1722 OutputIt output_first) {
1730 template <
typename InputSequence,
typename OutputIt,
typename BinaryOp>
1732 OutputIt output_first, BinaryOp&&
op) {
1735 output_first, std::forward<BinaryOp>(
op));
1744 template <
typename InputSequence,
typename OutputIt>
1753 template <
typename InputSequence,
typename OutputIt,
typename BinaryOp>
1758 output_first, std::forward<BinaryOp>(
op));
1764 #endif // ABSL_ALGORITHM_CONTAINER_H_