Index: src/libchcore/TOrderedBufferQueue.cpp =================================================================== diff -u -N -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28 -r71bc7ffbd5b707e2cbb78eb30677d82577d62ee1 --- src/libchcore/TOrderedBufferQueue.cpp (.../TOrderedBufferQueue.cpp) (revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28) +++ src/libchcore/TOrderedBufferQueue.cpp (.../TOrderedBufferQueue.cpp) (revision 71bc7ffbd5b707e2cbb78eb30677d82577d62ee1) @@ -78,6 +78,22 @@ m_eventHasBuffers.ResetEvent(); } + std::vector TOrderedBufferQueue::GetUnneededLastParts() + { + auto iterFind = std::find_if(m_setBuffers.begin(), m_setBuffers.end(), [](TOverlappedDataBuffer* pBuffer) { return pBuffer->IsLastPart(); }); + if(iterFind == m_setBuffers.end() || ++iterFind == m_setBuffers.end()) + return std::vector(); + + auto iterInvalidParts = std::find_if(iterFind, m_setBuffers.end(), [](TOverlappedDataBuffer* pBuffer) { return !pBuffer->IsLastPart(); }); + if(iterInvalidParts != m_setBuffers.end()) + throw TCoreException(eErr_InvalidArgument, L"Found non-last-parts after last-part", LOCATION); + + std::vector vBuffers(iterFind, m_setBuffers.end()); + m_setBuffers.erase(iterFind, m_setBuffers.end()); + + return vBuffers; + } + size_t TOrderedBufferQueue::GetCount() const { return m_setBuffers.size();