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
17template <typename CharT, class Traits = std::char_traits<CharT>>
18class ConstConvertibleStringView {
19public:
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
25private:
26 const CharT* cs_;
27};
28
29static_assert(!std::constructible_from<std::basic_string_view<char>, ConstConvertibleStringView<char>>);
30static_assert(!std::convertible_to<ConstConvertibleStringView<char>, std::basic_string_view<char>>);
31
32static_assert(std::constructible_from<std::basic_string_view<char>, const ConstConvertibleStringView<char>>);
33static_assert(std::convertible_to<const ConstConvertibleStringView<char>, std::basic_string_view<char>>);
34
35#ifndef TEST_HAS_NO_WIDE_CHARACTERS
36static_assert(!std::constructible_from<std::basic_string_view<wchar_t>, ConstConvertibleStringView<wchar_t>>);
37static_assert(!std::convertible_to<ConstConvertibleStringView<wchar_t>, std::basic_string_view<wchar_t>>);
38
39static_assert(std::constructible_from<std::basic_string_view<wchar_t>, const ConstConvertibleStringView<wchar_t>>);
40static_assert(std::convertible_to<const ConstConvertibleStringView<wchar_t>, std::basic_string_view<wchar_t>>);
41#endif
42
43template <typename CharT, class Traits = std::char_traits<CharT>>
44class NonConstConvertibleStringView {
45public:
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
51private:
52 const CharT* cs_;
53};
54
55static_assert(std::constructible_from<std::basic_string_view<char>, NonConstConvertibleStringView<char>>);
56static_assert(std::convertible_to<NonConstConvertibleStringView<char>, std::basic_string_view<char>>);
57
58static_assert(!std::constructible_from<std::basic_string_view<char>, const NonConstConvertibleStringView<char>>);
59static_assert(!std::convertible_to<const NonConstConvertibleStringView<char>, std::basic_string_view<char>>);
60
61#ifndef TEST_HAS_NO_WIDE_CHARACTERS
62static_assert(std::constructible_from<std::basic_string_view<wchar_t>, NonConstConvertibleStringView<wchar_t>>);
63static_assert(std::convertible_to<NonConstConvertibleStringView<wchar_t>, std::basic_string_view<wchar_t>>);
64
65static_assert(!std::constructible_from<std::basic_string_view<wchar_t>, const NonConstConvertibleStringView<wchar_t>>);
66static_assert(!std::convertible_to<const NonConstConvertibleStringView<wchar_t>, std::basic_string_view<wchar_t>>);
67#endif
68
69struct SomeObject {};
70
71struct NonMode {};
72
73struct NonAllocator {};
74
75#endif // TEST_STD_INPUTOUTPUT_STRINGSTREAMS_HELPER_TYPES_H
76

source code of libcxx/test/std/input.output/string.streams/helper_types.h