From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- gfx/layers/apz/src/RecentEventsBuffer.h | 83 +++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 gfx/layers/apz/src/RecentEventsBuffer.h (limited to 'gfx/layers/apz/src/RecentEventsBuffer.h') 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 + +#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 -- cgit v1.2.3