1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker #ifndef RINGBUFFER_H_ 17*d57664e9SAndroid Build Coastguard Worker #define RINGBUFFER_H_ 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker #include "utils/Macros.h" 20*d57664e9SAndroid Build Coastguard Worker 21*d57664e9SAndroid Build Coastguard Worker #include <stddef.h> 22*d57664e9SAndroid Build Coastguard Worker 23*d57664e9SAndroid Build Coastguard Worker namespace android { 24*d57664e9SAndroid Build Coastguard Worker namespace uirenderer { 25*d57664e9SAndroid Build Coastguard Worker 26*d57664e9SAndroid Build Coastguard Worker template <class T, size_t SIZE> 27*d57664e9SAndroid Build Coastguard Worker class RingBuffer { 28*d57664e9SAndroid Build Coastguard Worker PREVENT_COPY_AND_ASSIGN(RingBuffer); 29*d57664e9SAndroid Build Coastguard Worker 30*d57664e9SAndroid Build Coastguard Worker public: RingBuffer()31*d57664e9SAndroid Build Coastguard Worker RingBuffer() {} ~RingBuffer()32*d57664e9SAndroid Build Coastguard Worker ~RingBuffer() {} 33*d57664e9SAndroid Build Coastguard Worker capacity()34*d57664e9SAndroid Build Coastguard Worker constexpr size_t capacity() const { return SIZE; } size()35*d57664e9SAndroid Build Coastguard Worker size_t size() const { return mCount; } 36*d57664e9SAndroid Build Coastguard Worker next()37*d57664e9SAndroid Build Coastguard Worker T& next() { 38*d57664e9SAndroid Build Coastguard Worker mHead = (mHead + 1) % SIZE; 39*d57664e9SAndroid Build Coastguard Worker if (mCount < SIZE) { 40*d57664e9SAndroid Build Coastguard Worker mCount++; 41*d57664e9SAndroid Build Coastguard Worker } 42*d57664e9SAndroid Build Coastguard Worker return mBuffer[mHead]; 43*d57664e9SAndroid Build Coastguard Worker } 44*d57664e9SAndroid Build Coastguard Worker front()45*d57664e9SAndroid Build Coastguard Worker T& front() { return (*this)[0]; } 46*d57664e9SAndroid Build Coastguard Worker back()47*d57664e9SAndroid Build Coastguard Worker T& back() { return (*this)[size() - 1]; } 48*d57664e9SAndroid Build Coastguard Worker 49*d57664e9SAndroid Build Coastguard Worker T& operator[](size_t index) { return mBuffer[(mHead + index + 1) % mCount]; } 50*d57664e9SAndroid Build Coastguard Worker 51*d57664e9SAndroid Build Coastguard Worker const T& operator[](size_t index) const { return mBuffer[(mHead + index + 1) % mCount]; } 52*d57664e9SAndroid Build Coastguard Worker clear()53*d57664e9SAndroid Build Coastguard Worker void clear() { 54*d57664e9SAndroid Build Coastguard Worker mCount = 0; 55*d57664e9SAndroid Build Coastguard Worker mHead = -1; 56*d57664e9SAndroid Build Coastguard Worker } 57*d57664e9SAndroid Build Coastguard Worker 58*d57664e9SAndroid Build Coastguard Worker private: 59*d57664e9SAndroid Build Coastguard Worker T mBuffer[SIZE]; 60*d57664e9SAndroid Build Coastguard Worker int mHead = -1; 61*d57664e9SAndroid Build Coastguard Worker size_t mCount = 0; 62*d57664e9SAndroid Build Coastguard Worker }; 63*d57664e9SAndroid Build Coastguard Worker 64*d57664e9SAndroid Build Coastguard Worker } // namespace uirenderer 65*d57664e9SAndroid Build Coastguard Worker } // namespace android 66*d57664e9SAndroid Build Coastguard Worker 67*d57664e9SAndroid Build Coastguard Worker #endif /* RINGBUFFER_H_ */ 68