15a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn/* 25a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Copyright (C) 2016 The Android Open Source Project 35a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * 45a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 55a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * you may not use this file except in compliance with the License. 65a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * You may obtain a copy of the License at 75a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * 85a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 95a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * 105a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Unless required by applicable law or agreed to in writing, software 115a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 125a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * See the License for the specific language governing permissions and 145a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * limitations under the License 155a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn */ 165a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn 175a969aa1391203e09dee3146fc31b395de36344eDianne Hackbornpackage com.android.internal.util; 185a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn 195a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn/** 205a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Helper class for implementing a ring buffer. This supplies the indices, you supply 215a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * the array(s). 225a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn */ 235a969aa1391203e09dee3146fc31b395de36344eDianne Hackbornpublic class RingBufferIndices { 245a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn private final int mCapacity; 255a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn 265a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn // The first valid element and the next open slot. 275a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn private int mStart; 285a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn private int mSize; 295a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn 305a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn /** 315a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Create ring buffer of the given capacity. 325a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn */ 335a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn public RingBufferIndices(int capacity) { 345a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn mCapacity = capacity; 355a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn } 365a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn 375a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn /** 385a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Add a new item to the ring buffer. If the ring buffer is full, this 395a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * replaces the oldest item. 405a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * @return Returns the index at which the new item appears, for placing in your array. 415a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn */ 425a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn public int add() { 435a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn if (mSize < mCapacity) { 445a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn final int pos = mSize; 455a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn mSize++; 465a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn return pos; 475a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn } 485a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn int pos = mStart; 495a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn mStart++; 505a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn if (mStart == mCapacity) { 515a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn mStart = 0; 525a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn } 535a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn return pos; 545a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn } 555a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn 565a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn /** 575a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Clear the ring buffer. 585a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn */ 595a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn public void clear() { 605a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn mStart = 0; 615a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn mSize = 0; 625a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn } 635a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn 645a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn /** 655a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Return the current size of the ring buffer. 665a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn */ 675a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn public int size() { 685a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn return mSize; 695a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn } 705a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn 715a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn /** 725a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * Convert a position in the ring buffer that is [0..size()] to an offset 735a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn * in the array(s) containing the ring buffer items. 745a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn */ 755a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn public int indexOf(int pos) { 765a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn int index = mStart + pos; 775a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn if (index >= mCapacity) { 785a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn index -= mCapacity; 795a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn } 805a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn return index; 815a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn } 825a969aa1391203e09dee3146fc31b395de36344eDianne Hackborn} 83