16#include "CoreMinimal.h"
23#ifndef MCRO_TEXT_ALLOW_UNSUPPORTED_STRING_CONVERSION
29#define MCRO_TEXT_ALLOW_UNSUPPORTED_STRING_CONVERSION 0
41 class Traits = std::char_traits<CharT>,
42 class Allocator = std::allocator<CharT>
44 using TStdString = std::basic_string<CharT, Traits, Allocator>;
49 class Traits = std::char_traits<CharT>
69 || CSameAsDecayed<T, FAnsiString>
70 || CSameAsDecayed<T, FUtf8String>
75 concept CStringOrView = CSameAsDecayed<T, FString> || CSameAsDecayed<T, FStringView>;
90 template <
typename T,
typename CharType>
99 typename T::value_type,
100 typename T::traits_type
106 template <
typename T>
111 typename T::value_type,
112 typename T::traits_type
118 template <
typename T>
120 CConvertibleToDecayed<
123 typename T::value_type,
124 typename T::traits_type
134 typename CharFrom,
typename CharOutput,
136 CFunctionLike PtrGetter, CFunctionLike LengthGetter, CFunctionLike Constructor,
139 StringTo
HighLevelStringCast(
const StringFrom& strIn, PtrGetter&& getPtr, LengthGetter&& getLength, Constructor&& construct)
141 if constexpr (CSameAs<CharFrom, CharOutput>)
144 reinterpret_cast<const CharOutput*
>(getPtr()),
150 auto conversion = StringCast<CharOutput>(
151 reinterpret_cast<const CharFrom*
>(getPtr()),
155 reinterpret_cast<const CharOutput*
>(conversion.Get()),
139 StringTo
HighLevelStringCast(
const StringFrom& strIn, PtrGetter&& getPtr, LengthGetter&& getLength, Constructor&& construct) {
…}
163 template <
typename CharType>
166 return TStringView<CharType>(stdStr.data(), stdStr.size());
170 template <CStringViewInvariant T>
177 template <CConvertibleToDecayed<FString> T>
187 template <CStdStringOrViewInvariant T>
192 [&] {
return stdStr.data(); },
193 [&] {
return stdStr.length(); },
194 [](
const TCHAR* ptr, int32 len) {
return FString::ConstructFromPtrSize(ptr, len); }
203 template <CStdStringOrViewInvariant T>
208 [&] {
return stdStr.data(); },
209 [&] {
return stdStr.length(); },
210 [](
const TCHAR* ptr, int32 len) {
return FName(len, ptr); }
221 template <
typename ConvertTo>
224 if constexpr (CSameAs<TCHAR, ConvertTo>)
230 [&] {
return unrealStr.GetData(); },
231 [&] {
return unrealStr.Len(); },
232 [](
const ConvertTo* ptr, int32 len) {
return TStdString(ptr, len); }
238 template <
typename ConvertTo>
241 if constexpr (CSameAs<TCHAR, ConvertTo>)
247 [&] {
return stdStr.data(); },
248 [&] {
return stdStr.size(); },
249 [](
const ConvertTo* ptr, int32 len) {
return TStdString(ptr, len); }
255 template <
typename ConvertTo>
262 template <CStringOrView... Args>
263 FString
Join(
const TCHAR* separator, Args... args)
265 return FString::Join(
266 TArray<FString>{args...}.FilterByPredicate([](FStringView
const& str) {
return !str.IsEmpty(); }),
263 FString
Join(
const TCHAR* separator, Args... args) {
…}
275 template <
typename T>
279 template <
typename T>
286 template <
typename T>
292 template <
typename T>
295#if MCRO_TEXT_ALLOW_UNSUPPORTED_STRING_CONVERSION
296 template <CConvertibleToDecayed<T> Arg>
297 FStringView operator () (Arg&& left)
const
299 ensureAlwaysMsgf(
false,
300 TEXT(
"Given type %s couldn't be converted to a string. Typename is returned instead"),
309 template <
typename T>
316 template <
typename T>
324 template <CDirectStringFormatArgument Operand>
325 requires (!CEnum<Operand>)
328 template <CConvertibleToDecayed<Operand> Arg>
329 Operand operator () (Arg&& left)
const {
return left; }
332 template <CHasToString Operand>
335 template <CConvertibleToDecayed<Operand> Arg>
336 auto operator () (Arg&& left)
const {
return left.ToString(); }
339 template <CHasPtrToString Operand>
342 template <CConvertibleToDecayed<Operand> Arg>
343 auto operator () (Arg&& left)
const {
return left->ToString(); }
346 template <
typename CharType>
364 template <CStdStringViewInvariant Operand>
365 requires (!CSameAsDecayed<Operand, FStdStringView>)
368 template <CConvertibleToDecayed<Operand> Arg>
372 template <CStringFormatArgument T>
387 template <CStringFormatArgument T>
391 return MoveTemp(format.StringValue);
400 template <CStringFormatArgument... Args>
403 return FStringFormatOrderedArguments { FStringFormatArg(
AsFormatArgument(args)) ... };
412 template <CStringFormatArgument... Args>
415 return FStringFormatNamedArguments {
416 { args.template Get<0>(), FStringFormatArg(
AsFormatArgument(args.template Get<1>())) }
This header exists because STL headers in Android doesn't define STL concepts (other than same_as whi...
A type which is directly convertible to FStringFormatArg.
A type which which provides a ToString() member method.
A type which can be used with FStringFormatArg via a TAsFormatArgument specialization.
A type which which provides a ToString() member method.
Concept constraining given type to only a std::string of any character type.
Concept constraining given type to a std::string or a view of any character type.
Concept constraining given type to a std::string or a view of given character type.
Concept constraining given type to a std::string or a view of TCHAR.
Concept constraining given type to only a std::string_view of any character type.
A type which can be converted to FStringFormatArg via any method.
Concept constraining given type to a string of any character type.
Concept constraining given type to a string or a a view of any character type.
Concept constraining given type to a string, a view or an FName of TCHAR.
Concept constraining given type to a string or a a view of TCHAR.
Concept constraining given type to a string view of any character type.
typename TFunctionTraits< std::decay_t< T > >::Return TFunction_Return
Shorthand for getting a function return type.
StringTo HighLevelStringCast(const StringFrom &strIn, PtrGetter &&getPtr, LengthGetter &&getLength, Constructor &&construct)
Mixed text utilities and type traits.
FString Join(const TCHAR *separator, Args... args)
Join the given string arguments with a delimiter and skip empty entries.
FStringFormatNamedArguments NamedArguments(TTuple< FString, Args >... args)
Create a named argument list for a string format from input argument tuples.
MCRO_API FString DynamicPrintf(const TCHAR *fmt,...)
Copy of FString::PrintfImpl but not private so it can work with strings which were not literals.
TStdString< TCHAR > FStdString
cross-TCHAR alias for std::[w]string
TStringView< UTF16CHAR > FUtf16StringView
constexpr auto UnrealView(TStdStringView< CharType > const &stdStr)
View an STL string object via an Unreal TStringView
std::basic_string< CharT, Traits, Allocator > TStdString
Unreal style alias for STL strings.
FName UnrealNameConvert(T const &stdStr)
Create a copy and convert an input STL string to TCHAR as an FName.
FString UnrealConvert(T const &stdStr)
Create a copy and convert an input STL string to TCHAR.
MCRO_API FName UnrealNameCopy(FStdStringView const &stdStr)
Create a copy of an input STL string as an FName.
constexpr auto StdView(T const &unrealStr)
View an Unreal TStringView via an STL string view.
TStringView< UTF32CHAR > FUtf32StringView
MCRO_API FString UnrealCopy(FStdStringView const &stdStr)
Create a copy of an input STL string.
auto AsFormatArgument(T &&input)
FString AsString(T &&input)
Attempt to convert anything to string which can tell via some method how to do so.
auto StdConvert(FStringView const &unrealStr) -> TStdString< ConvertTo >
Create a copy and convert an input Unreal string to the given character type.
TStdStringView< TCHAR > FStdStringView
cross-TCHAR alias for std::[w]string_view
MCRO_API FStdString StdCopy(FStringView const &unrealStr)
Create an Stl copy of an input Unreal string view.
std::basic_string_view< CharT, Traits > TStdStringView
Unreal style alias for STL string views.
FStringFormatOrderedArguments OrderedArguments(Args &&... args)
Create an ordered argument list for a string format from input arguments.
constexpr FStringView TTypeName
Get a friendly string of an input type without using typeid(T).name().
FString TTypeString()
Same as TTypeName converted to FString. This is not cached and a new FString is created every time th...