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>
86 typename std::iterator_traits<ContainerIter<C>>::pointer;
102 template <
typename C>
105 template <
typename T>
108 template <
class Key,
class T,
class Hash,
class KeyEqual,
class Allocator>
112 template <
class Key,
class Hash,
class KeyEqual,
class Allocator>
119 auto c_size(C& c) -> decltype(c.size()) {
123 template <
class T, std::
size_t N>
140 template <
typename C,
typename EqualityComparable>
144 std::forward<EqualityComparable>(
value));
155 template <
typename C>
170 template <
typename C,
typename Pred>
174 std::forward<Pred>(pred));
181 template <
typename C,
typename Pred>
185 std::forward<Pred>(pred));
192 template <
typename C,
typename Pred>
196 std::forward<Pred>(pred));
203 template <
typename C,
typename Function>
207 std::forward<Function>(f));
214 template <
typename C,
typename T>
218 std::forward<T>(
value));
225 template <
typename C,
typename Pred>
229 std::forward<Pred>(pred));
236 template <
typename C,
typename Pred>
241 std::forward<Pred>(pred));
248 template <
typename Sequence1,
typename Sequence2>
250 Sequence1& sequence, Sequence2& subsequence) {
259 template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
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>
325 std::forward<T>(
value));
332 template <
typename C,
typename Pred>
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>
451 Sequence1& sequence, Sequence2& subsequence) {
460 template <
typename Sequence1,
typename Sequence2,
typename BinaryPredicate>
462 Sequence1& sequence, Sequence2& subsequence, BinaryPredicate&& pred) {
467 std::forward<BinaryPredicate>(pred));
474 template <
typename Sequence,
typename Size,
typename T>
479 std::forward<T>(
value));
484 template <
typename Sequence,
typename Size,
typename T,
485 typename BinaryPredicate>
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>
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>
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>
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>
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>
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>
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,
969 template <
typename RandomAccessContainer,
typename LessThan>
971 RandomAccessContainer& sequence,
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,
1046 template <
typename RandomAccessContainer,
typename LessThan>
1048 RandomAccessContainer& sequence,
1053 std::forward<LessThan>(comp));
1065 template <
typename Sequence,
typename T>
1067 Sequence& sequence,
T&&
value) {
1070 std::forward<T>(
value));
1075 template <
typename Sequence,
typename T,
typename LessThan>
1077 Sequence& sequence,
T&&
value, LessThan&& comp) {
1080 std::forward<T>(
value), std::forward<LessThan>(comp));
1088 template <
typename Sequence,
typename T>
1090 Sequence& sequence,
T&&
value) {
1093 std::forward<T>(
value));
1098 template <
typename Sequence,
typename T,
typename LessThan>
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>
1192 template <
typename C,
typename LessThan>
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<
1288 template <
typename C1,
typename C2,
typename OutputIterator,
typename LessThan,
1289 typename =
typename std::enable_if<
1292 typename =
typename std::enable_if<
1296 OutputIterator
output, LessThan&& comp) {
1306 std::forward<LessThan>(comp));
1314 template <
typename C1,
typename C2,
typename OutputIterator,
1315 typename =
typename std::enable_if<
1318 typename =
typename std::enable_if<
1331 template <
typename C1,
typename C2,
typename OutputIterator,
typename LessThan,
1332 typename =
typename std::enable_if<
1335 typename =
typename std::enable_if<
1339 OutputIterator
output, LessThan&& comp) {
1344 std::forward<LessThan>(comp));
1352 template <
typename C1,
typename C2,
typename OutputIterator,
1353 typename =
typename std::enable_if<
1356 typename =
typename std::enable_if<
1361 return std::set_symmetric_difference(
1370 template <
typename C1,
typename C2,
typename OutputIterator,
typename LessThan,
1371 typename =
typename std::enable_if<
1374 typename =
typename std::enable_if<
1380 return std::set_symmetric_difference(
1385 std::forward<LessThan>(comp));
1396 template <
typename RandomAccessContainer>
1404 template <
typename RandomAccessContainer,
typename LessThan>
1408 std::forward<LessThan>(comp));
1415 template <
typename RandomAccessContainer>
1423 template <
typename RandomAccessContainer,
typename LessThan>
1424 void c_pop_heap(RandomAccessContainer& sequence, LessThan&& comp) {
1427 std::forward<LessThan>(comp));
1434 template <
typename RandomAccessContainer>
1442 template <
typename RandomAccessContainer,
typename LessThan>
1446 std::forward<LessThan>(comp));
1453 template <
typename RandomAccessContainer>
1461 template <
typename RandomAccessContainer,
typename LessThan>
1465 std::forward<LessThan>(comp));
1472 template <
typename RandomAccessContainer>
1480 template <
typename RandomAccessContainer,
typename LessThan>
1481 bool c_is_heap(
const RandomAccessContainer& sequence, LessThan&& comp) {
1484 std::forward<LessThan>(comp));
1491 template <
typename RandomAccessContainer>
1492 container_algorithm_internal::ContainerIter<RandomAccessContainer>
1500 template <
typename RandomAccessContainer,
typename LessThan>
1501 container_algorithm_internal::ContainerIter<RandomAccessContainer>
1505 std::forward<LessThan>(comp));
1517 template <
typename Sequence>
1519 Sequence& sequence) {
1526 template <
typename Sequence,
typename LessThan>
1528 Sequence& sequence, LessThan&& comp) {
1531 std::forward<LessThan>(comp));
1539 template <
typename Sequence>
1541 Sequence& sequence) {
1548 template <
typename Sequence,
typename LessThan>
1550 Sequence& sequence, LessThan&& comp) {
1553 std::forward<LessThan>(comp));
1562 template <
typename C>
1563 container_algorithm_internal::ContainerIterPairType<C, C>
1571 template <
typename C,
typename LessThan>
1572 container_algorithm_internal::ContainerIterPairType<C, C>
1576 std::forward<LessThan>(comp));
1590 template <
typename Sequence1,
typename Sequence2>
1592 return std::lexicographical_compare(
1601 template <
typename Sequence1,
typename Sequence2,
typename LessThan>
1604 return std::lexicographical_compare(
1609 std::forward<LessThan>(comp));
1617 template <
typename C>
1625 template <
typename C,
typename LessThan>
1629 std::forward<LessThan>(comp));
1637 template <
typename C>
1645 template <
typename C,
typename LessThan>
1649 std::forward<LessThan>(comp));
1661 template <
typename Sequence,
typename T>
1665 std::forward<T>(
value));
1676 template <
typename Sequence,
typename T>
1680 std::forward<T>(
init));
1685 template <
typename Sequence,
typename T,
typename BinaryOp>
1687 BinaryOp&& binary_op) {
1690 std::forward<T>(
init),
1691 std::forward<BinaryOp>(binary_op));
1702 template <
typename Sequence1,
typename Sequence2,
typename T>
1708 std::forward<T>(
sum));
1714 template <
typename Sequence1,
typename Sequence2,
typename T,
1715 typename BinaryOp1,
typename BinaryOp2>
1717 T&&
sum, BinaryOp1&& op1, BinaryOp2&& op2) {
1721 std::forward<T>(
sum), std::forward<BinaryOp1>(op1),
1722 std::forward<BinaryOp2>(op2));
1730 template <
typename InputSequence,
typename OutputIt>
1732 OutputIt output_first) {
1740 template <
typename InputSequence,
typename OutputIt,
typename BinaryOp>
1742 OutputIt output_first, BinaryOp&&
op) {
1745 output_first, std::forward<BinaryOp>(
op));
1754 template <
typename InputSequence,
typename OutputIt>
1763 template <
typename InputSequence,
typename OutputIt,
typename BinaryOp>
1768 output_first, std::forward<BinaryOp>(
op));
1774 #endif // ABSL_ALGORITHM_CONTAINER_H_