18c6b2489SKonstantin Boyarinov //===----------------------------------------------------------------------===//
28c6b2489SKonstantin Boyarinov //
38c6b2489SKonstantin Boyarinov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48c6b2489SKonstantin Boyarinov // See https://llvm.org/LICENSE.txt for license information.
58c6b2489SKonstantin Boyarinov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68c6b2489SKonstantin Boyarinov //
78c6b2489SKonstantin Boyarinov //===----------------------------------------------------------------------===//
88c6b2489SKonstantin Boyarinov 
98c6b2489SKonstantin Boyarinov // <vector>
108c6b2489SKonstantin Boyarinov 
118c6b2489SKonstantin Boyarinov // reverse_iterator       rbegin();
128c6b2489SKonstantin Boyarinov // reverse_iterator       rend();
138c6b2489SKonstantin Boyarinov // const_reverse_iterator rbegin()  const;
148c6b2489SKonstantin Boyarinov // const_reverse_iterator rend()    const;
158c6b2489SKonstantin Boyarinov // const_reverse_iterator crbegin() const;
168c6b2489SKonstantin Boyarinov // const_reverse_iterator crend()   const;
178c6b2489SKonstantin Boyarinov 
188c6b2489SKonstantin Boyarinov #include <vector>
198c6b2489SKonstantin Boyarinov #include <cassert>
208c6b2489SKonstantin Boyarinov #include <iterator>
218c6b2489SKonstantin Boyarinov 
228c6b2489SKonstantin Boyarinov #include "min_allocator.h"
238c6b2489SKonstantin Boyarinov 
248c6b2489SKonstantin Boyarinov template <class Vector>
check_vector_reverse_iterators()25*c74059c5SNikolas Klauser TEST_CONSTEXPR_CXX20 void check_vector_reverse_iterators() {
268c6b2489SKonstantin Boyarinov     {
278c6b2489SKonstantin Boyarinov         Vector vec;
288c6b2489SKonstantin Boyarinov         assert(vec.rbegin() == vec.rend());
298c6b2489SKonstantin Boyarinov         assert(vec.crbegin() == vec.crend());
308c6b2489SKonstantin Boyarinov     }
318c6b2489SKonstantin Boyarinov     {
328c6b2489SKonstantin Boyarinov         const int n = 10;
338c6b2489SKonstantin Boyarinov         Vector vec;
348c6b2489SKonstantin Boyarinov         const Vector& cvec = vec;
358c6b2489SKonstantin Boyarinov         vec.reserve(n);
368c6b2489SKonstantin Boyarinov         for (int i = 0; i < n; ++i)
378c6b2489SKonstantin Boyarinov             vec.push_back(i);
388c6b2489SKonstantin Boyarinov         {
398c6b2489SKonstantin Boyarinov             int iterations = 0;
408c6b2489SKonstantin Boyarinov 
418c6b2489SKonstantin Boyarinov             for (typename Vector::const_reverse_iterator it = vec.crbegin(); it != vec.crend(); ++it) {
428c6b2489SKonstantin Boyarinov                 assert(*it == (n - iterations - 1));
438c6b2489SKonstantin Boyarinov                 ++iterations;
448c6b2489SKonstantin Boyarinov             }
458c6b2489SKonstantin Boyarinov             assert(iterations == n);
468c6b2489SKonstantin Boyarinov         }
478c6b2489SKonstantin Boyarinov         {
488c6b2489SKonstantin Boyarinov             assert(cvec.rbegin() == vec.crbegin());
498c6b2489SKonstantin Boyarinov             assert(cvec.rend() == vec.crend());
508c6b2489SKonstantin Boyarinov         }
518c6b2489SKonstantin Boyarinov         {
528c6b2489SKonstantin Boyarinov             int iterations = 0;
538c6b2489SKonstantin Boyarinov 
548c6b2489SKonstantin Boyarinov             for (typename Vector::reverse_iterator it = vec.rbegin(); it != vec.rend(); ++it) {
558c6b2489SKonstantin Boyarinov                 assert(*it == (n - iterations - 1));
568c6b2489SKonstantin Boyarinov                 *it = 40;
578c6b2489SKonstantin Boyarinov                 assert(*it == 40);
588c6b2489SKonstantin Boyarinov                 ++iterations;
598c6b2489SKonstantin Boyarinov             }
608c6b2489SKonstantin Boyarinov             assert(iterations == n);
618c6b2489SKonstantin Boyarinov         }
628c6b2489SKonstantin Boyarinov 
638c6b2489SKonstantin Boyarinov         assert(std::distance(vec.rbegin(), vec.rend()) == n);
648c6b2489SKonstantin Boyarinov         assert(std::distance(cvec.rbegin(), cvec.rend()) == n);
658c6b2489SKonstantin Boyarinov         assert(std::distance(vec.crbegin(), vec.crend()) == n);
668c6b2489SKonstantin Boyarinov         assert(std::distance(cvec.crbegin(), cvec.crend()) == n);
678c6b2489SKonstantin Boyarinov     }
688c6b2489SKonstantin Boyarinov }
698c6b2489SKonstantin Boyarinov 
test()70*c74059c5SNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
718c6b2489SKonstantin Boyarinov     check_vector_reverse_iterators<std::vector<int> >();
728c6b2489SKonstantin Boyarinov #if TEST_STD_VER >= 11
738c6b2489SKonstantin Boyarinov     check_vector_reverse_iterators<std::vector<int, min_allocator<int> > >();
748c6b2489SKonstantin Boyarinov #endif
758c6b2489SKonstantin Boyarinov 
76*c74059c5SNikolas Klauser     return true;
77*c74059c5SNikolas Klauser }
78*c74059c5SNikolas Klauser 
main(int,char **)79*c74059c5SNikolas Klauser int main(int, char**) {
80*c74059c5SNikolas Klauser     test();
81*c74059c5SNikolas Klauser #if TEST_STD_VER > 17
82*c74059c5SNikolas Klauser     static_assert(test());
83*c74059c5SNikolas Klauser #endif
84*c74059c5SNikolas Klauser 
858c6b2489SKonstantin Boyarinov     return 0;
868c6b2489SKonstantin Boyarinov }
87