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 KlauserTEST_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 KlauserTEST_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 Klauserint 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