From df181bb641a75e9fae557c683b790cfba961ec5a Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Sun, 30 May 2021 12:53:42 +0200 Subject: Codechange: [ContentInfo] Use a vector for dependencies instead of custom allocation --- src/network/core/tcp_content.cpp | 6 ++---- src/network/core/tcp_content_type.h | 3 +-- src/network/network_content.cpp | 22 +++++++++++----------- src/network/network_content_gui.cpp | 6 ++---- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index 041e932e4..fb726e2e7 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -24,7 +24,7 @@ ContentInfo::ContentInfo() : /* Temporary... will be removed later in the PR. */ type((ContentType)0), id((ContentID)0), filesize(0), filename(""), name(""), version(""), - url(""), description(""), unique_id(0), md5sum(""), dependency_count(0), dependencies(nullptr), + url(""), description(""), unique_id(0), md5sum(""), state((State)0), upgrade(false) { } @@ -32,7 +32,6 @@ ContentInfo::ContentInfo() /** Free everything allocated */ ContentInfo::~ContentInfo() { - free(this->dependencies); } /** @@ -42,9 +41,8 @@ ContentInfo::~ContentInfo() void ContentInfo::TransferFrom(ContentInfo *other) { if (other != this) { - free(this->dependencies); *this = *other; - other->dependencies = nullptr; + other->dependencies.clear(); other->tags.clear(); } } diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index 93367746d..2186997e8 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -67,8 +67,7 @@ struct ContentInfo { char description[512]; ///< Description of the content uint32 unique_id; ///< Unique ID; either GRF ID or shortname byte md5sum[16]; ///< The MD5 checksum - uint8 dependency_count; ///< Number of dependencies - ContentID *dependencies; ///< Malloced array of dependencies (unique server side ids) + std::vector dependencies; ///< The dependencies (unique server side ids) StringList tags; ///< Tags associated with the content State state; ///< Whether the content info is selected (for download) bool upgrade; ///< This item is an upgrade diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 27ffee970..37df60877 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -66,9 +66,9 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) ci->md5sum[j] = p->Recv_uint8(); } - ci->dependency_count = p->Recv_uint8(); - ci->dependencies = MallocT(ci->dependency_count); - for (uint i = 0; i < ci->dependency_count; i++) ci->dependencies[i] = (ContentID)p->Recv_uint32(); + uint dependency_count = p->Recv_uint8(); + ci->dependencies.reserve(dependency_count); + for (uint i = 0; i < dependency_count; i++) ci->dependencies.push_back((ContentID)p->Recv_uint32()); uint tag_count = p->Recv_uint8(); ci->tags.reserve(tag_count); @@ -927,8 +927,8 @@ void ClientNetworkContentSocketHandler::ReverseLookupDependency(ConstContentVect for (const ContentInfo *ci : this->infos) { if (ci == child) continue; - for (uint i = 0; i < ci->dependency_count; i++) { - if (ci->dependencies[i] == child->id) { + for (auto &dependency : ci->dependencies) { + if (dependency == child->id) { parents.push_back(ci); break; } @@ -969,10 +969,10 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(ContentInfo *ci) /* Selection is easy; just walk all children and set the * autoselected state. That way we can see what we automatically * selected and thus can unselect when a dependency is removed. */ - for (uint i = 0; i < ci->dependency_count; i++) { - ContentInfo *c = this->GetContent(ci->dependencies[i]); + for (auto &dependency : ci->dependencies) { + ContentInfo *c = this->GetContent(dependency); if (c == nullptr) { - this->DownloadContentInfo(ci->dependencies[i]); + this->DownloadContentInfo(dependency); } else if (c->state == ContentInfo::UNSELECTED) { c->state = ContentInfo::AUTOSELECTED; this->CheckDependencyState(c); @@ -995,10 +995,10 @@ void ClientNetworkContentSocketHandler::CheckDependencyState(ContentInfo *ci) this->Unselect(c->id); } - for (uint i = 0; i < ci->dependency_count; i++) { - const ContentInfo *c = this->GetContent(ci->dependencies[i]); + for (auto &dependency : ci->dependencies) { + const ContentInfo *c = this->GetContent(dependency); if (c == nullptr) { - DownloadContentInfo(ci->dependencies[i]); + DownloadContentInfo(dependency); continue; } if (c->state != ContentInfo::AUTOSELECTED) continue; diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index a617f4e49..5a03561c9 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -725,13 +725,11 @@ public: SetDParam(0, this->selected->filesize); y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_FILESIZE); - if (this->selected->dependency_count != 0) { + if (!this->selected->dependencies.empty()) { /* List dependencies */ char buf[DRAW_STRING_BUFFER] = ""; char *p = buf; - for (uint i = 0; i < this->selected->dependency_count; i++) { - ContentID cid = this->selected->dependencies[i]; - + for (auto &cid : this->selected->dependencies) { /* Try to find the dependency */ ConstContentIterator iter = _network_content_client.Begin(); for (; iter != _network_content_client.End(); iter++) { -- cgit v1.2.3-70-g09d2