brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 278d702 Raw
183 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// iterator       begin();12// iterator       end();13// const_iterator begin()  const;14// const_iterator end()    const;15// const_iterator cbegin() const;16// const_iterator cend()   const;17 18#include <vector>19#include <cassert>20#include <iterator>21 22#include "test_macros.h"23#include "min_allocator.h"24 25TEST_CONSTEXPR_CXX20 bool tests() {26  using IterRefT = std::iterator_traits<std::vector<bool>::iterator>::reference;27  ASSERT_SAME_TYPE(IterRefT, std::vector<bool>::reference);28 29  using ConstIterRefT = std::iterator_traits<std::vector<bool>::const_iterator>::reference;30#if !defined(_LIBCPP_VERSION) || defined(_LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL)31  ASSERT_SAME_TYPE(ConstIterRefT, bool);32#else33  ASSERT_SAME_TYPE(ConstIterRefT, std::__bit_const_reference<std::vector<bool> >);34#endif35  {36    typedef bool T;37    typedef std::vector<T> C;38    C c;39    C::iterator i = c.begin();40    C::iterator j = c.end();41    assert(std::distance(i, j) == 0);42    assert(i == j);43  }44  {45    typedef bool T;46    typedef std::vector<T> C;47    const C c;48    C::const_iterator i = c.begin();49    C::const_iterator j = c.end();50    assert(std::distance(i, j) == 0);51    assert(i == j);52  }53  {54    typedef bool T;55    typedef std::vector<T> C;56    C c;57    C::const_iterator i = c.cbegin();58    C::const_iterator j = c.cend();59    assert(std::distance(i, j) == 0);60    assert(i == j);61    assert(i == c.end());62  }63  {64    typedef bool T;65    typedef std::vector<T> C;66    C::iterator i;67    C::const_iterator j;68    (void)i;69    (void)j;70  }71#if TEST_STD_VER >= 1172  {73    typedef bool T;74    typedef std::vector<T, min_allocator<T>> C;75    C c;76    C::iterator i = c.begin();77    C::iterator j = c.end();78    assert(std::distance(i, j) == 0);79 80    assert(i == j);81    assert(!(i != j));82 83    assert(!(i < j));84    assert((i <= j));85 86    assert(!(i > j));87    assert((i >= j));88 89#  if TEST_STD_VER >= 2090    // P1614 + LWG335291    std::same_as<std::strong_ordering> decltype(auto) r = i <=> j;92    assert(r == std::strong_ordering::equal);93#  endif94  }95  {96    typedef bool T;97    typedef std::vector<T, min_allocator<T>> C;98    const C c;99    C::const_iterator i = c.begin();100    C::const_iterator j = c.end();101    assert(std::distance(i, j) == 0);102 103    assert(i == j);104    assert(!(i != j));105 106    assert(!(i < j));107    assert((i <= j));108 109    assert(!(i > j));110    assert((i >= j));111 112#  if TEST_STD_VER >= 20113    // P1614 + LWG3352114    std::same_as<std::strong_ordering> decltype(auto) r = i <=> j;115    assert(r == std::strong_ordering::equal);116#  endif117  }118  {119    typedef bool T;120    typedef std::vector<T, min_allocator<T>> C;121    C c;122    C::const_iterator i = c.cbegin();123    C::const_iterator j = c.cend();124    assert(std::distance(i, j) == 0);125    assert(i == j);126    assert(i == c.end());127  }128  {129    typedef bool T;130    typedef std::vector<T, min_allocator<T>> C;131    C::iterator i;132    C::const_iterator j;133    (void)i;134    (void)j;135  }136#endif137#if TEST_STD_VER > 11138  { // N3644 testing139    std::vector<bool>::iterator ii1{}, ii2{};140    std::vector<bool>::iterator ii4 = ii1;141    std::vector<bool>::const_iterator cii{};142    assert(ii1 == ii2);143    assert(ii1 == ii4);144 145    assert(!(ii1 != ii2));146 147    assert((ii1 == cii));148    assert((cii == ii1));149    assert(!(ii1 != cii));150    assert(!(cii != ii1));151    assert(!(ii1 < cii));152    assert(!(cii < ii1));153    assert((ii1 <= cii));154    assert((cii <= ii1));155    assert(!(ii1 > cii));156    assert(!(cii > ii1));157    assert((ii1 >= cii));158    assert((cii >= ii1));159    assert(cii - ii1 == 0);160    assert(ii1 - cii == 0);161 162#  if TEST_STD_VER >= 20163    // P1614 + LWG3352164    std::same_as<std::strong_ordering> decltype(auto) r1 = ii1 <=> ii2;165    assert(r1 == std::strong_ordering::equal);166 167    std::same_as<std::strong_ordering> decltype(auto) r2 = cii <=> ii2;168    assert(r2 == std::strong_ordering::equal);169#  endif // TEST_STD_VER > 20170  }171#endif172 173  return true;174}175 176int main(int, char**) {177  tests();178#if TEST_STD_VER > 17179  static_assert(tests());180#endif181  return 0;182}183