Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Engine/Source/Applications/Editor/Private/Launch.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// RavenStorm Copyright @ 2025-2025

#include <Windows.h>

#if defined(CORVUS_MODE_DEBUG) || defined(CORVUS_MODE_DEVELOPMENT)
int main()
#else
#include <Windows.h>

int APIENTRY WinMain(HINSTANCE Instance, HINSTANCE PreviousInstance, PSTR CommandLine, int ShowCommand)
#endif
{
Expand Down
101 changes: 101 additions & 0 deletions Engine/Source/Runtime/Core/Private/Core/Utility/StringUtils.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// RavenStorm Copyright @ 2025-2025

#include "Core/Utility/StringUtils.hpp"

#include <Windows.h>

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<int32>(String.size()), nullptr, 0, nullptr, nullptr);
if (Length <= 0)
{
return {};
}
FAnsiString Result(Length, '\0');
WideCharToMultiByte(CP_UTF8, 0, String.data(), static_cast<int32>(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<int32>(String.size()), nullptr, 0, nullptr, nullptr);
if (Length <= 0)
{
return {};
}
FAnsiString Result(Length, '\0');
WideCharToMultiByte(CP_UTF8, 0, String.data(), static_cast<int32>(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<int32>(String.size()), nullptr, 0);
if (Length <= 0)
{
return {};
}
FWideString Result(Length, L'\0');
MultiByteToWideChar(CP_UTF8, 0, String.data(), static_cast<int32>(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<int32>(String.size()), nullptr, 0);
if (Length <= 0)
{
return {};
}
FWideString Result(Length, L'\0');
MultiByteToWideChar(CP_UTF8, 0, String.data(), static_cast<int32>(String.size()), Result.data(), Length);
return Result;
}
40 changes: 40 additions & 0 deletions Engine/Source/Runtime/Core/Public/Core/Containers/String.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// RavenStorm Copyright @ 2025-2025

#pragma once

#include <format>
#include <string>

using FAnsiChar = char;
using FAnsiString = std::string;
using FAnsiStringView = std::string_view;

template <typename... TArguments>
using TAnsiFormatString = std::format_string<TArguments...>;

using FWideChar = wchar_t;
using FWideString = std::wstring;
using FWideStringView = std::wstring_view;

template <typename... TArguments>
using TWideFormatString = std::wformat_string<TArguments...>;

#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 <typename... TArguments>
using TFormatString = TAnsiFormatString<TArguments...>;
#else
using FChar = FWideChar;
using FString = FWideString;
using FStringView = FWideStringView;

template <typename... TArguments>
using TFormatString = TWideFormatString<TArguments...>;
#endif
36 changes: 36 additions & 0 deletions Engine/Source/Runtime/Core/Public/Core/Utility/StringUtils.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// RavenStorm Copyright @ 2025-2025

#pragma once

#include "Core/Containers/String.hpp"

#include <type_traits>

namespace StringUtils
{
template <typename... TArguments>
FString Format(TFormatString<TArguments...> FormatString, TArguments&&... Arguments)
{
return std::format(FormatString, std::forward<TArguments>(Arguments)...);
}

template <typename... TArguments>
FAnsiString FormatAnsi(TAnsiFormatString<TArguments...> FormatString, TArguments&&... Arguments)
{
return std::format(FormatString, std::forward<TArguments>(Arguments)...);
}

template <typename... TArguments>
FWideString FormatWide(TWideFormatString<TArguments...> FormatString, TArguments&&... Arguments)
{
return std::format(FormatString, std::forward<TArguments>(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);
}
Loading