custom-board-bundle-sample-.../java_console/io/src/main/etch/util/ByteBuffer.java

192 lines
4.6 KiB
Java

/* $Id$
*
* Copyright 2007-2008 Cisco Systems Inc.
*
* 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 etch.util;
import java.io.EOFException;
import java.nio.BufferOverflowException;
/**
* Byte buffer with operation to support getting and putting
* bytes.
*/
abstract public class ByteBuffer {
/**
* @return true if the buffer is empty.
*/
public boolean isEmpty() {
return length() == 0;
}
/**
* @return true if the buffer is full.
*/
public boolean isFull() {
return length() == size();
}
/**
* @return the amount of data the buffer can hold.
*/
abstract public int size();
/**
* @return the amount of data in the buffer.
*/
abstract public int length();
/**
* @return the next byte from the buffer.
* @throws EOFException if the buffer is empty.
*/
abstract public byte get() throws EOFException;
/**
* Gets bytes from the buffer to fill buf.
*
* @param buf
* @return the length of data put into buf.
*/
public int get(byte[] buf) {
return get(buf, 0, buf.length);
}
/**
* Gets bytes from the buffer to fill buf, starting at the specified
* position for the specified length.
*
* @param buf
* @param off
* @param len
* @return the length of data put into buf.
*/
public int get(byte[] buf, int off, int len) {
if (off < 0)
throw new IllegalArgumentException("off < 0");
if (len < 0)
throw new IllegalArgumentException("len < 0");
if (off + len > buf.length)
throw new IllegalArgumentException("off+len > buf.length");
if (len == 0)
return 0;
int count = 0;
try {
while (len > 0) {
buf[off] = get();
count++;
off++;
len--;
}
} catch (EOFException e) {
// nothing to do.
}
return count;
}
/**
* Puts a byte into the buffer.
*
* @param b
* @throws BufferOverflowException if the buffer is full
*/
abstract public void put(byte b) throws BufferOverflowException;
/**
* Puts the bytes from buf into the buffer.
*
* @param buf
* @return the amount of data copied into the buffer.
*/
public int put(byte[] buf) {
return put(buf, 0, buf.length);
}
/**
* Puts the bytes from buf into the buffer, starting at the specified
* position for the specified length;
*
* @param buf
* @param off
* @param len
* @return the amount of data copied into the buffer.
*/
public int put(byte[] buf, int off, int len) {
if (off < 0)
throw new IllegalArgumentException("off < 0");
if (len < 0)
throw new IllegalArgumentException("len < 0");
if (off + len > buf.length)
throw new IllegalArgumentException("off+len > buf.length");
if (len == 0)
return 0;
int count = 0;
try {
while (len > 0) {
put(buf[off]);
count++;
off++;
len--;
}
} catch (BufferOverflowException e) {
// nothing to do.
}
return count;
}
/**
* Clears the buffer.
*/
abstract public void clear();
/**
* @return a little-endian 32-bit integer from the buffer.
* @throws EOFException
*/
public int getInt() throws EOFException {
int b0 = get() & 255;
int b1 = get() & 255;
int b2 = get() & 255;
int b3 = get() & 255;
return b0 | (b1 << 8) | (b2 << 16) | (b3 << 24);
}
public int getShort() throws EOFException {
int b0 = get() & 255;
int b1 = get() & 255;
return (b0 | (b1 << 8));
}
/**
* Puts a little-endian 32-bit integer into the buffer.
*
* @param x
*/
public void putInt(int x) {
put((byte) x);
put((byte) (x >>> 8));
put((byte) (x >>> 16));
put((byte) (x >>> 24));
}
}