From cd9f43785c507c24db634f7a71cef3a37eb5c281 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 19 Oct 2017 02:59:07 -0700 Subject: [PATCH] Use remove_if to clean up loaded future buffers --- include/AL/alure2.h | 9 ++++---- src/context.cpp | 65 +++++++++++++++++++++++++---------------------------- 2 files changed, 34 insertions(+), 40 deletions(-) diff --git a/include/AL/alure2.h b/include/AL/alure2.h index d43c01e..c42536e 100644 --- a/include/AL/alure2.h +++ b/include/AL/alure2.h @@ -931,9 +931,7 @@ public: * use. */ void play(SharedPtr decoder, ALuint updatelen, ALuint queuesize); - /** - * Stops playback, releasing the buffer or decoder reference. - */ + /** Stops playback, releasing the buffer or decoder reference. */ void stop(); /** Pauses the source if it is playing. */ @@ -1139,8 +1137,9 @@ public: /** * Specifies if the source always has 3D spatialization features (On), * never has 3D spatialization features (Off), or if spatialization is - * enabled based on playing a mono sound or not (Auto, default). Has no - * effect without the AL_SOFT_source_spatialize extension. + * enabled based on playing a mono sound or not (Auto, default). + * + * Has no effect without the AL_SOFT_source_spatialize extension. */ void set3DSpatialize(Spatialize spatialize); Spatialize get3DSpatialize() const; diff --git a/src/context.cpp b/src/context.cpp index 0fb254f..9ef04e6 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -841,13 +841,12 @@ Buffer ContextImpl::getBuffer(StringView name) } // Clear out any completed futures. - for(iter = mFutureBuffers.begin();iter != mFutureBuffers.end();) - { - if(iter->mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready) - iter = mFutureBuffers.erase(iter); - else - ++iter; - } + mFutureBuffers.erase( + std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), + [](const PendingFuture &entry) -> bool + { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + ), mFutureBuffers.end() + ); // If we got the buffer, return it. Otherwise, go load it normally. if(buffer) return buffer; @@ -889,13 +888,12 @@ SharedFuture ContextImpl::getBufferAsync(StringView name) } // Clear out any fulfilled futures. - for(iter = mFutureBuffers.begin();iter != mFutureBuffers.end();) - { - if(iter->mFuture.wait_for(std::chrono::milliseconds::zero()) == std::future_status::ready) - iter = mFutureBuffers.erase(iter); - else - ++iter; - } + mFutureBuffers.erase( + std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), + [](const PendingFuture &entry) -> bool + { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + ), mFutureBuffers.end() + ); } auto iter = std::lower_bound(mBuffers.begin(), mBuffers.end(), hasher(name), @@ -939,13 +937,12 @@ void ContextImpl::precacheBuffersAsync(ArrayView names) if(EXPECT(!mFutureBuffers.empty(), false)) { // Clear out any fulfilled futures. - for(auto iter = mFutureBuffers.begin();iter != mFutureBuffers.end();) - { - if(iter->mFuture.wait_for(std::chrono::milliseconds::zero()) == std::future_status::ready) - iter = mFutureBuffers.erase(iter); - else - ++iter; - } + mFutureBuffers.erase( + std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), + [](const PendingFuture &entry) -> bool + { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + ), mFutureBuffers.end() + ); } auto hasher = std::hash(); @@ -1009,13 +1006,12 @@ SharedFuture ContextImpl::createBufferAsyncFrom(StringView name, SharedP if(EXPECT(!mFutureBuffers.empty(), false)) { // Clear out any fulfilled futures. - for(auto iter = mFutureBuffers.begin();iter != mFutureBuffers.end();) - { - if(iter->mFuture.wait_for(std::chrono::milliseconds::zero()) == std::future_status::ready) - iter = mFutureBuffers.erase(iter); - else - ++iter; - } + mFutureBuffers.erase( + std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), + [](const PendingFuture &entry) -> bool + { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + ), mFutureBuffers.end() + ); } auto hasher = std::hash(); @@ -1067,13 +1063,12 @@ void ContextImpl::removeBuffer(StringView name) } // Clear out any completed futures. - for(iter = mFutureBuffers.begin();iter != mFutureBuffers.end();) - { - if(iter->mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready) - iter = mFutureBuffers.erase(iter); - else - ++iter; - } + mFutureBuffers.erase( + std::remove_if(mFutureBuffers.begin(), mFutureBuffers.end(), + [](const PendingFuture &entry) -> bool + { return entry.mFuture.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready; } + ), mFutureBuffers.end() + ); } auto iter = std::lower_bound(mBuffers.begin(), mBuffers.end(), hasher(name), -- 2.11.4.GIT