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