132 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <vector>10 11// reference operator[](size_type __i);12// const_reference operator[](size_type __i) const;13//14// reference at(size_type __i);15// const_reference at(size_type __i) const;16//17// reference front();18// const_reference front() const;19//20// reference back();21// const_reference back() const;22// libc++ marks these as 'noexcept' (except 'at')23 24#include <vector>25#include <cassert>26#include <stdexcept>27 28#include "min_allocator.h"29#include "test_macros.h"30 31template <class C>32TEST_CONSTEXPR_CXX20 C make(int size, int start) {33 C c;34 for (int i = 0; i < size; ++i)35 c.push_back(start + i);36 return c;37}38 39template <class Vector>40TEST_CONSTEXPR_CXX20 void test_get_basic(Vector& c, int start_value) {41 const int n = static_cast<int>(c.size());42 for (int i = 0; i < n; ++i)43 assert(c[i] == start_value + i);44 for (int i = 0; i < n; ++i)45 assert(c.at(i) == start_value + i);46 47#ifndef TEST_HAS_NO_EXCEPTIONS48 if (!TEST_IS_CONSTANT_EVALUATED) {49 try {50 TEST_IGNORE_NODISCARD c.at(n);51 assert(false);52 } catch (const std::out_of_range&) {53 }54 }55#endif56 57 assert(c.front() == start_value);58 assert(c.back() == start_value + n - 1);59}60 61template <class Vector>62TEST_CONSTEXPR_CXX20 void test_get() {63 int start_value = 35;64 Vector c = make<Vector>(10, start_value);65 const Vector& cc = c;66 test_get_basic(c, start_value);67 test_get_basic(cc, start_value);68}69 70template <class Vector>71TEST_CONSTEXPR_CXX20 void test_set() {72 int start_value = 35;73 const int n = 10;74 Vector c = make<Vector>(n, start_value);75 76 for (int i = 0; i < n; ++i) {77 assert(c[i] == start_value + i);78 c[i] = start_value + i + 1;79 assert(c[i] == start_value + i + 1);80 }81 for (int i = 0; i < n; ++i) {82 assert(c.at(i) == start_value + i + 1);83 c.at(i) = start_value + i + 2;84 assert(c.at(i) == start_value + i + 2);85 }86 87 assert(c.front() == start_value + 2);88 c.front() = start_value + 3;89 assert(c.front() == start_value + 3);90 91 assert(c.back() == start_value + n + 1);92 c.back() = start_value + n + 2;93 assert(c.back() == start_value + n + 2);94}95 96template <class Vector>97TEST_CONSTEXPR_CXX20 void test() {98 test_get<Vector>();99 test_set<Vector>();100 101 Vector c;102 const Vector& cc = c;103 ASSERT_SAME_TYPE(typename Vector::reference, decltype(c[0]));104 ASSERT_SAME_TYPE(typename Vector::const_reference, decltype(cc[0]));105 106 ASSERT_SAME_TYPE(typename Vector::reference, decltype(c.at(0)));107 ASSERT_SAME_TYPE(typename Vector::const_reference, decltype(cc.at(0)));108 109 ASSERT_SAME_TYPE(typename Vector::reference, decltype(c.front()));110 ASSERT_SAME_TYPE(typename Vector::const_reference, decltype(cc.front()));111 112 ASSERT_SAME_TYPE(typename Vector::reference, decltype(c.back()));113 ASSERT_SAME_TYPE(typename Vector::const_reference, decltype(cc.back()));114}115 116TEST_CONSTEXPR_CXX20 bool tests() {117 test<std::vector<int> >();118#if TEST_STD_VER >= 11119 test<std::vector<int, min_allocator<int> > >();120 test<std::vector<int, safe_allocator<int> > >();121#endif122 return true;123}124 125int main(int, char**) {126 tests();127#if TEST_STD_VER > 17128 static_assert(tests());129#endif130 return 0;131}132