diff --git a/Engine/Source/Applications/Editor/Private/Launch.cpp b/Engine/Source/Applications/Editor/Private/Launch.cpp index e16b260..a8b1084 100644 --- a/Engine/Source/Applications/Editor/Private/Launch.cpp +++ b/Engine/Source/Applications/Editor/Private/Launch.cpp @@ -1,10 +1,10 @@ // RavenStorm Copyright @ 2025-2025 -#include - #if defined(CORVUS_MODE_DEBUG) || defined(CORVUS_MODE_DEVELOPMENT) int main() #else +#include + int APIENTRY WinMain(HINSTANCE Instance, HINSTANCE PreviousInstance, PSTR CommandLine, int ShowCommand) #endif { diff --git a/Engine/Source/Runtime/Core/Private/Core/Utility/StringUtils.cpp b/Engine/Source/Runtime/Core/Private/Core/Utility/StringUtils.cpp new file mode 100644 index 0000000..770aa40 --- /dev/null +++ b/Engine/Source/Runtime/Core/Private/Core/Utility/StringUtils.cpp @@ -0,0 +1,101 @@ +// RavenStorm Copyright @ 2025-2025 + +#include "Core/Utility/StringUtils.hpp" + +#include + +FAnsiString StringUtils::ToAnsiString(const FWideChar* String) +{ + if (!String || *String == L'\0') + { + return {}; + } + const int32 Length = WideCharToMultiByte(CP_UTF8, 0, String, -1, nullptr, 0, nullptr, nullptr); + if (Length <= 0) + { + return {}; + } + FAnsiString Result(Length - 1, '\0'); + WideCharToMultiByte(CP_UTF8, 0, String, -1, Result.data(), Length, nullptr, nullptr); + return Result; +} + +FAnsiString StringUtils::ToAnsiString(const FWideString& String) +{ + if (String.empty()) + { + return {}; + } + const int32 Length = WideCharToMultiByte(CP_UTF8, 0, String.data(), static_cast(String.size()), nullptr, 0, nullptr, nullptr); + if (Length <= 0) + { + return {}; + } + FAnsiString Result(Length, '\0'); + WideCharToMultiByte(CP_UTF8, 0, String.data(), static_cast(String.size()), Result.data(), Length, nullptr, nullptr); + return Result; +} + +FAnsiString StringUtils::ToAnsiString(const FWideStringView& String) +{ + if (String.empty()) + { + return {}; + } + const int32 Length = WideCharToMultiByte(CP_UTF8, 0, String.data(), static_cast(String.size()), nullptr, 0, nullptr, nullptr); + if (Length <= 0) + { + return {}; + } + FAnsiString Result(Length, '\0'); + WideCharToMultiByte(CP_UTF8, 0, String.data(), static_cast(String.size()), Result.data(), Length, nullptr, nullptr); + return Result; +} + +FWideString StringUtils::ToWideString(const FAnsiChar* String) +{ + if (!String || *String == '\0') + { + return {}; + } + const int32 Length = MultiByteToWideChar(CP_UTF8, 0, String, -1, nullptr, 0); + if (Length <= 0) + { + return {}; + } + FWideString Result(Length - 1, L'\0'); + MultiByteToWideChar(CP_UTF8, 0, String, -1, Result.data(), Length); + return Result; +} + +FWideString StringUtils::ToWideString(const FAnsiString& String) +{ + if (String.empty()) + { + return {}; + } + const int32 Length = MultiByteToWideChar(CP_UTF8, 0, String.data(), static_cast(String.size()), nullptr, 0); + if (Length <= 0) + { + return {}; + } + FWideString Result(Length, L'\0'); + MultiByteToWideChar(CP_UTF8, 0, String.data(), static_cast(String.size()), Result.data(), Length); + return Result; +} + +FWideString StringUtils::ToWideString(const FAnsiStringView& String) +{ + if (String.empty()) + { + return {}; + } + const int32 Length = MultiByteToWideChar(CP_UTF8, 0, String.data(), static_cast(String.size()), nullptr, 0); + if (Length <= 0) + { + return {}; + } + FWideString Result(Length, L'\0'); + MultiByteToWideChar(CP_UTF8, 0, String.data(), static_cast(String.size()), Result.data(), Length); + return Result; +} diff --git a/Engine/Source/Runtime/Core/Public/Core/Containers/String.hpp b/Engine/Source/Runtime/Core/Public/Core/Containers/String.hpp new file mode 100644 index 0000000..7c1cdef --- /dev/null +++ b/Engine/Source/Runtime/Core/Public/Core/Containers/String.hpp @@ -0,0 +1,40 @@ +// RavenStorm Copyright @ 2025-2025 + +#pragma once + +#include +#include + +using FAnsiChar = char; +using FAnsiString = std::string; +using FAnsiStringView = std::string_view; + +template +using TAnsiFormatString = std::format_string; + +using FWideChar = wchar_t; +using FWideString = std::wstring; +using FWideStringView = std::wstring_view; + +template +using TWideFormatString = std::wformat_string; + +#ifndef CV_USE_ANSI_STRINGS +# define CV_USE_ANSI_STRINGS 1 +#endif + +#if CV_USE_ANSI_STRINGS +using FChar = FAnsiChar; +using FString = FAnsiString; +using FStringView = FAnsiStringView; + +template +using TFormatString = TAnsiFormatString; +#else +using FChar = FWideChar; +using FString = FWideString; +using FStringView = FWideStringView; + +template +using TFormatString = TWideFormatString; +#endif diff --git a/Engine/Source/Runtime/Core/Public/Core/Utility/StringUtils.hpp b/Engine/Source/Runtime/Core/Public/Core/Utility/StringUtils.hpp new file mode 100644 index 0000000..61a4bb0 --- /dev/null +++ b/Engine/Source/Runtime/Core/Public/Core/Utility/StringUtils.hpp @@ -0,0 +1,36 @@ +// RavenStorm Copyright @ 2025-2025 + +#pragma once + +#include "Core/Containers/String.hpp" + +#include + +namespace StringUtils +{ + template + FString Format(TFormatString FormatString, TArguments&&... Arguments) + { + return std::format(FormatString, std::forward(Arguments)...); + } + + template + FAnsiString FormatAnsi(TAnsiFormatString FormatString, TArguments&&... Arguments) + { + return std::format(FormatString, std::forward(Arguments)...); + } + + template + FWideString FormatWide(TWideFormatString FormatString, TArguments&&... Arguments) + { + return std::format(FormatString, std::forward(Arguments)...); + } + + CORE_API FAnsiString ToAnsiString(const FWideChar* String); + CORE_API FAnsiString ToAnsiString(const FWideString& String); + CORE_API FAnsiString ToAnsiString(const FWideStringView& String); + + CORE_API FWideString ToWideString(const FAnsiChar* String); + CORE_API FWideString ToWideString(const FAnsiString& String); + CORE_API FWideString ToWideString(const FAnsiStringView& String); +}