brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 16832dd Raw
126 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 at(size_type n); // constexpr since C++2012 13#include <cassert>14#include <memory>15#include <vector>16 17#include "min_allocator.h"18#include "test_allocator.h"19#include "test_macros.h"20 21#ifndef TEST_HAS_NO_EXCEPTIONS22#  include <stdexcept>23#endif24 25template <typename Allocator>26TEST_CONSTEXPR_CXX20 void test() {27  using C         = std::vector<bool, Allocator>;28  using reference = typename C::reference;29  bool a[]        = {1, 0, 1, 0, 1};30  C v(a, a + sizeof(a) / sizeof(a[0]));31  ASSERT_SAME_TYPE(reference, decltype(v.at(0)));32  assert(v.at(0) == true);33  assert(v.at(1) == false);34  assert(v.at(2) == true);35  assert(v.at(3) == false);36  assert(v.at(4) == true);37  v.at(1) = 1;38  assert(v.at(1) == true);39  v.at(3) = 1;40  assert(v.at(3) == true);41}42 43template <typename Allocator>44void test_exception() {45#ifndef TEST_HAS_NO_EXCEPTIONS46  {47    bool a[] = {1, 0, 1, 1};48    using C  = std::vector<bool, Allocator>;49    C v(a, a + sizeof(a) / sizeof(a[0]));50 51    try {52      TEST_IGNORE_NODISCARD v.at(4);53      assert(false);54    } catch (std::out_of_range const&) {55      // pass56    } catch (...) {57      assert(false);58    }59 60    try {61      TEST_IGNORE_NODISCARD v.at(5);62      assert(false);63    } catch (std::out_of_range const&) {64      // pass65    } catch (...) {66      assert(false);67    }68 69    try {70      TEST_IGNORE_NODISCARD v.at(6);71      assert(false);72    } catch (std::out_of_range const&) {73      // pass74    } catch (...) {75      assert(false);76    }77 78    try {79      using size_type = typename C::size_type;80      TEST_IGNORE_NODISCARD v.at(static_cast<size_type>(-1));81      assert(false);82    } catch (std::out_of_range const&) {83      // pass84    } catch (...) {85      assert(false);86    }87  }88 89  {90    std::vector<bool, Allocator> v;91    try {92      TEST_IGNORE_NODISCARD v.at(0);93      assert(false);94    } catch (std::out_of_range const&) {95      // pass96    } catch (...) {97      assert(false);98    }99  }100#endif101}102 103TEST_CONSTEXPR_CXX20 bool tests() {104  test<std::allocator<bool> >();105  test<min_allocator<bool> >();106  test<test_allocator<bool> >();107  return true;108}109 110void test_exceptions() {111  test_exception<std::allocator<bool> >();112  test_exception<min_allocator<bool> >();113  test_exception<test_allocator<bool> >();114}115 116int main(int, char**) {117  tests();118  test_exceptions();119 120#if TEST_STD_VER >= 20121  static_assert(tests());122#endif123 124  return 0;125}126