From 40c7645d6e59809fd0ee30d8de8b0f3e2797c180 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 15 Sep 2021 21:35:20 -0700 Subject: [PATCH] [wpiutil] UidVector: Return old object from erase() (#3571) This makes it possible to erase and then do additional cleanup (e.g. on a unique_ptr). --- .../src/main/native/include/wpi/CallbackManager.h | 2 +- wpiutil/src/main/native/include/wpi/UidVector.h | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/wpiutil/src/main/native/include/wpi/CallbackManager.h b/wpiutil/src/main/native/include/wpi/CallbackManager.h index c94321d50a..d018fc1c3b 100644 --- a/wpiutil/src/main/native/include/wpi/CallbackManager.h +++ b/wpiutil/src/main/native/include/wpi/CallbackManager.h @@ -216,7 +216,7 @@ class CallbackManager { return; } poller->Terminate(); - return thr->m_pollers.erase(poller_uid); + thr->m_pollers.erase(poller_uid); } bool WaitForQueue(double timeout) { diff --git a/wpiutil/src/main/native/include/wpi/UidVector.h b/wpiutil/src/main/native/include/wpi/UidVector.h index ad4bcb6169..9029f1a2c2 100644 --- a/wpiutil/src/main/native/include/wpi/UidVector.h +++ b/wpiutil/src/main/native/include/wpi/UidVector.h @@ -80,8 +80,8 @@ class UidVector { using const_iterator = impl::UidVectorIterator::const_iterator>; - bool empty() const { return m_active_count == 0; } - size_type size() const { return m_vector.size(); } + bool empty() const noexcept { return m_active_count == 0; } + size_type size() const noexcept { return m_vector.size(); } T& operator[](size_type i) { return m_vector[i]; } const T& operator[](size_type i) const { return m_vector[i]; } @@ -105,17 +105,19 @@ class UidVector { // Removes the identified element by replacing it with a default-constructed // one. The element is added to the freelist for later reuse. - void erase(size_type uid) { + T erase(size_type uid) { if (uid >= m_vector.size() || !m_vector[uid]) { - return; + return T(); } m_free.push_back(uid); + auto rv = std::move(m_vector[uid]); m_vector[uid] = T(); --m_active_count; + return rv; } // Removes all elements. - void clear() { + void clear() noexcept { m_vector.clear(); m_free.clear(); m_active_count = 0;