brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 13a7628 Raw
93 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// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// <span>12 13// class iterator14 15#include <cassert>16#include <concepts>17#include <iterator>18#include <span>19#include <string>20#include <version> // __cpp_lib_ranges_as_const is not defined in span.21 22#include "test_macros.h"23 24template <class T>25constexpr void test_type() {26  using C = std::span<T>;27  typename C::iterator ii1{}, ii2{};28  typename C::iterator ii4 = ii1;29  // TODO Test against C++23 after implementing30  //  P2278R4 cbegin should always return a constant iterator31  // The means adjusting the #ifdef to guard against C++23.32#ifdef __cpp_lib_ranges_as_const33  typename C::const_iterator cii{};34#endif35  assert(ii1 == ii2);36  assert(ii1 == ii4);37#ifdef __cpp_lib_ranges_as_const38  assert(ii1 == cii);39#endif40 41  assert(!(ii1 != ii2));42#ifdef __cpp_lib_ranges_as_const43  assert(!(ii1 != cii));44#endif45 46  T v;47  C c{&v, 1};48  assert(c.begin() == std::begin(c));49  assert(c.rbegin() == std::rbegin(c));50#ifdef __cpp_lib_ranges_as_const51  assert(c.cbegin() == std::cbegin(c));52  assert(c.crbegin() == std::crbegin(c));53#endif54 55  assert(c.end() == std::end(c));56  assert(c.rend() == std::rend(c));57#ifdef __cpp_lib_ranges_as_const58  assert(c.cend() == std::cend(c));59  assert(c.crend() == std::crend(c));60#endif61 62  assert(std::begin(c) != std::end(c));63  assert(std::rbegin(c) != std::rend(c));64#ifdef __cpp_lib_ranges_as_const65  assert(std::cbegin(c) != std::cend(c));66  assert(std::crbegin(c) != std::crend(c));67#endif68 69  // P1614 + LWG335270  std::same_as<std::strong_ordering> decltype(auto) r1 = ii1 <=> ii2;71  assert(r1 == std::strong_ordering::equal);72 73#ifdef __cpp_lib_ranges_as_const74  std::same_as<std::strong_ordering> decltype(auto) r2 = cii <=> ii2;75  assert(r2 == std::strong_ordering::equal);76#endif77}78 79constexpr bool test() {80  test_type<char>();81  test_type<int>();82  test_type<std::string>();83 84  return true;85}86 87int main(int, char**) {88  test();89  static_assert(test(), "");90 91  return 0;92}93