16#include "CoreMinimal.h"
17#include "Misc/EngineVersionComparison.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#if UE_VERSION_NEWER_THAN(5, 5, -1)
70 || CSameAsDecayed<T, FAnsiString>
71 || CSameAsDecayed<T, FUtf8String>
77 concept CStringOrView = CSameAsDecayed<T, FString> || CSameAsDecayed<T, FStringView>;
92 template <
typename T,
typename CharType>
101 typename T::value_type,
102 typename T::traits_type
108 template <
typename T>
113 typename T::value_type,
114 typename T::traits_type
120 template <
typename T>
122 CConvertibleToDecayed<
125 typename T::value_type,
126 typename T::traits_type
137#if UE_VERSION_OLDER_THAN(5, 5, 0)
138 return FString(
size, ptr);
140 return FString::ConstructFromPtrSize(ptr,
size);
145 typename CharFrom,
typename CharOutput,
147 CFunctionLike PtrGetter, CFunctionLike LengthGetter, CFunctionLike Constructor,
150 StringTo
HighLevelStringCast(
const StringFrom& strIn, PtrGetter&& getPtr, LengthGetter&& getLength, Constructor&& construct)
152 if constexpr (CSameAs<CharFrom, CharOutput>)
155 reinterpret_cast<const CharOutput*
>(getPtr()),
161 auto conversion = StringCast<CharOutput>(
162 reinterpret_cast<const CharFrom*
>(getPtr()),
166 reinterpret_cast<const CharOutput*
>(conversion.Get()),
174 template <
typename CharType>
177 return TStringView<CharType>(stdStr.data(), stdStr.size());
181 template <CStringViewInvariant T>
188 template <CConvertibleToDecayed<FString> T>
198 template <CStdStringOrViewInvariant T>
203 [&] {
return stdStr.data(); },
204 [&] {
return stdStr.length(); },
214 template <CStdStringOrViewInvariant T>
219 [&] {
return stdStr.data(); },
220 [&] {
return stdStr.length(); },
221 [](
const TCHAR* ptr, int32 len) {
return FName(len, ptr); }
232 template <
typename ConvertTo>
235 if constexpr (CSameAs<TCHAR, ConvertTo>)
241 [&] {
return unrealStr.GetData(); },
242 [&] {
return unrealStr.Len(); },
243 [](
const ConvertTo* ptr, int32 len) {
return TStdString(ptr, len); }
249 template <
typename ConvertTo>
252 if constexpr (CSameAs<TCHAR, ConvertTo>)
258 [&] {
return stdStr.data(); },
259 [&] {
return stdStr.size(); },
260 [](
const ConvertTo* ptr, int32 len) {
return TStdString(ptr, len); }
266 template <
typename ConvertTo>
273 template <CStringOrView... Args>
274 FString
Join(
const TCHAR* separator, Args... args)
276 return FString::Join(
277 TArray<FString>{args...}.FilterByPredicate([](FStringView
const& str) {
return !str.IsEmpty(); }),
283 template <
typename T>
287 template <
typename T>
294 template <
typename T>
300 template <
typename T>
303#if MCRO_TEXT_ALLOW_UNSUPPORTED_STRING_CONVERSION
304 template <CConvertibleToDecayed<T> Arg>
305 FStringView operator () (Arg&& left)
const
307 ensureAlwaysMsgf(
false,
308 TEXT(
"Given type %s couldn't be converted to a string. Typename is returned instead"),
317 template <
typename T>
324 template <
typename T>
332 template <CDirectStringFormatArgument Operand>
333 requires (!CEnum<Operand>)
336 template <CConvertibleToDecayed<Operand> Arg>
337 Operand operator () (Arg&& left)
const {
return left; }
340 template <CHasToString Operand>
343 template <CConvertibleToDecayed<Operand> Arg>
344 auto operator () (Arg&& left)
const {
return left.ToString(); }
347 template <CHasPtrToString Operand>
350 template <CConvertibleToDecayed<Operand> Arg>
351 auto operator () (Arg&& left)
const {
return left->ToString(); }
354 template <
typename CharType>
372 template <CStdStringViewInvariant Operand>
373 requires (!CSameAsDecayed<Operand, FStdStringView>)
376 template <CConvertibleToDecayed<Operand> Arg>
380 template <CStringFormatArgument T>
395 template <CStringFormatArgument T>
396 requires(!CSameAsDecayed<T, FString>)
400 return MoveTemp(format.StringValue);
403 template <CSameAsDecayed<FString> T>
412 template <CStringFormatArgument T>
413 requires(!CSameAsDecayed<T, FText>)
416 return FText::FromString(
AsString(input));
419 template <CSameAsDecayed<FText> T>
431 template <CStringFormatArgument... Args>
434 return FStringFormatOrderedArguments { FStringFormatArg(
AsFormatArgument(args)) ... };
443 template <CStringFormatArgument... Args>
446 return FStringFormatNamedArguments {
447 { 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...
#define FWD(...)
Shorten forwarding expression with this macro so one may not need to specify explicit type.
size_t size(TArray< T, A > const &r)
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)
FORCEINLINE FString MakeStringFromPtrSize(const TCHAR *ptr, int32 size)
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.
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
FText AsText(T &&input)
Convert anything which is compatible with AsString to FText.
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...