Skip to content
This repository was archived by the owner on Dec 2, 2025. It is now read-only.
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
13 changes: 7 additions & 6 deletions bettergln.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

<PropertyGroup>
<PropertyGroup Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>

Expand Down Expand Up @@ -106,7 +106,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;GLEW_STATIC;CORE_PLUGIN_WITH_CALLBACKS</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;GLEW_STATIC;CORE_PLUGIN_WITH_CALLBACKS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
Expand All @@ -124,7 +124,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<PreprocessorDefinitions>WIN32;GLEW_STATIC;CORE_PLUGIN_WITH_CALLBACKS</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;GLEW_STATIC;CORE_PLUGIN_WITH_CALLBACKS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<WarningLevel>Level3</WarningLevel>
Expand All @@ -140,7 +140,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;GLEW_STATIC;CORE_PLUGIN_WITH_CALLBACKS</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;GLEW_STATIC;CORE_PLUGIN_WITH_CALLBACKS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
Expand All @@ -158,7 +158,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<OmitFramePointers>true</OmitFramePointers>
<PreprocessorDefinitions>WIN32;GLEW_STATIC;CORE_PLUGIN_WITH_CALLBACKS</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;GLEW_STATIC;CORE_PLUGIN_WITH_CALLBACKS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<WarningLevel>Level3</WarningLevel>
Expand Down Expand Up @@ -229,6 +229,7 @@
<ClCompile Include="src\VI.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\MiscHelpers.h" />
<ClInclude Include="src\stdafx.h" />
<ClInclude Include="src\2xSAI.h" />
<ClInclude Include="src\3DMath.h" />
Expand Down
169 changes: 83 additions & 86 deletions src/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,20 @@ struct
{
WORD width{};
WORD height{};
std::string description{};
std::wstring description{};
} windowedModes[numWindowedModes] = {
{320, 240, "320 x 240"},
{400, 300, "400 x 300"},
{480, 360, "480 x 360"},
{640, 480, "640 x 480"},
{800, 600, "800 x 600"},
{960, 720, "960 x 720"},
{1024, 768, "1024 x 768"},
{1152, 864, "1152 x 864"},
{1280, 960, "1280 x 960"},
{1280, 1024, "1280 x 1024"},
{1440, 1080, "1440 x 1080"},
{1600, 1200, "1600 x 1200"}};
{320, 240, L"320 x 240"},
{400, 300, L"400 x 300"},
{480, 360, L"480 x 360"},
{640, 480, L"640 x 480"},
{800, 600, L"800 x 600"},
{960, 720, L"960 x 720"},
{1024, 768, L"1024 x 768"},
{1152, 864, L"1152 x 864"},
{1280, 960, L"1280 x 960"},
{1280, 1024, L"1280 x 1024"},
{1440, 1080, L"1440 x 1080"},
{1600, 1200, L"1600 x 1200"}};

void EnableCustom(HWND hWndDlg, BOOL enable)
{
Expand All @@ -41,38 +41,38 @@ void Config_LoadConfig()

HKEY hKey;

RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\N64 Emulation\\DLL\\glN64", 0, KEY_READ, &hKey);
RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\N64 Emulation\\DLL\\glN64", 0, KEY_READ, &hKey);

if (hKey)
{
RegQueryValueEx(hKey, "Windowed Width", 0, NULL, (BYTE*)&OGL.windowedWidth, &size);
RegQueryValueEx(hKey, "Windowed Height", 0, NULL, (BYTE*)&OGL.windowedHeight, &size);
RegQueryValueEx(hKey, "Windowed Width", 0, NULL, (BYTE*)&OGL.windowedWidth, &size);
RegQueryValueEx(hKey, "Force Bilinear", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Windowed Width", 0, NULL, (BYTE*)&OGL.windowedWidth, &size);
RegQueryValueEx(hKey, L"Windowed Height", 0, NULL, (BYTE*)&OGL.windowedHeight, &size);
RegQueryValueEx(hKey, L"Windowed Width", 0, NULL, (BYTE*)&OGL.windowedWidth, &size);
RegQueryValueEx(hKey, L"Force Bilinear", 0, NULL, (BYTE*)&value, &size);
OGL.forceBilinear = value ? TRUE : FALSE;

RegQueryValueEx(hKey, "Texture Filter", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Texture Filter", 0, NULL, (BYTE*)&value, &size);
OGL.textureFilter = (TextureFilter)value;

RegQueryValueEx(hKey, "Filter Scale", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Filter Scale", 0, NULL, (BYTE*)&value, &size);
OGL.filterScale = value;

RegQueryValueEx(hKey, "Enable Fog", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Enable Fog", 0, NULL, (BYTE*)&value, &size);
OGL.fog = value ? TRUE : FALSE;

RegQueryValueEx(hKey, "Texture Cache Size", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Texture Cache Size", 0, NULL, (BYTE*)&value, &size);
cache.maxBytes = value * 1048576;

RegQueryValueEx(hKey, "Dithered Alpha Testing", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Dithered Alpha Testing", 0, NULL, (BYTE*)&value, &size);
OGL.usePolygonStipple = value ? TRUE : FALSE;

RegQueryValueEx(hKey, "Ignore Scissor", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Ignore Scissor", 0, NULL, (BYTE*)&value, &size);
OGL.ignoreScissor = value ? TRUE : FALSE;

RegQueryValueEx(hKey, "Clear Override", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Clear Override", 0, NULL, (BYTE*)&value, &size);
OGL.clear_override = value ? TRUE : FALSE;

RegQueryValueEx(hKey, "Combiner", 0, NULL, (BYTE*)&value, &size);
RegQueryValueEx(hKey, L"Combiner", 0, NULL, (BYTE*)&value, &size);
OGL.combiner = value;

if (OGL.textureFilter == TextureFilter::SaI)
Expand Down Expand Up @@ -106,37 +106,37 @@ void Config_SaveConfig()
DWORD value;
HKEY hKey;

RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\N64 Emulation\\DLL\\glN64", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);
RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\N64 Emulation\\DLL\\glN64", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL);

RegSetValueEx(hKey, "Windowed Width", 0, REG_DWORD, (BYTE*)&OGL.windowedWidth, 4);
RegSetValueEx(hKey, "Windowed Height", 0, REG_DWORD, (BYTE*)&OGL.windowedHeight, 4);
RegSetValueEx(hKey, L"Windowed Width", 0, REG_DWORD, (BYTE*)&OGL.windowedWidth, 4);
RegSetValueEx(hKey, L"Windowed Height", 0, REG_DWORD, (BYTE*)&OGL.windowedHeight, 4);

value = OGL.forceBilinear ? 1 : 0;
RegSetValueEx(hKey, "Force Bilinear", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Force Bilinear", 0, REG_DWORD, (BYTE*)&value, 4);

value = (DWORD)OGL.textureFilter;
RegSetValueEx(hKey, "Texture Filter", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Texture Filter", 0, REG_DWORD, (BYTE*)&value, 4);

value = OGL.filterScale;
RegSetValueEx(hKey, "Filter Scale", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Filter Scale", 0, REG_DWORD, (BYTE*)&value, 4);

value = OGL.fog ? 1 : 0;
RegSetValueEx(hKey, "Enable Fog", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Enable Fog", 0, REG_DWORD, (BYTE*)&value, 4);

value = cache.maxBytes / 1048576;
RegSetValueEx(hKey, "Texture Cache Size", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Texture Cache Size", 0, REG_DWORD, (BYTE*)&value, 4);

value = OGL.usePolygonStipple ? 1 : 0;
RegSetValueEx(hKey, "Dithered Alpha Testing", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Dithered Alpha Testing", 0, REG_DWORD, (BYTE*)&value, 4);

value = OGL.ignoreScissor ? 1 : 0;
RegSetValueEx(hKey, "Ignore Scissor", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Ignore Scissor", 0, REG_DWORD, (BYTE*)&value, 4);

value = OGL.clear_override ? 1 : 0;
RegSetValueEx(hKey, "Clear Override", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Clear Override", 0, REG_DWORD, (BYTE*)&value, 4);

value = OGL.combiner;
RegSetValueEx(hKey, "Combiner", 0, REG_DWORD, (BYTE*)&value, 4);
RegSetValueEx(hKey, L"Combiner", 0, REG_DWORD, (BYTE*)&value, 4);

RegCloseKey(hKey);
}
Expand Down Expand Up @@ -190,72 +190,69 @@ void Config_ApplyDlgConfig(HWND hWndDlg)

BOOL CALLBACK ConfigDlgProc(HWND hWndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char text[256]{};
bool custom = true;

switch (message)
{
case WM_INITDIALOG:
hConfigDlg = hWndDlg;


// Fill windowed mode resolution
for (int i = 0; i < numWindowedModes; i++)
{
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_WINDOWEDRES), windowedModes[i].description.c_str());
if ((OGL.windowedWidth == windowedModes[i].width) &&
(OGL.windowedHeight == windowedModes[i].height))
hConfigDlg = hWndDlg;

// Fill windowed mode resolution
for (int i = 0; i < numWindowedModes; i++)
{
SendDlgItemMessage(hWndDlg, IDC_WINDOWEDRES, CB_SETCURSEL, i, 0);
custom = false;
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_WINDOWEDRES), windowedModes[i].description.c_str());
if ((OGL.windowedWidth == windowedModes[i].width) &&
(OGL.windowedHeight == windowedModes[i].height))
{
SendDlgItemMessage(hWndDlg, IDC_WINDOWEDRES, CB_SETCURSEL, i, 0);
custom = false;
}
}
}

SendDlgItemMessage(hWndDlg, IDC_WINDOWEDRES, CB_ADDSTRING, 0, (LPARAM) "Custom...");

char val[32];
sprintf(val, "%d", OGL.windowedWidth);
SendDlgItemMessage(hWndDlg, IDC_WINDOWED_X, WM_SETTEXT, 0, (LPARAM)val);
sprintf(val, "%d", OGL.windowedHeight);
SendDlgItemMessage(hWndDlg, IDC_WINDOWED_Y, WM_SETTEXT, 0, (LPARAM)val);
if (custom)
{
int num = SendDlgItemMessage(hWndDlg, IDC_WINDOWEDRES, CB_GETCOUNT, 0, 0) - 1;
EnableCustom(hWndDlg, TRUE);
SendDlgItemMessage(hWndDlg, IDC_WINDOWEDRES, CB_SETCURSEL, num, 0);
}
SendDlgItemMessage(hWndDlg, IDC_WINDOWEDRES, CB_ADDSTRING, 0, (LPARAM)L"Custom...");

SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_ADDSTRING, 0, (LPARAM) "None");
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_ADDSTRING, 0, (LPARAM) "2xSaI");
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_ADDSTRING, 0, (LPARAM) "xBRZ");
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_ADDSTRING, 0, (LPARAM) "Hqx");
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_SETCURSEL, (int)OGL.textureFilter, 0);
SendMessage(GetDlgItem(hWndDlg, IDC_FSCALE), TBM_SETPOS, TRUE, OGL.filterScale);
SendDlgItemMessage(hWndDlg, IDC_WINDOWED_X, WM_SETTEXT, 0, (LPARAM)std::to_wstring(OGL.windowedWidth).c_str());
SendDlgItemMessage(hWndDlg, IDC_WINDOWED_Y, WM_SETTEXT, 0, (LPARAM)std::to_wstring(OGL.windowedHeight).c_str());

if (custom)
{
int num = SendDlgItemMessage(hWndDlg, IDC_WINDOWEDRES, CB_GETCOUNT, 0, 0) - 1;
EnableCustom(hWndDlg, TRUE);
SendDlgItemMessage(hWndDlg, IDC_WINDOWEDRES, CB_SETCURSEL, num, 0);
}

SendDlgItemMessage(hWndDlg, IDC_FORCEBILINEAR, BM_SETCHECK, OGL.forceBilinear ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);
SendDlgItemMessage(hWndDlg, IDC_SCISSOR, BM_SETCHECK, OGL.ignoreScissor ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);
SendDlgItemMessage(hWndDlg, IDC_CLEAR, BM_SETCHECK, OGL.clear_override ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_ADDSTRING, 0, (LPARAM)L"None");
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_ADDSTRING, 0, (LPARAM)L"2xSaI");
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_ADDSTRING, 0, (LPARAM)L"xBRZ");
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_ADDSTRING, 0, (LPARAM)L"Hqx");
SendDlgItemMessage(hWndDlg, IDC_TEXTUREFILTER, CB_SETCURSEL, (int)OGL.textureFilter, 0);
SendMessage(GetDlgItem(hWndDlg, IDC_FSCALE), TBM_SETPOS, TRUE, OGL.filterScale);

ComboBox_AddString(GetDlgItem(hWndDlg, IDC_COMBINER), "Autodetect");
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_COMBINER), "TEXTURE_ENV");
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_COMBINER), "TEXTURE_ENV_COMBINE");
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_COMBINER), "NV_REGISTER_COMBINERS");
ComboBox_SetCurSel(GetDlgItem(hWndDlg, IDC_COMBINER), OGL.combiner);
SendDlgItemMessage(hWndDlg, IDC_FORCEBILINEAR, BM_SETCHECK, OGL.forceBilinear ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);
SendDlgItemMessage(hWndDlg, IDC_SCISSOR, BM_SETCHECK, OGL.ignoreScissor ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);
SendDlgItemMessage(hWndDlg, IDC_CLEAR, BM_SETCHECK, OGL.clear_override ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);

// Enable/disable fog
SendDlgItemMessage(hWndDlg, IDC_FOG, BM_SETCHECK, OGL.fog ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_COMBINER), L"Autodetect");
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_COMBINER), L"TEXTURE_ENV");
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_COMBINER), L"TEXTURE_ENV_COMBINE");
ComboBox_AddString(GetDlgItem(hWndDlg, IDC_COMBINER), L"NV_REGISTER_COMBINERS");
ComboBox_SetCurSel(GetDlgItem(hWndDlg, IDC_COMBINER), OGL.combiner);

SendDlgItemMessage(hWndDlg, IDC_DITHEREDALPHATEST, BM_SETCHECK, OGL.usePolygonStipple ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);
// Enable/disable fog
SendDlgItemMessage(hWndDlg, IDC_FOG, BM_SETCHECK, OGL.fog ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);

_ltoa(cache.maxBytes / 1048576, text, 10);
SendDlgItemMessage(hWndDlg, IDC_CACHEMEGS, WM_SETTEXT, NULL, (LPARAM)text);
SendDlgItemMessage(hWndDlg, IDC_DITHEREDALPHATEST, BM_SETCHECK, OGL.usePolygonStipple ? (LPARAM)BST_CHECKED : (LPARAM)BST_UNCHECKED, NULL);

SendMessage(hWndDlg, WM_COMMAND,
MAKEWPARAM(IDC_TEXTUREFILTER, CBN_SELCHANGE),
(LPARAM)GetDlgItem(hWndDlg, IDC_TEXTUREFILTER));
const auto cache_size = std::to_wstring(cache.maxBytes / 1048576);
SendDlgItemMessage(hWndDlg, IDC_CACHEMEGS, WM_SETTEXT, NULL, (LPARAM)cache_size.c_str());

return TRUE;
SendMessage(hWndDlg, WM_COMMAND,
MAKEWPARAM(IDC_TEXTUREFILTER, CBN_SELCHANGE),
(LPARAM)GetDlgItem(hWndDlg, IDC_TEXTUREFILTER));

return TRUE;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
Expand Down
10 changes: 5 additions & 5 deletions src/Debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ NULL,
RGB(0, 0, 0),
NULL,
NULL,
"Courier New"};
L"Courier New"};

CHARFORMAT unknownFormat =
{
Expand All @@ -30,7 +30,7 @@ NULL,
RGB(128, 128, 0),
NULL,
NULL,
"Courier New"};
L"Courier New"};

CHARFORMAT errorFormat =
{
Expand All @@ -42,7 +42,7 @@ NULL,
RGB(128, 0, 0),
NULL,
NULL,
"Courier New"};
L"Courier New"};

CHARFORMAT detailFormat =
{
Expand All @@ -54,7 +54,7 @@ NULL,
RGB(0, 128, 0),
NULL,
NULL,
"Courier New"};
L"Courier New"};

HWND hDebugDlg;
BOOL DumpMessages;
Expand Down Expand Up @@ -177,7 +177,7 @@ INT_PTR CALLBACK DebugDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam

void DebugDlgThreadFunc(void*)
{
LoadLibrary("RichEd20.dll");
LoadLibrary(L"RichEd20.dll");
hDebugDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DEBUGDLG), hWnd, DebugDlgProc);

MSG msg;
Expand Down
32 changes: 32 additions & 0 deletions src/MiscHelpers.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#pragma once

namespace MiscHelpers
{
inline std::wstring string_to_wstring(const std::string& str)
{
#ifdef _WIN32
int size_needed = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, nullptr, 0);
if (size_needed <= 0)
return L"";

std::wstring wstr(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, &wstr[0], size_needed);
wstr.pop_back();
return wstr;
#endif
}

inline std::string wstring_to_string(const std::wstring& wstr)
{
#ifdef _WIN32
int size_needed = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, nullptr, 0, nullptr, nullptr);
if (size_needed <= 0)
return "";

std::string str(size_needed, 0);
WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &str[0], size_needed, nullptr, nullptr);
str.pop_back();
return str;
#endif
}
}; // namespace MiscHelpers
Loading
Loading