From ec457551abfba3e39a8b7dfcf63d72d5e086496c Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sat, 20 Nov 2021 10:58:47 -0600 Subject: [PATCH] refactor: make Bandwidth.children a std::vector (#2197) --- libtransmission/bandwidth.cc | 21 ++++++++++++++++++--- libtransmission/bandwidth.h | 3 +-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/libtransmission/bandwidth.cc b/libtransmission/bandwidth.cc index e763517f7..da7a4a1fc 100644 --- a/libtransmission/bandwidth.cc +++ b/libtransmission/bandwidth.cc @@ -94,22 +94,37 @@ Bandwidth::Bandwidth(Bandwidth* new_parent) **** ***/ +static void remove_child(std::vector& v, Bandwidth* remove_me) +{ + auto it = std::find(std::begin(v), std::end(v), remove_me); + if (it == std::end(v)) + { + return; + } + + // the list isn't sorted -- so instead of erase()ing `it`, + // do the cheaper option of overwriting it with the final item + *it = v.back(); + v.resize(v.size() - 1); +} + void Bandwidth::setParent(Bandwidth* new_parent) { TR_ASSERT(this != new_parent); if (this->parent_ != nullptr) { - this->parent_->children_.erase(this); + remove_child(this->parent_->children_, this); this->parent_ = nullptr; } if (new_parent != nullptr) { TR_ASSERT(new_parent->parent_ != this); - TR_ASSERT(new_parent->children_.find(this) == new_parent->children_.end()); // does not exist + auto& children = new_parent->children_; + TR_ASSERT(std::find(std::begin(children), std::end(children), this) == std::end(children)); // not already there - new_parent->children_.insert(this); + new_parent->children_.push_back(this); this->parent_ = new_parent; } } diff --git a/libtransmission/bandwidth.h b/libtransmission/bandwidth.h index cc78b4676..e29cf5595 100644 --- a/libtransmission/bandwidth.h +++ b/libtransmission/bandwidth.h @@ -13,7 +13,6 @@ #endif #include -#include #include #include "transmission.h" @@ -247,7 +246,7 @@ private: mutable std::array band_ = {}; Bandwidth* parent_ = nullptr; - std::unordered_set children_; + std::vector children_; tr_peerIo* peer_ = nullptr; tr_priority_t priority_ = 0; };