forked from OSchip/llvm-project
[ADT] use is_base_of inplace of is_same for random_access_iterator_tag checks
Replace `std::is_same<X, std::random_access_iterator_tag>` with `std::is_base_of<std::random_access_iterator_tag, X>` in STLExtra algos. This doesn't have too much impact on LLVM internally as no structs derive from it. However external projects embedding LLVM may use `std::contiguous_iterator_tag` which should be considered by these algorithms. As well as any other potential tags people want to define derived from `std::random_access_iterator_tag` Reviewed By: dblaikie Differential Revision: https://reviews.llvm.org/D84141
This commit is contained in:
parent
62ccfb6ed0
commit
1890a65ca1
|
@ -1462,10 +1462,11 @@ inline void sort(Container &&C, Compare Comp) {
|
|||
/// which is only enabled when the operation is O(1).
|
||||
template <typename R>
|
||||
auto size(R &&Range,
|
||||
std::enable_if_t<std::is_same<typename std::iterator_traits<decltype(
|
||||
Range.begin())>::iterator_category,
|
||||
std::random_access_iterator_tag>::value,
|
||||
void> * = nullptr) {
|
||||
std::enable_if_t<
|
||||
std::is_base_of<std::random_access_iterator_tag,
|
||||
typename std::iterator_traits<decltype(
|
||||
Range.begin())>::iterator_category>::value,
|
||||
void> * = nullptr) {
|
||||
return std::distance(Range.begin(), Range.end());
|
||||
}
|
||||
|
||||
|
@ -1902,16 +1903,16 @@ decltype(auto) apply_tuple(F &&f, Tuple &&t) {
|
|||
/// Return true if the sequence [Begin, End) has exactly N items. Runs in O(N)
|
||||
/// time. Not meant for use with random-access iterators.
|
||||
/// Can optionally take a predicate to filter lazily some items.
|
||||
template<typename IterTy,
|
||||
typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)>
|
||||
template <typename IterTy,
|
||||
typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)>
|
||||
bool hasNItems(
|
||||
IterTy &&Begin, IterTy &&End, unsigned N,
|
||||
Pred &&ShouldBeCounted =
|
||||
[](const decltype(*std::declval<IterTy>()) &) { return true; },
|
||||
std::enable_if_t<
|
||||
!std::is_same<typename std::iterator_traits<std::remove_reference_t<
|
||||
decltype(Begin)>>::iterator_category,
|
||||
std::random_access_iterator_tag>::value,
|
||||
!std::is_base_of<std::random_access_iterator_tag,
|
||||
typename std::iterator_traits<std::remove_reference_t<
|
||||
decltype(Begin)>>::iterator_category>::value,
|
||||
void> * = nullptr) {
|
||||
for (; N; ++Begin) {
|
||||
if (Begin == End)
|
||||
|
@ -1927,16 +1928,16 @@ bool hasNItems(
|
|||
/// Return true if the sequence [Begin, End) has N or more items. Runs in O(N)
|
||||
/// time. Not meant for use with random-access iterators.
|
||||
/// Can optionally take a predicate to lazily filter some items.
|
||||
template<typename IterTy,
|
||||
typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)>
|
||||
template <typename IterTy,
|
||||
typename Pred = bool (*)(const decltype(*std::declval<IterTy>()) &)>
|
||||
bool hasNItemsOrMore(
|
||||
IterTy &&Begin, IterTy &&End, unsigned N,
|
||||
Pred &&ShouldBeCounted =
|
||||
[](const decltype(*std::declval<IterTy>()) &) { return true; },
|
||||
std::enable_if_t<
|
||||
!std::is_same<typename std::iterator_traits<std::remove_reference_t<
|
||||
decltype(Begin)>>::iterator_category,
|
||||
std::random_access_iterator_tag>::value,
|
||||
!std::is_base_of<std::random_access_iterator_tag,
|
||||
typename std::iterator_traits<std::remove_reference_t<
|
||||
decltype(Begin)>>::iterator_category>::value,
|
||||
void> * = nullptr) {
|
||||
for (; N; ++Begin) {
|
||||
if (Begin == End)
|
||||
|
|
Loading…
Reference in New Issue