Mercurial > hg > Members > kono > jpf-core
diff src/classes/java/nio/ByteBuffer.java @ 0:61d41facf527
initial v8 import (history reset)
author | Peter Mehlitz <Peter.C.Mehlitz@nasa.gov> |
---|---|
date | Fri, 23 Jan 2015 10:14:01 -0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/classes/java/nio/ByteBuffer.java Fri Jan 23 10:14:01 2015 -0800 @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2014, United States Government, as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All rights reserved. + * + * The Java Pathfinder core (jpf-core) platform is 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 java.nio; + +public class ByteBuffer extends Buffer { + byte[] array; + + public static ByteBuffer allocate(int i) { + if (i < 0) { + throw new IllegalArgumentException(); + } + ByteBuffer newBuffer = new ByteBuffer(i); + return newBuffer; + } + + public static ByteBuffer allocateDirect(int capacity) { + return allocate(capacity); + } + + protected ByteBuffer(int i) { + capacity = i; + this.clear(); + array = new byte[i]; + } + + public ByteBuffer duplicate() { + ByteBuffer copy = new ByteBuffer(capacity); + copy.array = array; + return copy; + } + + public ByteBuffer asReadOnlyBuffer() { + return duplicate(); + } + + public ByteBuffer slice() { + int remaining = limit - position; + ByteBuffer copy = new ByteBuffer(remaining); + copy.array = array; + return copy; + } + + public ByteBuffer put(byte b) { + if (position >= limit) { + throw new BufferOverflowException(); + } + array[position] = b; + position++; + return this; + } + + public ByteBuffer put(int i, byte b) { + if ((i < 0) || (i >= limit)) { + throw new IndexOutOfBoundsException(); + } + array[i] = b; + return this; + } + + public ByteBuffer put(ByteBuffer src) { + if (src == this) { + throw new IllegalArgumentException(); + } + + int srcRemaining = src.remaining(); + if (srcRemaining > remaining()) { + throw new BufferOverflowException(); + } + + System.arraycopy(src.array, src.position(), array, position, srcRemaining); + + src.position(src.position() + srcRemaining); + position(position + srcRemaining); + + return this; + } + + public ByteBuffer put(byte[] bytes, int offset, int length) { + if ((offset | length | (offset + length) | (bytes.length - (offset + length))) < 0) { + throw new IndexOutOfBoundsException(); + } + + if (length > remaining()) { + throw new BufferOverflowException(); + } + + System.arraycopy(bytes, offset, array, position, length); + position(position + length); + + return this; + } + + public ByteBuffer put(byte[] bytes) { + return put(bytes, 0, bytes.length); + } + + public byte get() { + if (position >= limit) { + throw new BufferUnderflowException(); + } + position++; + return array[position-1]; + } + + public byte get(int i) { + if ((i < 0) || (i >= limit)) { + throw new IndexOutOfBoundsException(); + } + return array[i]; + } + + public ByteBuffer get(byte[] bytes) { + return get(bytes, 0, bytes.length); + } + + public ByteBuffer get(byte[] bytes, int offset, int length) { + if ((offset | length | (offset + length) | (bytes.length - (offset + length))) < 0) { + throw new IndexOutOfBoundsException(); + } + + if (length > remaining()) { + throw new BufferUnderflowException(); + } + + int end = offset + length; + for (int i = offset; i < end; i++) { + bytes[i] = get(); + } + return this; + } + + public ByteBuffer order(ByteOrder order) { + return this; + } + + /*************************************************************** + * public char getChar() + * @return 16 bit (UTF-16) char of ByteBuffer at this.position + * Caution: 8 or 32 bit character encodings are not supported. + */ + public char getChar() { + char res=getChar(this.position); + this.position+=2; + return res; + } + + /*************************************************************** + * public char getChar(int pos) + * @return 16 bit (UTF-16) char of ByteBuffer at int pos + * Caution: 8 or 32 bit character encodings are not supported. + */ + public char getChar(int pos) { + if (limit - pos < 2) { + throw new BufferUnderflowException(); + } + int x1 = (array[pos] & 0xff) << 8; + int x0 = (array[pos+1] & 0xff); + + return (char) (x1 | x0); + } + + /*************************************************************** + * public ByteBuffer putChar(char c) + * @return insert 16 bit (UTF-16) char c at this.position + * Caution: 8 or 32 bit character encodings are not supported. + */ + public ByteBuffer putChar(char c) { + if (limit - position < 2) { + throw new BufferOverflowException(); + } + array[position] = (byte)(c >> 8); + array[position+1] = (byte)(c ); + position += 2; + + return this; + } + + public int getInt() { + if (limit - position < 4) { + throw new BufferUnderflowException(); + } + + int x3 = (array[position ] ) << 24; + int x2 = (array[position+1] & 0xff) << 16; + int x1 = (array[position+2] & 0xff) << 8; + int x0 = (array[position+3] & 0xff); + position += 4; + + return (x3 | x2 | x1 | x0); + } + + public ByteBuffer putInt(int x) { + if (limit - position < 4) { + throw new BufferOverflowException(); + } + + array[position ] = (byte)(x >> 24); + array[position+1] = (byte)(x >> 16); + array[position+2] = (byte)(x >> 8); + array[position+3] = (byte)(x ); + position += 4; + + return this; + } + + public long getLong() { + if (limit - position < 8) { + throw new BufferUnderflowException(); + } + + long x7 = ((long)(array[position ] ) << 56); + long x6 = ((long)(array[position+1] & 0xff) << 48); + long x5 = ((long)(array[position+2] & 0xff) << 40); + long x4 = ((long)(array[position+3] & 0xff) << 32); + long x3 = ((long)(array[position+4] & 0xff) << 24); + long x2 = ((long)(array[position+5] & 0xff) << 16); + long x1 = ((long)(array[position+6] & 0xff) << 8); + long x0 = (array[position+7] & 0xff ); + position += 8; + + return (x7 | x6 | x5 | x4 | x3 | x2 | x1 | x0); + } + + public ByteBuffer putLong(long x) { + if (limit - position < 8) { + throw new BufferOverflowException(); + } + + array[position ] = (byte)((x >> 56) ); + array[position+1] = (byte)((x >> 48) & 0xff); + array[position+2] = (byte)((x >> 40) & 0xff); + array[position+3] = (byte)((x >> 32) & 0xff); + array[position+4] = (byte)((x >> 24) & 0xff); + array[position+5] = (byte)((x >> 16) & 0xff); + array[position+6] = (byte)((x >> 8) & 0xff); + array[position+7] = (byte)((x ) & 0xff); + position += 8; + + return this; + } + + @Override + public byte[] array() { + return array; + } + + @Override + public boolean hasArray() { + return true; + } + + public ByteBuffer compact() { + int pos = position(); + int lim = limit(); + int cap = capacity(); + int rem = lim - pos; + + byte[] newArray = new byte[cap]; + System.arraycopy(array, pos, newArray, 0, rem); + array = newArray; + + position(rem); + limit(cap); + return this; + } + + public static ByteBuffer wrap(byte[] outMess) { + ByteBuffer byteBuffer = new ByteBuffer(outMess.length); + byteBuffer.clear(); + System.arraycopy(outMess, 0 , byteBuffer.array, 0, outMess.length); + return byteBuffer; + } +}