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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef TEST_STD_INPUTOUTPUT_STRINGSTREAMS_HELPER_TYPES_H 10 #define TEST_STD_INPUTOUTPUT_STRINGSTREAMS_HELPER_TYPES_H 11 12 #include <string_view> 13 #include <concepts> 14 15 #include "test_macros.h" 16 17 template <typename CharT, class Traits = std::char_traits<CharT>> 18 class ConstConvertibleStringView { 19 public: ConstConvertibleStringView(const CharT * cs)20 explicit ConstConvertibleStringView(const CharT* cs) : cs_{cs} {} 21 22 operator std::basic_string_view<CharT, Traits>() = delete; 23 operator std::basic_string_view<CharT, Traits>() const { return std::basic_string_view<CharT, Traits>(cs_); } 24 25 private: 26 const CharT* cs_; 27 }; 28 29 static_assert(!std::constructible_from<std::basic_string_view<char>, ConstConvertibleStringView<char>>); 30 static_assert(!std::convertible_to<ConstConvertibleStringView<char>, std::basic_string_view<char>>); 31 32 static_assert(std::constructible_from<std::basic_string_view<char>, const ConstConvertibleStringView<char>>); 33 static_assert(std::convertible_to<const ConstConvertibleStringView<char>, std::basic_string_view<char>>); 34 35 #ifndef TEST_HAS_NO_WIDE_CHARACTERS 36 static_assert(!std::constructible_from<std::basic_string_view<wchar_t>, ConstConvertibleStringView<wchar_t>>); 37 static_assert(!std::convertible_to<ConstConvertibleStringView<wchar_t>, std::basic_string_view<wchar_t>>); 38 39 static_assert(std::constructible_from<std::basic_string_view<wchar_t>, const ConstConvertibleStringView<wchar_t>>); 40 static_assert(std::convertible_to<const ConstConvertibleStringView<wchar_t>, std::basic_string_view<wchar_t>>); 41 #endif 42 43 template <typename CharT, class Traits = std::char_traits<CharT>> 44 class NonConstConvertibleStringView { 45 public: NonConstConvertibleStringView(const CharT * cs)46 explicit NonConstConvertibleStringView(const CharT* cs) : cs_{cs} {} 47 48 operator std::basic_string_view<CharT, Traits>() { return std::basic_string_view<CharT, Traits>(cs_); } 49 operator std::basic_string_view<CharT, Traits>() const = delete; 50 51 private: 52 const CharT* cs_; 53 }; 54 55 static_assert(std::constructible_from<std::basic_string_view<char>, NonConstConvertibleStringView<char>>); 56 static_assert(std::convertible_to<NonConstConvertibleStringView<char>, std::basic_string_view<char>>); 57 58 static_assert(!std::constructible_from<std::basic_string_view<char>, const NonConstConvertibleStringView<char>>); 59 static_assert(!std::convertible_to<const NonConstConvertibleStringView<char>, std::basic_string_view<char>>); 60 61 #ifndef TEST_HAS_NO_WIDE_CHARACTERS 62 static_assert(std::constructible_from<std::basic_string_view<wchar_t>, NonConstConvertibleStringView<wchar_t>>); 63 static_assert(std::convertible_to<NonConstConvertibleStringView<wchar_t>, std::basic_string_view<wchar_t>>); 64 65 static_assert(!std::constructible_from<std::basic_string_view<wchar_t>, const NonConstConvertibleStringView<wchar_t>>); 66 static_assert(!std::convertible_to<const NonConstConvertibleStringView<wchar_t>, std::basic_string_view<wchar_t>>); 67 #endif 68 69 struct SomeObject {}; 70 71 struct NonMode {}; 72 73 struct NonAllocator {}; 74 75 #endif // TEST_STD_INPUTOUTPUT_STRINGSTREAMS_HELPER_TYPES_H 76