refactored serde between waypoint number and 26 radix string . (#122)

This commit is contained in:
Zero Fanker 2024-11-26 22:53:24 -05:00 committed by GitHub
parent cace9efd2a
commit f0f2439be0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 74 additions and 70 deletions

View file

@ -1,6 +1,7 @@
#pragma once
#include <afx.h>
#include <algorithm>
#include <array>
// coordinate functions
inline void PosToXY(const char* pos, int* X, int* Y)
@ -89,4 +90,48 @@ inline std::array<unsigned char, 3> HSVToRGB(const unsigned char hsv[3])
std::array<unsigned char, 3> ret;
HSVToRGB(hsv, ret.data());
return ret;
}
inline int letter2number(char let) {
int reply = let - 'A';
return reply;
}
inline char number2letter(int let) {
int reply = let + 'A';
return reply;
}
inline int StringToWaypoint(const CString& str)
{
if (str.IsEmpty()) {
return -1;
}
int num = 0;
for (auto idx = 0; idx < str.GetLength(); ++idx) {
auto const ch = str[idx];
num = (num + idx) * 26 + letter2number(ch);
}
return num;
}
// Serialize waypoint, will be renamed later
inline CString WaypointToString(int num)
{
if (num < 0) {
return {};
}
char secondChar = number2letter(num % 26);
char carry = num / 26;
if (!carry) {
return secondChar;
}
char firstChar = number2letter(carry - 1);
CString ret;
ret += firstChar;
ret += secondChar;
return ret;
}

View file

@ -29,6 +29,7 @@
#include "variables.h"
#include "functions.h"
#include "inlines.h"
#include "Helpers.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@ -332,63 +333,6 @@ CString btos(BOOL b)
return s;
}
int letter2number(char let) {
int reply = let - 'A';
return reply;
}
char number2letter(int let) {
int reply = let + 'A';
return reply;
}
int GetWaypoint(const char* c)
{
if (strlen(c) == 0) {
return -1;
}
int i;
int res = 0;
for (i = 0; i < strlen(c); i++) {
int addval = letter2number(c[i]);
res += addval + (res + 1) * (i * 25) + i;
}
return res;
}
// Serialize waypoint, will be renamed later
CString GetWaypoint(int n)
{
if (n == -1) {
return "";
}
for (int i = -1; i < 26; i++) {
for (int e = 0; e < 26; e++) {
char c[50];
CString p;
if (i == -1) {
c[0] = number2letter(e);
c[1] = 0;
if (GetWaypoint(c) == n) {
return c;
}
} else {
c[0] = number2letter(i);
c[1] = number2letter(e);
c[2] = 0;
if (GetWaypoint(c) == n) {
return c;
}
}
}
}
return "";
}
/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten CTeamTypes
void CTeamTypes::UpdateDialog()
@ -616,7 +560,7 @@ void CTeamTypes::OnSelchangeTeamtypes()
}
int w = GetWaypoint(sec["Waypoint"]);
int w = StringToWaypoint(sec["Waypoint"]);
char c[50];
itoa(w, c, 10);
if (w != -1)
@ -626,7 +570,7 @@ void CTeamTypes::OnSelchangeTeamtypes()
#ifdef RA2_MODE
if (sec.GetBool("UseTransportOrigin")) {
int w = GetWaypoint(sec["TransportWaypoint"]);
int w = StringToWaypoint(sec["TransportWaypoint"]);
char c[50];
itoa(w, c, 10);
if (w != -1)
@ -807,7 +751,7 @@ void CTeamTypes::OnEditchangeWaypoint()
if (strlen(m_Waypoint) == 0) {
sec->SetString("Waypoint", "");
} else {
sec->SetString("Waypoint", GetWaypoint(atoi(m_Waypoint)));
sec->SetString("Waypoint", WaypointToString(atoi(m_Waypoint)));
}
}
@ -1443,7 +1387,7 @@ void CTeamTypes::OnEditchangeTransportwaypoint()
sec->SetBool("UseTransportOrigin", false);
return;
}
sec->SetString("TransportWaypoint", GetWaypoint(atoi(m_TransportWaypoint)));
sec->SetString("TransportWaypoint", WaypointToString(atoi(m_TransportWaypoint)));
sec->SetBool("UseTransportOrigin", true);
}

View file

@ -28,9 +28,7 @@
#include "variables.h"
#include "functions.h"
#include "inlines.h"
CString GetWaypoint(int n);
int GetWaypoint(const char* c);
#include "Helpers.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@ -249,7 +247,7 @@ void CTriggerActionsDlg::OnEditchangeActiontype()
GetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6)
)
&& bNoWP) {
int number = GetWaypoint(GetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6));
int number = StringToWaypoint(GetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6));
char c[50];
itoa(number, c, 10);
ini.SetString("Actions", m_currentTrigger, SetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6, c));
@ -258,7 +256,7 @@ void CTriggerActionsDlg::OnEditchangeActiontype()
)
&& !bNoWP) {
int wp = atoi(GetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6));
CString s = GetWaypoint(wp);
CString s = WaypointToString(wp);
ini.SetString("Actions", m_currentTrigger, SetParam(ini["Actions"][m_currentTrigger], pos + 1 + 6, s));
};
@ -365,7 +363,7 @@ void CTriggerActionsDlg::OnSelchangeParameter()
char wayp[50];
if (!bNoWP) {
ListWaypoints(m_ParamValue);
int iWayp = GetWaypoint(GetParam(ActionData, startpos + 1 + 6));
int iWayp = StringToWaypoint(GetParam(ActionData, startpos + 1 + 6));
itoa(iWayp, wayp, 10);
} else {
@ -426,7 +424,7 @@ void CTriggerActionsDlg::OnEditchangeParamvalue()
CString waypoint = newVal;
if (!bNoWP) {
waypoint = GetWaypoint(atoi(newVal));
waypoint = WaypointToString(atoi(newVal));
}
ini.SetString("Actions", m_currentTrigger, SetParam(ini["Actions"][m_currentTrigger], pos, (LPCTSTR)waypoint));

View file

@ -104,7 +104,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>RA2_MODE;NOMINMAX;_CONSOLE;_AFXDLL;%(PreprocessorDefinitions);_DEBUG</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;$(SolutionDir)MissionEditor;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>Create</PrecompiledHeader>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<LanguageStandard>stdcpp20</LanguageStandard>
@ -124,7 +124,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>RA2_MODE;NOMINMAX;_CONSOLE;_AFXDLL;%(PreprocessorDefinitions);NDEBUG</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SolutionDir)googletest\x64\include;$(SolutionDir)MissionEditorPackLib;$(SolutionDir)MissionEditor;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile>
<Link>
@ -143,6 +143,7 @@
<ClCompile Include="CIni_Test.cpp" />
<ClCompile Include="Serde_Test.cpp" />
<ClCompile Include="UnitTest.cpp" />
<ClCompile Include="Waypoint_Test.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\MissionEditor\IniFile.h" />

View file

@ -33,6 +33,9 @@
<ClCompile Include="Serde_Test.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="Waypoint_Test.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="StdAfx.h">

View file

@ -0,0 +1,13 @@
#include "stdafx.h"
#include "Helpers.h"
TEST(WaypointTest, SerdeTest)
{
//"DJ", "CL";
ASSERT_EQ(WaypointToString(113), "DJ");
ASSERT_EQ(StringToWaypoint("DJ"), 113);
ASSERT_EQ(WaypointToString(0), "A");
ASSERT_EQ(StringToWaypoint("A"), 0);
}