Files
abseil-cpp/absl/algorithm/algorithm.h
Abseil Team b832dce848 Creation of LTS branch "lts_2020_02_25"
- 0033c9ea91 Fix build on FreeBSD/powerpc (#616) by kgotlinux <60880393+kgotlinux@users.noreply.github.com>
  - 0d5ce2797e Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - b69c7d880c Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 2a5633fc07 Merge "Export of internal Abseil changes" by Xiaoyi Zhang <zhangxy@google.com>
  - f9b3d6e493 Add RISCV support to GetProgramCounter() (#621) by Khem Raj <raj.khem@gmail.com>
  - 0232c87f21 Add missing ABSL_HAVE_VDSO_SUPPORT conditional (#622) by Sinan Kaya <41809318+franksinankaya@users.noreply.github.com>
  - 3c81410510 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - c44657f556 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 98eb410c93 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - bf78e97730 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - d95d156716 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 24713a7036 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 72382c21fe Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 08a7e7bf97 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 36bcd9599b Fix pointer format specifier in documentation (#614) by Andre Nguyen <andre-nguyen@users.noreply.github.com>
  - 0f86336b69 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - c512f118dd Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 37dd2562ec Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 4442770261 fix: Add support for more ARM processors detection (#608) by Andre Nguyen <andre-nguyen@users.noreply.github.com>
  - 159bf2bf6d Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - a2e6adecc2 Use https links. (#586) by nlewycky <nicholas@mxc.ca>
  - 564001ae50 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - b3aaac8a37 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 63ee2f8877 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - a048203a88 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 1de0166368 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - ad904b6cd3 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 2923513914 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - bf86cfe165 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 12bc53e031 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 1e39f8626a Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 77f87009a3 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - d659fe54b3 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - a4b757b5d4 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 0514227d25 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 7f4fe64af8 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 16d9fd58a5 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - bcaae6009c Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 8ba96a8244 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 2103fd9acd Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 3df7b52a6a Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - fa8c75182f Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 85092b4b64 Fix Conan builds (#400) by Adrian Ostrowski <adr.ostrowski@gmail.com>
  - e96ae2203b Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 20de2db748 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 846e5dbeda Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 8207907f4f Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 078b89b3c0 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 19b021cb3f Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - ecc0033b54 Always enable proper symbolize implementation on Windows ... by Loo Rong Jie <loorongjie@gmail.com>
  - 2796d500ae Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - e4c8d0eb8e Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - a15364ce4d Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - ab3552a189 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - e9f9000c7c Fix ABSL_WAITER_MODE detection for mingw (#342) by Joe Sylve <Joe.Sylve@gmail.com>
  - abea769b55 Fix ABSL_HAVE_ALARM check on mingw (#341) by Joe Sylve <Joe.Sylve@gmail.com>
  - 25597bdfc1 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - aad33fefaa Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 8fe7214fe2 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - debac94cfb Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 882b3501a3 Fix spelling errors (#384) by Sungmann Cho <55860394+chosungmann@users.noreply.github.com>
  - 502efe6d78 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - ccdd1d57b6 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - ddf8e52a29 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 6ec1362810 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - ac78ffc3bc Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 5374c56e51 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 97c1664b4b Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 325fd7b042 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 83c1d65c90 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - eb6b7bd23b Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 9ddac555b7 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 1948f6f967 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - a0d1e098c2 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 2d2d7fbc28 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 0302d1e5fa supppress unused variable warning for gcc (#372) by Martin <pizzard@users.noreply.github.com>
  - 262d74ba81 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - f0afae0d49 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 0e7afdcbd2 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 9a41ffdd3a Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 36910d3d7e [bazel] Add fixes for --incompatible_load_cc_rules_from_b... by Yannic <contact@yannic-bonenberger.com>
  - aae8143cf9 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - d9aa92d7fb Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 321ab53030 Export of internal Abseil changes by Abseil Team <absl-team@google.com>
  - 4ef574064e Export of internal Abseil changes by Abseil Team <absl-team@google.com>

GitOrigin-RevId: 0033c9ea91
Change-Id: I8a2b70063cb3ab40c6943a6db0fe40cae71ed8d7
2020-02-25 17:56:58 -05:00

160 lines
6.1 KiB
C++

// Copyright 2017 The Abseil Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// -----------------------------------------------------------------------------
// File: algorithm.h
// -----------------------------------------------------------------------------
//
// This header file contains Google extensions to the standard <algorithm> C++
// header.
#ifndef ABSL_ALGORITHM_ALGORITHM_H_
#define ABSL_ALGORITHM_ALGORITHM_H_
#include <algorithm>
#include <iterator>
#include <type_traits>
#include "absl/base/config.h"
namespace absl {
ABSL_NAMESPACE_BEGIN
namespace algorithm_internal {
// Performs comparisons with operator==, similar to C++14's `std::equal_to<>`.
struct EqualTo {
template <typename T, typename U>
bool operator()(const T& a, const U& b) const {
return a == b;
}
};
template <typename InputIter1, typename InputIter2, typename Pred>
bool EqualImpl(InputIter1 first1, InputIter1 last1, InputIter2 first2,
InputIter2 last2, Pred pred, std::input_iterator_tag,
std::input_iterator_tag) {
while (true) {
if (first1 == last1) return first2 == last2;
if (first2 == last2) return false;
if (!pred(*first1, *first2)) return false;
++first1;
++first2;
}
}
template <typename InputIter1, typename InputIter2, typename Pred>
bool EqualImpl(InputIter1 first1, InputIter1 last1, InputIter2 first2,
InputIter2 last2, Pred&& pred, std::random_access_iterator_tag,
std::random_access_iterator_tag) {
return (last1 - first1 == last2 - first2) &&
std::equal(first1, last1, first2, std::forward<Pred>(pred));
}
// When we are using our own internal predicate that just applies operator==, we
// forward to the non-predicate form of std::equal. This enables an optimization
// in libstdc++ that can result in std::memcmp being used for integer types.
template <typename InputIter1, typename InputIter2>
bool EqualImpl(InputIter1 first1, InputIter1 last1, InputIter2 first2,
InputIter2 last2, algorithm_internal::EqualTo /* unused */,
std::random_access_iterator_tag,
std::random_access_iterator_tag) {
return (last1 - first1 == last2 - first2) &&
std::equal(first1, last1, first2);
}
template <typename It>
It RotateImpl(It first, It middle, It last, std::true_type) {
return std::rotate(first, middle, last);
}
template <typename It>
It RotateImpl(It first, It middle, It last, std::false_type) {
std::rotate(first, middle, last);
return std::next(first, std::distance(middle, last));
}
} // namespace algorithm_internal
// equal()
//
// Compares the equality of two ranges specified by pairs of iterators, using
// the given predicate, returning true iff for each corresponding iterator i1
// and i2 in the first and second range respectively, pred(*i1, *i2) == true
//
// This comparison takes at most min(`last1` - `first1`, `last2` - `first2`)
// invocations of the predicate. Additionally, if InputIter1 and InputIter2 are
// both random-access iterators, and `last1` - `first1` != `last2` - `first2`,
// then the predicate is never invoked and the function returns false.
//
// This is a C++11-compatible implementation of C++14 `std::equal`. See
// https://en.cppreference.com/w/cpp/algorithm/equal for more information.
template <typename InputIter1, typename InputIter2, typename Pred>
bool equal(InputIter1 first1, InputIter1 last1, InputIter2 first2,
InputIter2 last2, Pred&& pred) {
return algorithm_internal::EqualImpl(
first1, last1, first2, last2, std::forward<Pred>(pred),
typename std::iterator_traits<InputIter1>::iterator_category{},
typename std::iterator_traits<InputIter2>::iterator_category{});
}
// Overload of equal() that performs comparison of two ranges specified by pairs
// of iterators using operator==.
template <typename InputIter1, typename InputIter2>
bool equal(InputIter1 first1, InputIter1 last1, InputIter2 first2,
InputIter2 last2) {
return absl::equal(first1, last1, first2, last2,
algorithm_internal::EqualTo{});
}
// linear_search()
//
// Performs a linear search for `value` using the iterator `first` up to
// but not including `last`, returning true if [`first`, `last`) contains an
// element equal to `value`.
//
// A linear search is of O(n) complexity which is guaranteed to make at most
// n = (`last` - `first`) comparisons. A linear search over short containers
// may be faster than a binary search, even when the container is sorted.
template <typename InputIterator, typename EqualityComparable>
bool linear_search(InputIterator first, InputIterator last,
const EqualityComparable& value) {
return std::find(first, last, value) != last;
}
// rotate()
//
// Performs a left rotation on a range of elements (`first`, `last`) such that
// `middle` is now the first element. `rotate()` returns an iterator pointing to
// the first element before rotation. This function is exactly the same as
// `std::rotate`, but fixes a bug in gcc
// <= 4.9 where `std::rotate` returns `void` instead of an iterator.
//
// The complexity of this algorithm is the same as that of `std::rotate`, but if
// `ForwardIterator` is not a random-access iterator, then `absl::rotate`
// performs an additional pass over the range to construct the return value.
template <typename ForwardIterator>
ForwardIterator rotate(ForwardIterator first, ForwardIterator middle,
ForwardIterator last) {
return algorithm_internal::RotateImpl(
first, middle, last,
std::is_same<decltype(std::rotate(first, middle, last)),
ForwardIterator>());
}
ABSL_NAMESPACE_END
} // namespace absl
#endif // ABSL_ALGORITHM_ALGORITHM_H_