xref: /llvm-project/libcxx/test/std/input.output/string.streams/helper_types.h (revision 80f9458cf30d13eef21b09042ea590945c5e64db)
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