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