mirror of
https://github.com/electronicarts/CNC_TS_and_RA2_Mission_Editor.git
synced 2025-04-30 17:11:40 -04:00
#52, fixed placing existing waypoint issue again .
This commit is contained in:
parent
32dd320768
commit
f4617c29dd
3 changed files with 22 additions and 13 deletions
|
@ -137,12 +137,13 @@ public:
|
|||
return this->FindValue(val) >= 0;
|
||||
}
|
||||
|
||||
size_t LowerBound(const CString& key) const {
|
||||
// <pos, existed?>
|
||||
std::pair<size_t, bool> LowerBound(const CString& key) const {
|
||||
auto const it = value_pos.lower_bound(key);
|
||||
if (it != value_pos.end()) {
|
||||
return it->second;
|
||||
return { it->second, it->first == key };
|
||||
}
|
||||
return value_pairs.size();
|
||||
return { value_pairs.size(), false };
|
||||
}
|
||||
|
||||
// ==================== Modify
|
||||
|
@ -176,7 +177,7 @@ public:
|
|||
value_pairs.push_back({ key, value });
|
||||
value_pos.insert_or_assign(key, value_pairs.size() - 1);
|
||||
}
|
||||
|
||||
// not recommended to call it directly
|
||||
void InsertAt(size_t idx, CString&& key, CString&& value) {
|
||||
if (idx > value_pairs.size()) {
|
||||
idx = value_pairs.size() - 1;
|
||||
|
@ -188,9 +189,13 @@ public:
|
|||
it->second++;
|
||||
}
|
||||
}
|
||||
void Insert(CString&& key, CString&& value) {
|
||||
auto const pos = LowerBound(key);
|
||||
InsertAt(pos, std::move(key), std::move(value));
|
||||
void InsertOrAssign(CString&& key, CString&& value) {
|
||||
auto const [pos, found] = LowerBound(key);
|
||||
if (!found) {
|
||||
InsertAt(pos, std::move(key), std::move(value));
|
||||
}
|
||||
// existed, assign
|
||||
value_pairs[pos].second = std::move(value);
|
||||
}
|
||||
|
||||
// ==================== Delete
|
||||
|
|
|
@ -2060,7 +2060,7 @@ BOOL CMapData::AddWaypoint(CString id, DWORD dwPos)
|
|||
pSec = &m_mapfile.AddSection("Waypoints");
|
||||
}
|
||||
|
||||
pSec->Insert(std::move(id), k);
|
||||
pSec->InsertOrAssign(std::move(id), k);
|
||||
|
||||
if (!m_noAutoObjectUpdate) {
|
||||
UpdateWaypoints(FALSE);
|
||||
|
|
|
@ -260,15 +260,19 @@ TEST(CIniFileClass, IniLowerBoundInsertTest) {
|
|||
auto const pSec = file.TryGetSection("Waypoints");
|
||||
EXPECT_NE(pSec, nullptr);
|
||||
auto const pos = pSec->LowerBound("4");
|
||||
EXPECT_LE(pos, pSec->Size());
|
||||
pSec->InsertAt(pos, "4", "432156");
|
||||
EXPECT_LE(pos.first, pSec->Size());
|
||||
// not existed
|
||||
EXPECT_EQ(pos.second, false);
|
||||
pSec->InsertAt(pos.first, "4", "432156");
|
||||
EXPECT_EQ(432156, file.GetInteger("Waypoints", "4"));
|
||||
EXPECT_EQ("432156", file["Waypoints"].Nth(3).second);
|
||||
EXPECT_EQ("789654", file["Waypoints"].Nth(4).second);
|
||||
pSec->Insert("9", "149367");
|
||||
pSec->Insert("11", "987654");
|
||||
pSec->InsertOrAssign("9", "149367");
|
||||
pSec->InsertOrAssign("11", "987654");
|
||||
pSec->InsertOrAssign("10", "159356"); // existed replace
|
||||
EXPECT_EQ(149367, file.GetInteger("Waypoints", "9"));
|
||||
EXPECT_EQ(159356, file.GetInteger("Waypoints", "10"));
|
||||
EXPECT_EQ(987654, file.GetInteger("Waypoints", "11"));
|
||||
EXPECT_EQ("987654", file["Waypoints"].Nth(pSec->Size() - 1).second);
|
||||
EXPECT_EQ("159357", file["Waypoints"].Nth(pSec->Size() - 2).second);
|
||||
EXPECT_EQ("159356", file["Waypoints"].Nth(pSec->Size() - 2).second);
|
||||
}
|
Loading…
Add table
Reference in a new issue