1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10
11// <flat_set>
12
13// reverse_iterator rbegin() noexcept;
14// const_reverse_iterator rbegin() const noexcept;
15// reverse_iterator rend() noexcept;
16// const_reverse_iterator rend() const noexcept;
17//
18// const_reverse_iterator crbegin() const noexcept;
19// const_reverse_iterator crend() const noexcept;
20
21#include <cassert>
22#include <deque>
23#include <flat_set>
24#include <functional>
25
26#include <iterator>
27
28#include "test_macros.h"
29
30void test() {
31 {
32 using M = std::flat_set<int, std::less<int>, std::deque<int>>;
33 M m = {1, 2, 3, 4};
34 const M& cm = m;
35 ASSERT_SAME_TYPE(decltype(m.rbegin()), M::reverse_iterator);
36 ASSERT_SAME_TYPE(decltype(m.crbegin()), M::const_reverse_iterator);
37 ASSERT_SAME_TYPE(decltype(cm.rbegin()), M::const_reverse_iterator);
38 ASSERT_SAME_TYPE(decltype(m.rend()), M::reverse_iterator);
39 ASSERT_SAME_TYPE(decltype(m.crend()), M::const_reverse_iterator);
40 ASSERT_SAME_TYPE(decltype(cm.rend()), M::const_reverse_iterator);
41 static_assert(noexcept(m.rbegin()));
42 static_assert(noexcept(cm.rbegin()));
43 static_assert(noexcept(m.crbegin()));
44 static_assert(noexcept(m.rend()));
45 static_assert(noexcept(cm.rend()));
46 static_assert(noexcept(m.crend()));
47 assert(m.size() == 4);
48 assert(std::distance(m.rbegin(), m.rend()) == 4);
49 assert(std::distance(cm.rbegin(), cm.rend()) == 4);
50 assert(std::distance(m.crbegin(), m.crend()) == 4);
51 assert(std::distance(cm.crbegin(), cm.crend()) == 4);
52 M::reverse_iterator i; // default-construct
53 ASSERT_SAME_TYPE(decltype(*i), const int&);
54 i = m.rbegin(); // move-assignment
55 M::const_reverse_iterator k = i; // converting constructor
56 assert(i == k); // comparison
57 for (int j = 4; j >= 1; --j, ++i) { // pre-increment
58 assert(*i == j);
59 }
60 assert(i == m.rend());
61 for (int j = 1; j <= 4; ++j) {
62 --i; // pre-decrement
63 assert(*i == j);
64 }
65 assert(i == m.rbegin());
66 }
67 {
68 // N3644 testing
69 using C = std::flat_set<int>;
70 C::reverse_iterator ii1{}, ii2{};
71 C::reverse_iterator ii4 = ii1;
72 C::const_reverse_iterator cii{};
73 assert(ii1 == ii2);
74 assert(ii1 == ii4);
75 assert(!(ii1 != ii2));
76
77 assert((ii1 == cii));
78 assert((cii == ii1));
79 assert(!(ii1 != cii));
80 assert(!(cii != ii1));
81 }
82}
83
84int main(int, char**) {
85 test();
86
87 return 0;
88}
89

source code of libcxx/test/std/containers/container.adaptors/flat.set/flat.set.iterators/reverse_iterator.pass.cpp