/* * @(#)ByteBuffer.java 1.6 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.sun.corba.se.impl.ior ; public class ByteBuffer { /** * The array buffer into which the components of the ByteBuffer are * stored. The capacity of the ByteBuffer is the length of this array buffer, * and is at least large enough to contain all the ByteBuffer's elements.

* * Any array elements following the last element in the ByteBuffer are 0. */ protected byte elementData[]; /** * The number of valid components in this ByteBuffer object. * Components elementData[0] through * elementData[elementCount-1] are the actual items. * * @serial */ protected int elementCount; /** * The amount by which the capacity of the ByteBuffer is automatically * incremented when its size becomes greater than its capacity. If * the capacity increment is less than or equal to zero, the capacity * of the ByteBuffer is doubled each time it needs to grow. * * @serial */ protected int capacityIncrement; /** * Constructs an empty ByteBuffer with the specified initial capacity and * capacity increment. * * @param initialCapacity the initial capacity of the ByteBuffer. * @param capacityIncrement the amount by which the capacity is * increased when the ByteBuffer overflows. * @exception IllegalArgumentException if the specified initial capacity * is negative */ public ByteBuffer(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new byte[initialCapacity]; this.capacityIncrement = capacityIncrement; } /** * Constructs an empty ByteBuffer with the specified initial capacity and * with its capacity increment equal to zero. * * @param initialCapacity the initial capacity of the ByteBuffer. * @exception IllegalArgumentException if the specified initial capacity * is negative */ public ByteBuffer(int initialCapacity) { this(initialCapacity, 0); } /** * Constructs an empty ByteBuffer so that its internal data array * has size 10 and its standard capacity increment is * zero. */ public ByteBuffer() { this(200); } /** * Trims the capacity of this ByteBuffer to be the ByteBuffer's current * size. If the capacity of this cector is larger than its current * size, then the capacity is changed to equal the size by replacing * its internal data array, kept in the field elementData, * with a smaller one. An application can use this operation to * minimize the storage of a ByteBuffer. */ public void trimToSize() { int oldCapacity = elementData.length; if (elementCount < oldCapacity) { byte oldData[] = elementData; elementData = new byte[elementCount]; System.arraycopy(oldData, 0, elementData, 0, elementCount); } } /** * This implements the unsynchronized semantics of ensureCapacity. * Synchronized methods in this class can internally call this * method for ensuring capacity without incurring the cost of an * extra synchronization. * * @see java.util.ByteBuffer#ensureCapacity(int) */ private void ensureCapacityHelper(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { byte oldData[] = elementData; int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2); if (newCapacity < minCapacity) { newCapacity = minCapacity; } elementData = new byte[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, elementCount); } } /** * Returns the current capacity of this ByteBuffer. * * @return the current capacity (the length of its internal * data arary, kept in the field elementData * of this ByteBuffer. */ public int capacity() { return elementData.length; } /** * Returns the number of components in this ByteBuffer. * * @return the number of components in this ByteBuffer. */ public int size() { return elementCount; } /** * Tests if this ByteBuffer has no components. * * @return true if and only if this ByteBuffer has * no components, that is, its size is zero; * false otherwise. */ public boolean isEmpty() { return elementCount == 0; } public void append(byte value) { ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = value; } public void append( int value ) { ensureCapacityHelper(elementCount + 4); doAppend( value ) ; } private void doAppend( int value ) { int current = value ; for (int ctr=0; ctr<4; ctr++) { elementData[elementCount+ctr] = (byte)(current & 255) ; current = current >> 8 ; } elementCount += 4 ; } public void append( String value ) { byte[] data = value.getBytes() ; ensureCapacityHelper( elementCount + data.length + 4 ) ; doAppend( data.length ) ; System.arraycopy( data, 0, elementData, elementCount, data.length ) ; elementCount += data.length ; } /** * Returns an array containing all of the elements in this ByteBuffer * in the correct order. * * @since 1.2 */ public byte[] toArray() { return elementData ; } }