Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions libcxx/include/__iterator/reverse_iterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,12 @@ class _LIBCPP_TEMPLATE_VIS reverse_iterator
_LIBCPP_HIDE_FROM_ABI constexpr pointer operator->() const
requires is_pointer_v<_Iter> || requires(const _Iter __i) { __i.operator->(); }
{
_Iter __tmp = current;
--__tmp;
if constexpr (is_pointer_v<_Iter>) {
return std::prev(current);
return __tmp;
} else {
return std::prev(current).operator->();
return __tmp.operator->();
}
}
#else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ TEST_CONSTEXPR_CXX17 bool tests() {
test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1), false);
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true);
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false);
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s), true);
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s+1), false);
#endif
test(s, s, true);
test(s, s+1, false);
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ TEST_CONSTEXPR_CXX17 bool tests() {
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true);
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true);
test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), false);
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s), true);
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s+1), true);
test(cpp20_random_access_iterator<const char*>(s+1), cpp20_random_access_iterator<const char*>(s), false);
#endif
test(s, s, true);
test(s, s+1, true);
test(s+1, s, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ TEST_CONSTEXPR_CXX17 bool tests() {
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false);
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true);
test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), false);
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s), false);
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s+1), true);
test(cpp20_random_access_iterator<const char*>(s+1), cpp20_random_access_iterator<const char*>(s), false);
#endif
test(s, s, false);
test(s, s+1, true);
test(s+1, s, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ TEST_CONSTEXPR_CXX17 bool tests() {
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true);
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false);
test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), true);
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s), true);
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s+1), false);
test(cpp20_random_access_iterator<const char*>(s+1), cpp20_random_access_iterator<const char*>(s), true);
#endif
test(s, s, true);
test(s, s+1, false);
test(s+1, s, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ TEST_CONSTEXPR_CXX17 bool tests() {
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false);
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false);
test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), true);
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s), false);
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s+1), false);
test(cpp20_random_access_iterator<const char*>(s+1), cpp20_random_access_iterator<const char*>(s), true);
#endif
test(s, s, false);
test(s, s+1, false);
test(s+1, s, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ TEST_CONSTEXPR_CXX17 bool tests() {
test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1), true);
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false);
test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true);
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s), false);
test(cpp20_random_access_iterator<const char*>(s), cpp20_random_access_iterator<const char*>(s+1), true);
#endif
test(s, s, false);
test(s, s+1, true);
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ TEST_CONSTEXPR_CXX17 bool tests() {
Derived d;
test<bidirectional_iterator<Base*> >(bidirectional_iterator<Derived*>(&d));
test<random_access_iterator<const Base*> >(random_access_iterator<Derived*>(&d));
#if TEST_STD_VER >= 20
test<cpp20_random_access_iterator<const Base*> >(cpp20_random_access_iterator<Derived*>(&d));
#endif
test<Base*>(&d);

char c = '\0';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ TEST_CONSTEXPR_CXX17 void test() {
TEST_CONSTEXPR_CXX17 bool tests() {
test<bidirectional_iterator<const char*> >();
test<random_access_iterator<char*> >();
#if TEST_STD_VER >= 20
test<cpp20_random_access_iterator<char*> >();
#endif
test<char*>();
test<const char*>();
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ TEST_CONSTEXPR_CXX17 bool tests() {
const char s[] = "123";
test(bidirectional_iterator<const char*>(s));
test(random_access_iterator<const char*>(s));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s));
#endif
test(s);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ TEST_CONSTEXPR_CXX17 bool tests() {
Derived d;
test<bidirectional_iterator<Base*> >(bidirectional_iterator<Derived*>(&d));
test<random_access_iterator<const Base*> >(random_access_iterator<Derived*>(&d));
#if TEST_STD_VER >= 20
test<cpp20_random_access_iterator<const Base*> >(cpp20_random_access_iterator<Derived*>(&d));
#endif
test<Base*>(&d);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,28 @@
#include "test_macros.h"
#include "test_iterators.h"

TEST_CONSTEXPR_CXX17 bool test() {
typedef bidirectional_iterator<int*> Iter;
template <class Iter>
TEST_CONSTEXPR_CXX17 void test() {
int i = 0;
Iter iter(&i);
std::reverse_iterator<Iter> const reverse(iter);
std::reverse_iterator<Iter>::iterator_type base = reverse.base();
typename std::reverse_iterator<Iter>::iterator_type base = reverse.base();
assert(base == Iter(&i));
}

TEST_CONSTEXPR_CXX17 bool tests() {
test<bidirectional_iterator<int*> >();
test<random_access_iterator<int*> >();
#if TEST_STD_VER >= 20
test<cpp20_random_access_iterator<int*>>();
#endif
return true;
}

int main(int, char**) {
test();
tests();
#if TEST_STD_VER > 14
static_assert(test(), "");
static_assert(tests(), "");
#endif
return 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,54 @@

#include "test_macros.h"

#if TEST_STD_VER >= 20
template <class It>
class cpp20_bidirectional_iterator_with_arrow {
It it_;

public:
using iterator_category = std::input_iterator_tag;
using iterator_concept = std::bidirectional_iterator_tag;
using value_type = std::iterator_traits<It>::value_type;
using difference_type = std::iterator_traits<It>::difference_type;

cpp20_bidirectional_iterator_with_arrow() : it_() {}
explicit cpp20_bidirectional_iterator_with_arrow(It it) : it_(it) {}

decltype(auto) operator*() const { return *it_; }

auto operator->() const {
if constexpr (std::is_pointer_v<It>) {
return it_;
} else {
return it_.operator->();
}
}

cpp20_bidirectional_iterator_with_arrow& operator++() {
++it_;
return *this;
}
cpp20_bidirectional_iterator_with_arrow& operator--() {
--it_;
return *this;
}
cpp20_bidirectional_iterator_with_arrow operator++(int) { return cpp20_bidirectional_iterator_with_arrow(it_++); }
cpp20_bidirectional_iterator_with_arrow operator--(int) { return cpp20_bidirectional_iterator_with_arrow(it_--); }

friend bool
operator==(const cpp20_bidirectional_iterator_with_arrow& x, const cpp20_bidirectional_iterator_with_arrow& y) {
return x.it_ == y.it_;
}
friend bool
operator!=(const cpp20_bidirectional_iterator_with_arrow& x, const cpp20_bidirectional_iterator_with_arrow& y) {
return x.it_ != y.it_;
}

friend It base(const cpp20_bidirectional_iterator_with_arrow& i) { return i.it_; }
};
#endif

class A
{
int data_;
Expand Down Expand Up @@ -113,6 +161,16 @@ int main(int, char**)

static_assert(it1->get() == gC.get(), "");
}
#endif
#if TEST_STD_VER >= 20
{
// The underlying iterator models c++20 bidirectional_iterator,
// but does not satisfy c++17 BidirectionalIterator named requirement
B data[] = {1, 2, 3};
cpp20_bidirectional_iterator_with_arrow<B*> iter(data + 3);
auto ri = std::make_reverse_iterator(iter);
assert(ri->get() == 3);
}
#endif
{
((void)gC);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ TEST_CONSTEXPR_CXX17 bool tests() {
const char* s = "1234567890";
test(random_access_iterator<const char*>(s+5), 4, '1');
test(random_access_iterator<const char*>(s+5), 0, '5');
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+5), 4, '1');
test(cpp20_random_access_iterator<const char*>(s+5), 0, '5');
#endif
test(s+5, 4, '1');
test(s+5, 0, '5');
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <cassert>

#include "test_macros.h"
#include "test_iterators.h"

class A
{
Expand All @@ -47,6 +48,10 @@ int main(int, char**)
{
A a;
test(&a+1, A());
test(random_access_iterator<A*>(&a+1), A());
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<A*>(&a+1), A());
#endif

#if TEST_STD_VER > 14
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ TEST_CONSTEXPR_CXX17 void test(It i, typename std::iterator_traits<It>::differen
TEST_CONSTEXPR_CXX17 bool tests() {
const char* s = "1234567890";
test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+5), 5, cpp20_random_access_iterator<const char*>(s+10));
#endif
test(s+5, 5, s+10);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ TEST_CONSTEXPR_CXX17 void test(It i, typename std::iterator_traits<It>::differen
TEST_CONSTEXPR_CXX17 bool tests() {
char const* s = "1234567890";
test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+5), 5, cpp20_random_access_iterator<const char*>(s));
#endif
test(s+5, 5, s);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ TEST_CONSTEXPR_CXX17 void test(It i, typename std::iterator_traits<It>::differen
TEST_CONSTEXPR_CXX17 bool tests() {
const char* s = "1234567890";
test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+5), 5, cpp20_random_access_iterator<const char*>(s+10));
#endif
test(s+5, 5, s+10);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ TEST_CONSTEXPR_CXX17 void test(It i, typename std::iterator_traits<It>::differen
TEST_CONSTEXPR_CXX17 bool tests() {
const char* s = "1234567890";
test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+5), 5, cpp20_random_access_iterator<const char*>(s));
#endif
test(s+5, 5, s);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ TEST_CONSTEXPR_CXX17 bool tests() {
const char* s = "123";
test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s+2));
test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s+2));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+1), cpp20_random_access_iterator<const char*>(s+2));
#endif
test(s+1, s+2);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ TEST_CONSTEXPR_CXX17 bool tests() {
const char* s = "123";
test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s));
test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+1), cpp20_random_access_iterator<const char*>(s));
#endif
test(s+1, s);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ TEST_CONSTEXPR_CXX17 bool tests() {
const char* s = "123";
test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s+2));
test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s+2));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+1), cpp20_random_access_iterator<const char*>(s+2));
#endif
test(s+1, s+2);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ TEST_CONSTEXPR_CXX17 bool tests() {
const char* s = "123";
test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s));
test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s));
#if TEST_STD_VER >= 20
test(cpp20_random_access_iterator<const char*>(s+1), cpp20_random_access_iterator<const char*>(s));
#endif
test(s+1, s);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,27 @@
#include "test_iterators.h"

template <class It>
TEST_CONSTEXPR_CXX17 void test(It i) {
TEST_CONSTEXPR_CXX17 void test_one(It i) {
const std::reverse_iterator<It> r = std::make_reverse_iterator(i);
assert(r.base() == i);
}

TEST_CONSTEXPR_CXX17 bool tests() {
template <class It>
TEST_CONSTEXPR_CXX17 void test() {
const char* s = "1234567890";
random_access_iterator<const char*> b(s);
random_access_iterator<const char*> e(s+10);
It b(s);
It e(s+10);
while (b != e)
test (b++);
test_one (b++);
}

TEST_CONSTEXPR_CXX17 bool tests() {
test<const char*>();
test<bidirectional_iterator<const char*>>();
test<random_access_iterator<const char*>>();
#if TEST_STD_VER >= 20
test<cpp20_random_access_iterator<const char*>>();
#endif
return true;
}

Expand Down
Loading
Loading