xref: /llvm-project/libcxx/test/support/string_literal.h (revision 7277b00a29f022594c372cfc39782339f5b7e732)
1*7277b00aSMark de Wever //===----------------------------------------------------------------------===//
2*7277b00aSMark de Wever //
3*7277b00aSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*7277b00aSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5*7277b00aSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*7277b00aSMark de Wever //
7*7277b00aSMark de Wever //===----------------------------------------------------------------------===//
8*7277b00aSMark de Wever 
9*7277b00aSMark de Wever #ifndef SUPPORT_TEST_STRING_LITERAL_H
10*7277b00aSMark de Wever #define SUPPORT_TEST_STRING_LITERAL_H
11*7277b00aSMark de Wever 
12*7277b00aSMark de Wever #include "test_macros.h"
13*7277b00aSMark de Wever 
14*7277b00aSMark de Wever #include <algorithm>
15*7277b00aSMark de Wever #include <concepts>
16*7277b00aSMark de Wever #include <string_view>
17*7277b00aSMark de Wever 
18*7277b00aSMark de Wever #if TEST_STD_VER > 17
19*7277b00aSMark de Wever 
20*7277b00aSMark de Wever /// Helper class to "transfer" a string literal
21*7277b00aSMark de Wever ///
22*7277b00aSMark de Wever /// The MAKE_STRING helper macros turn a string literal into a const char*.
23*7277b00aSMark de Wever /// This is an issue when testing std::format; its format-string needs a string
24*7277b00aSMark de Wever /// literal for compile-time validation. This class does the job.
25*7277b00aSMark de Wever ///
26*7277b00aSMark de Wever /// \note The class assumes a wchar_t can be initialized from a char.
27*7277b00aSMark de Wever /// \note All members are public to avoid compilation errors.
28*7277b00aSMark de Wever template <std::size_t N>
29*7277b00aSMark de Wever struct string_literal {
string_literalstring_literal30*7277b00aSMark de Wever   consteval /*implicit*/ string_literal(const char (&str)[N + 1]) {
31*7277b00aSMark de Wever     std::copy_n(str, N + 1, data_);
32*7277b00aSMark de Wever #  ifndef TEST_HAS_NO_WIDE_CHARACTERS
33*7277b00aSMark de Wever     std::copy_n(str, N + 1, wdata_);
34*7277b00aSMark de Wever #  endif
35*7277b00aSMark de Wever   }
36*7277b00aSMark de Wever 
37*7277b00aSMark de Wever   template <class CharT>
svstring_literal38*7277b00aSMark de Wever   consteval std::basic_string_view<CharT> sv() const {
39*7277b00aSMark de Wever     if constexpr (std::same_as<CharT, char>)
40*7277b00aSMark de Wever       return std::basic_string_view{data_};
41*7277b00aSMark de Wever #  ifndef TEST_HAS_NO_WIDE_CHARACTERS
42*7277b00aSMark de Wever     else
43*7277b00aSMark de Wever       return std::basic_string_view{wdata_};
44*7277b00aSMark de Wever #  endif
45*7277b00aSMark de Wever   }
46*7277b00aSMark de Wever 
47*7277b00aSMark de Wever   char data_[N + 1];
48*7277b00aSMark de Wever #  ifndef TEST_HAS_NO_WIDE_CHARACTERS
49*7277b00aSMark de Wever   wchar_t wdata_[N + 1];
50*7277b00aSMark de Wever #  endif
51*7277b00aSMark de Wever };
52*7277b00aSMark de Wever 
53*7277b00aSMark de Wever template <std::size_t N>
54*7277b00aSMark de Wever string_literal(const char (&str)[N]) -> string_literal<N - 1>;
55*7277b00aSMark de Wever 
56*7277b00aSMark de Wever #endif // TEST_STD_VER > 17
57*7277b00aSMark de Wever 
58*7277b00aSMark de Wever #endif // SUPPORT_TEST_STRING_LITERAL_H
59