brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 03b3b98 Raw
102 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// Starting with C++20 the spaceship operator was included. This tests10// comparison in that context, thus doesn't support older language versions.11// These are tested per operator.12 13// UNSUPPORTED: c++03, c++11, c++14, c++1714 15// <string>16 17// template<class charT, class traits, class Allocator>18//   see below operator<=>(const basic_string<charT, traits, Allocator>& lhs,19//                         const basic_string<charT, traits, Allocator>& rhs) noexcept;20// template<class charT, class traits, class Allocator>21//   see below operator<=>(const basic_string<charT, traits, Allocator>& lhs,22//                         const charT* rhs);23 24#include <string>25 26#include <array>27#include <cassert>28#include <string_view>29 30#include "constexpr_char_traits.h"31#include "make_string.h"32#include "test_comparisons.h"33#include "test_macros.h"34 35#define STR(S) MAKE_STRING(CharT, S)36 37template <class T, class Ordering = std::strong_ordering>38constexpr void test() {39  AssertOrderAreNoexcept<T>();40  AssertOrderReturn<Ordering, T>();41 42  using CharT = typename T::value_type;43  AssertOrderReturn<Ordering, T, const CharT*>();44 45  // sorted values46  std::array v{47      STR(""),48      STR("abc"),49      STR("abcdef"),50      STR("acb"),51  };52 53  // sorted values with embedded NUL character54  std::array vn{55      STR("abc"),56      STR("abc\0"),57      STR("abc\0def"),58      STR("acb\0"),59  };60  static_assert(v.size() == vn.size());61 62  for (std::size_t i = 0; i < v.size(); ++i) {63    for (std::size_t j = 0; j < v.size(); ++j) {64      assert(testOrder(v[i], v[j], i == j ? Ordering::equivalent : i < j ? Ordering::less : Ordering::greater));65 66      assert(testOrder(67          v[i],68          std::basic_string<CharT>{v[j]}.c_str(),69          i == j  ? Ordering::equivalent70          : i < j ? Ordering::less71                  : Ordering::greater));72 73      // NUL test omitted for c-strings since it will fail.74      assert(testOrder(vn[i], vn[j], i == j ? Ordering::equivalent : i < j ? Ordering::less : Ordering::greater));75    }76  }77}78 79constexpr bool test_all_types() {80  test<std::string>();81  test<std::basic_string<char, constexpr_char_traits<char>>, std::weak_ordering>();82#ifndef TEST_HAS_NO_WIDE_CHARACTERS83  test<std::wstring>();84  test<std::basic_string<wchar_t, constexpr_char_traits<wchar_t>>, std::weak_ordering>();85#endif86  test<std::u8string>();87  test<std::basic_string<char8_t, constexpr_char_traits<char8_t>>, std::weak_ordering>();88  test<std::u16string>();89  test<std::basic_string<char16_t, constexpr_char_traits<char16_t>>, std::weak_ordering>();90  test<std::u32string>();91  test<std::basic_string<char32_t, constexpr_char_traits<char32_t>>, std::weak_ordering>();92 93  return true;94}95 96int main(int, char**) {97  test_all_types();98  static_assert(test_all_types());99 100  return 0;101}102