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