/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef mozilla_layers_RecentEventsBuffer_h #define mozilla_layers_RecentEventsBuffer_h #include #include "mozilla/TimeStamp.h" namespace mozilla { namespace layers { /** * RecentEventsBuffer: maintains an age constrained buffer of events * * Intended for use with elements of type InputData, but the only requirement * is a member "mTimeStamp" of type TimeStamp */ template class RecentEventsBuffer { public: explicit RecentEventsBuffer(TimeDuration maxAge); void push(Event event); void clear(); typedef typename std::deque::size_type size_type; size_type size() { return mBuffer.size(); } // Delegate to container for iterators typedef typename std::deque::iterator iterator; typedef typename std::deque::const_iterator const_iterator; iterator begin() { return mBuffer.begin(); } iterator end() { return mBuffer.end(); } const_iterator cbegin() const { return mBuffer.cbegin(); } const_iterator cend() const { return mBuffer.cend(); } // Also delegate for front/back typedef typename std::deque::reference reference; typedef typename std::deque::const_reference const_reference; reference front() { return mBuffer.front(); } reference back() { return mBuffer.back(); } const_reference front() const { return mBuffer.front(); } const_reference back() const { return mBuffer.back(); } private: TimeDuration mMaxAge; std::deque mBuffer; }; template RecentEventsBuffer::RecentEventsBuffer(TimeDuration maxAge) : mMaxAge(maxAge), mBuffer() {} template void RecentEventsBuffer::push(Event event) { // Events must be pushed in chronological order MOZ_ASSERT(mBuffer.empty() || mBuffer.back().mTimeStamp <= event.mTimeStamp); mBuffer.push_back(event); // Flush all events older than the given lifetime TimeStamp bound = event.mTimeStamp - mMaxAge; while (!mBuffer.empty()) { if (mBuffer.front().mTimeStamp >= bound) { break; } mBuffer.pop_front(); } } template void RecentEventsBuffer::clear() { mBuffer.clear(); } } // namespace layers } // namespace mozilla #endif // mozilla_layers_RecentEventsBuffer_h