content: /*
   * Copyright (C) 2016 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License
   */
  
  package com.android.internal.util;
  
  /**
   * Helper class for implementing a ring buffer.  This supplies the indices, you supply
   * the array(s).
   */
  public class RingBufferIndices {
      private final int mCapacity;
  
      // The first valid element and the next open slot.
      private int mStart;
      private int mSize;
  
      /**
       * Create ring buffer of the given capacity.
       */
      public RingBufferIndices(int capacity) {
          mCapacity = capacity;
      }
  
      /**
       * Add a new item to the ring buffer.  If the ring buffer is full, this
       * replaces the oldest item.
       * @return Returns the index at which the new item appears, for placing in your array.
       */
      public int add() {
          if (mSize < mCapacity) {
              final int pos = mSize;
              mSize++;
              return pos;
          }
          int pos = mStart;
          mStart++;
          if (mStart == mCapacity) {
              mStart = 0;
          }
          return pos;
      }
  
      /**
       * Clear the ring buffer.
       */
      public void clear() {
          mStart = 0;
          mSize = 0;
      }
  
      /**
       * Return the current size of the ring buffer.
       */
      public int size() {
          return mSize;
      }
  
      /**
       * Convert a position in the ring buffer that is [0..size()] to an offset
       * in the array(s) containing the ring buffer items.
       */
      public int indexOf(int pos) {
          int index = mStart + pos;
          if (index >= mCapacity) {
              index -= mCapacity;
          }
          return index;
      }
  }
  