brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · efee03d Raw
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