CharBufferImpl.java [plain text]
package gnu.java.nio;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
import java.nio.ReadOnlyBufferException;
public final class CharBufferImpl extends CharBuffer
{
private boolean readOnly;
public CharBufferImpl(int cap, int off, int lim)
{
super (cap, lim, off, 0);
this.backing_buffer = new char [cap];
readOnly = false;
}
public CharBufferImpl(char[] array, int offset, int length)
{
super (array.length, length, offset, 0);
this.backing_buffer = array;
readOnly = false;
}
public CharBufferImpl (CharBufferImpl copy)
{
super (copy.capacity (), copy.limit (), copy.position (), 0);
backing_buffer = copy.backing_buffer;
readOnly = copy.isReadOnly ();
}
private static native char[] nio_cast (byte[] copy);
CharBufferImpl (byte[] copy)
{
super (copy.length / 2, copy.length / 2, 0, 0);
this.backing_buffer = (copy != null ? nio_cast (copy) : null);
readOnly = false;
}
private static native byte nio_get_Byte (CharBufferImpl b, int index, int limit);
private static native void nio_put_Byte (CharBufferImpl b, int index, int limit, byte value);
public ByteBuffer asByteBuffer ()
{
ByteBufferImpl res = new ByteBufferImpl (backing_buffer);
res.limit ((limit () * 1) / 2);
return res;
}
public boolean isReadOnly()
{
return readOnly;
}
public CharBuffer slice()
{
return new CharBufferImpl (this);
}
public CharBuffer duplicate()
{
return new CharBufferImpl(this);
}
public CharBuffer asReadOnlyBuffer()
{
CharBufferImpl result = new CharBufferImpl (this);
result.readOnly = true;
return result;
}
public CharBuffer compact()
{
return this;
}
public boolean isDirect()
{
return false;
}
final public CharSequence subSequence (int start, int end)
{
if (start < 0 ||
end > length () ||
start > end)
throw new IndexOutOfBoundsException ();
return new CharBufferImpl (array (), position () + start,
position () + end);
}
final public char get()
{
char e = backing_buffer[position()];
position(position()+1);
return e;
}
final public CharBuffer put(char b)
{
if (readOnly)
throw new ReadOnlyBufferException ();
backing_buffer[position()] = b;
position(position()+1);
return this;
}
final public char get(int index)
{
if (index < 0
|| index >= limit ())
throw new IndexOutOfBoundsException ();
return backing_buffer[index];
}
final public CharBuffer put(int index, char b)
{
if (index < 0
|| index >= limit ())
throw new IndexOutOfBoundsException ();
if (readOnly)
throw new ReadOnlyBufferException ();
backing_buffer[index] = b;
return this;
}
public final ByteOrder order()
{
return ByteOrder.BIG_ENDIAN;
}
}