summaryrefslogtreecommitdiff
path: root/common/device/com/android/net/module/util/async/CircularByteBuffer.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/device/com/android/net/module/util/async/CircularByteBuffer.java')
-rw-r--r--common/device/com/android/net/module/util/async/CircularByteBuffer.java210
1 files changed, 0 insertions, 210 deletions
diff --git a/common/device/com/android/net/module/util/async/CircularByteBuffer.java b/common/device/com/android/net/module/util/async/CircularByteBuffer.java
deleted file mode 100644
index 92daa08f..00000000
--- a/common/device/com/android/net/module/util/async/CircularByteBuffer.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2022 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.net.module.util.async;
-
-import java.util.Arrays;
-
-/**
- * Implements a circular read-write byte buffer.
- *
- * @hide
- */
-public final class CircularByteBuffer implements ReadableByteBuffer {
- private final byte[] mBuffer;
- private final int mCapacity;
- private int mReadPos;
- private int mWritePos;
- private int mSize;
-
- public CircularByteBuffer(int capacity) {
- mCapacity = capacity;
- mBuffer = new byte[mCapacity];
- }
-
- @Override
- public void clear() {
- mReadPos = 0;
- mWritePos = 0;
- mSize = 0;
- Arrays.fill(mBuffer, (byte) 0);
- }
-
- @Override
- public int capacity() {
- return mCapacity;
- }
-
- @Override
- public int size() {
- return mSize;
- }
-
- /** Returns the amount of remaining writeable space in this buffer. */
- public int freeSize() {
- return mCapacity - mSize;
- }
-
- @Override
- public byte peek(int offset) {
- if (offset < 0 || offset >= size()) {
- throw new IllegalArgumentException("Invalid offset=" + offset + ", size=" + size());
- }
-
- return mBuffer[(mReadPos + offset) % mCapacity];
- }
-
- @Override
- public void readBytes(byte[] dst, int dstPos, int dstLen) {
- if (dst != null) {
- Assertions.throwsIfOutOfBounds(dst, dstPos, dstLen);
- }
- if (dstLen > size()) {
- throw new IllegalArgumentException("Invalid len=" + dstLen + ", size=" + size());
- }
-
- while (dstLen > 0) {
- final int copyLen = getCopyLen(mReadPos, mWritePos, dstLen);
- if (dst != null) {
- System.arraycopy(mBuffer, mReadPos, dst, dstPos, copyLen);
- }
- dstPos += copyLen;
- dstLen -= copyLen;
- mSize -= copyLen;
- mReadPos = (mReadPos + copyLen) % mCapacity;
- }
-
- if (mSize == 0) {
- // Reset to the beginning for better contiguous access.
- mReadPos = 0;
- mWritePos = 0;
- }
- }
-
- @Override
- public void peekBytes(int offset, byte[] dst, int dstPos, int dstLen) {
- Assertions.throwsIfOutOfBounds(dst, dstPos, dstLen);
- if (offset + dstLen > size()) {
- throw new IllegalArgumentException("Invalid len=" + dstLen
- + ", offset=" + offset + ", size=" + size());
- }
-
- int tmpReadPos = (mReadPos + offset) % mCapacity;
- while (dstLen > 0) {
- final int copyLen = getCopyLen(tmpReadPos, mWritePos, dstLen);
- System.arraycopy(mBuffer, tmpReadPos, dst, dstPos, copyLen);
- dstPos += copyLen;
- dstLen -= copyLen;
- tmpReadPos = (tmpReadPos + copyLen) % mCapacity;
- }
- }
-
- @Override
- public int getDirectReadSize() {
- if (size() == 0) {
- return 0;
- }
- return (mReadPos < mWritePos ? (mWritePos - mReadPos) : (mCapacity - mReadPos));
- }
-
- @Override
- public int getDirectReadPos() {
- return mReadPos;
- }
-
- @Override
- public byte[] getDirectReadBuffer() {
- return mBuffer;
- }
-
- @Override
- public void accountForDirectRead(int len) {
- if (len < 0 || len > size()) {
- throw new IllegalArgumentException("Invalid len=" + len + ", size=" + size());
- }
-
- mSize -= len;
- mReadPos = (mReadPos + len) % mCapacity;
- }
-
- /** Copies given data to the end of the buffer. */
- public void writeBytes(byte[] buffer, int pos, int len) {
- Assertions.throwsIfOutOfBounds(buffer, pos, len);
- if (len > freeSize()) {
- throw new IllegalArgumentException("Invalid len=" + len + ", size=" + freeSize());
- }
-
- while (len > 0) {
- final int copyLen = getCopyLen(mWritePos, mReadPos,len);
- System.arraycopy(buffer, pos, mBuffer, mWritePos, copyLen);
- pos += copyLen;
- len -= copyLen;
- mSize += copyLen;
- mWritePos = (mWritePos + copyLen) % mCapacity;
- }
- }
-
- private int getCopyLen(int startPos, int endPos, int len) {
- if (startPos < endPos) {
- return Math.min(len, endPos - startPos);
- } else {
- return Math.min(len, mCapacity - startPos);
- }
- }
-
- /** Returns the amount of contiguous writeable space. */
- public int getDirectWriteSize() {
- if (freeSize() == 0) {
- return 0; // Return zero in case buffer is full.
- }
- return (mWritePos < mReadPos ? (mReadPos - mWritePos) : (mCapacity - mWritePos));
- }
-
- /** Returns the position of contiguous writeable space. */
- public int getDirectWritePos() {
- return mWritePos;
- }
-
- /** Returns the buffer reference for direct write operation. */
- public byte[] getDirectWriteBuffer() {
- return mBuffer;
- }
-
- /** Must be called after performing a direct write using getDirectWriteBuffer(). */
- public void accountForDirectWrite(int len) {
- if (len < 0 || len > freeSize()) {
- throw new IllegalArgumentException("Invalid len=" + len + ", size=" + freeSize());
- }
-
- mSize += len;
- mWritePos = (mWritePos + len) % mCapacity;
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("CircularByteBuffer{c=");
- sb.append(mCapacity);
- sb.append(",s=");
- sb.append(mSize);
- sb.append(",r=");
- sb.append(mReadPos);
- sb.append(",w=");
- sb.append(mWritePos);
- sb.append('}');
- return sb.toString();
- }
-}