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_map>
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_map>
24#include <functional>
25
26#include <iterator>
27
28#include "test_macros.h"
29
30int main(int, char**) {
31 {
32 using M = std::flat_map<int, char, std::less<int>, std::deque<int>, std::deque<char>>;
33 M m = {{1, 'a'}, {2, 'b'}, {3, 'c'}, {4, 'd'}};
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->first), const int&);
54 ASSERT_SAME_TYPE(decltype(i->second), char&);
55 i = m.rbegin(); // move-assignment
56 M::const_reverse_iterator k = i; // converting constructor
57 assert(i == k); // comparison
58 for (int j = 4; j >= 1; --j, ++i) { // pre-increment
59 assert(i->first == j); // operator->
60 assert(i->second == 'a' + j - 1);
61 }
62 assert(i == m.rend());
63 for (int j = 1; j <= 4; ++j) {
64 --i; // pre-decrement
65 assert((*i).first == j);
66 assert((*i).second == 'a' + j - 1);
67 }
68 assert(i == m.rbegin());
69 }
70 {
71 // N3644 testing
72 using C = std::flat_map<int, char>;
73 C::reverse_iterator ii1{}, ii2{};
74 C::reverse_iterator ii4 = ii1;
75 C::const_reverse_iterator cii{};
76 assert(ii1 == ii2);
77 assert(ii1 == ii4);
78 assert(!(ii1 != ii2));
79
80 assert((ii1 == cii));
81 assert((cii == ii1));
82 assert(!(ii1 != cii));
83 assert(!(cii != ii1));
84 }
85
86 return 0;
87}
88

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