diff options
Diffstat (limited to '')
-rw-r--r-- | gfx/layers/apz/src/RecentEventsBuffer.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/gfx/layers/apz/src/RecentEventsBuffer.h b/gfx/layers/apz/src/RecentEventsBuffer.h new file mode 100644 index 0000000000..d1ae5797af --- /dev/null +++ b/gfx/layers/apz/src/RecentEventsBuffer.h @@ -0,0 +1,83 @@ +/* -*- 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 <deque> + +#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 <typename Event> +class RecentEventsBuffer { + public: + explicit RecentEventsBuffer(TimeDuration maxAge); + + void push(Event event); + void clear(); + + typedef typename std::deque<Event>::size_type size_type; + size_type size() { return mBuffer.size(); } + + // Delegate to container for iterators + typedef typename std::deque<Event>::iterator iterator; + typedef typename std::deque<Event>::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<Event>::reference reference; + typedef typename std::deque<Event>::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<Event> mBuffer; +}; + +template <typename Event> +RecentEventsBuffer<Event>::RecentEventsBuffer(TimeDuration maxAge) + : mMaxAge(maxAge), mBuffer() {} + +template <typename Event> +void RecentEventsBuffer<Event>::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 <typename Event> +void RecentEventsBuffer<Event>::clear() { + mBuffer.clear(); +} + +} // namespace layers +} // namespace mozilla + +#endif // mozilla_layers_RecentEventsBuffer_h |