ByteBuffer.java revision 704:3ef63dbde965
1/*
2 * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.corba.se.impl.ior ;
27
28
29public class ByteBuffer {
30    /**
31     * The array buffer into which the components of the ByteBuffer are
32     * stored. The capacity of the ByteBuffer is the length of this array buffer,
33     * and is at least large enough to contain all the ByteBuffer's elements.<p>
34     *
35     * Any array elements following the last element in the ByteBuffer are 0.
36     */
37    protected byte elementData[];
38
39    /**
40     * The number of valid components in this {@code ByteBuffer} object.
41     * Components {@code elementData[0]} through
42     * {@code elementData[elementCount-1]} are the actual items.
43     *
44     * @serial
45     */
46    protected int elementCount;
47
48    /**
49     * The amount by which the capacity of the ByteBuffer is automatically
50     * incremented when its size becomes greater than its capacity.  If
51     * the capacity increment is less than or equal to zero, the capacity
52     * of the ByteBuffer is doubled each time it needs to grow.
53     *
54     * @serial
55     */
56    protected int capacityIncrement;
57
58    /**
59     * Constructs an empty ByteBuffer with the specified initial capacity and
60     * capacity increment.
61     *
62     * @param   initialCapacity     the initial capacity of the ByteBuffer.
63     * @param   capacityIncrement   the amount by which the capacity is
64     *                              increased when the ByteBuffer overflows.
65     * @exception IllegalArgumentException if the specified initial capacity
66     *               is negative
67     */
68    public ByteBuffer(int initialCapacity, int capacityIncrement) {
69        super();
70        if (initialCapacity < 0)
71            throw new IllegalArgumentException("Illegal Capacity: "+
72                                               initialCapacity);
73        this.elementData = new byte[initialCapacity];
74        this.capacityIncrement = capacityIncrement;
75    }
76
77    /**
78     * Constructs an empty ByteBuffer with the specified initial capacity and
79     * with its capacity increment equal to zero.
80     *
81     * @param   initialCapacity   the initial capacity of the ByteBuffer.
82     * @exception IllegalArgumentException if the specified initial capacity
83     *               is negative
84     */
85    public ByteBuffer(int initialCapacity) {
86        this(initialCapacity, 0);
87    }
88
89    /**
90     * Constructs an empty ByteBuffer so that its internal data array
91     * has size {@code 10} and its standard capacity increment is
92     * zero.
93     */
94    public ByteBuffer() {
95        this(200);
96    }
97
98    /**
99     * Trims the capacity of this ByteBuffer to be the ByteBuffer's current
100     * size. If the capacity of this cector is larger than its current
101     * size, then the capacity is changed to equal the size by replacing
102     * its internal data array, kept in the field {@code elementData},
103     * with a smaller one. An application can use this operation to
104     * minimize the storage of a ByteBuffer.
105     */
106    public void trimToSize() {
107        int oldCapacity = elementData.length;
108        if (elementCount < oldCapacity) {
109            byte oldData[] = elementData;
110            elementData = new byte[elementCount];
111            System.arraycopy(oldData, 0, elementData, 0, elementCount);
112        }
113    }
114
115    /**
116     * This implements the unsynchronized semantics of ensureCapacity.
117     * Synchronized methods in this class can internally call this
118     * method for ensuring capacity without incurring the cost of an
119     * extra synchronization.
120     *
121     * @see java.util.ByteBuffer#ensureCapacity(int)
122     */
123    private void ensureCapacityHelper(int minCapacity) {
124        int oldCapacity = elementData.length;
125        if (minCapacity > oldCapacity) {
126            byte oldData[] = elementData;
127            int newCapacity = (capacityIncrement > 0) ?
128                (oldCapacity + capacityIncrement) : (oldCapacity * 2);
129            if (newCapacity < minCapacity) {
130                newCapacity = minCapacity;
131            }
132            elementData = new byte[newCapacity];
133            System.arraycopy(oldData, 0, elementData, 0, elementCount);
134        }
135    }
136
137    /**
138     * Returns the current capacity of this ByteBuffer.
139     *
140     * @return  the current capacity (the length of its internal
141     *          data arary, kept in the field {@code elementData}
142     *          of this ByteBuffer.
143     */
144    public int capacity() {
145        return elementData.length;
146    }
147
148    /**
149     * Returns the number of components in this ByteBuffer.
150     *
151     * @return  the number of components in this ByteBuffer.
152     */
153    public int size() {
154        return elementCount;
155    }
156
157    /**
158     * Tests if this ByteBuffer has no components.
159     *
160     * @return  {@code true} if and only if this ByteBuffer has
161     *          no components, that is, its size is zero;
162     *          {@code false} otherwise.
163     */
164    public boolean isEmpty() {
165        return elementCount == 0;
166    }
167
168    public void append(byte value)
169    {
170        ensureCapacityHelper(elementCount + 1);
171        elementData[elementCount++] = value;
172    }
173
174    public void append( int value )
175    {
176        ensureCapacityHelper(elementCount + 4);
177        doAppend( value ) ;
178    }
179
180    private void doAppend( int value )
181    {
182        int current = value ;
183        for (int ctr=0; ctr<4; ctr++) {
184            elementData[elementCount+ctr] = (byte)(current & 255) ;
185            current = current >> 8 ;
186        }
187        elementCount += 4 ;
188    }
189
190    public void append( String value )
191    {
192        byte[] data = value.getBytes() ;
193        ensureCapacityHelper( elementCount + data.length + 4 ) ;
194        doAppend( data.length ) ;
195        System.arraycopy( data, 0, elementData, elementCount, data.length ) ;
196        elementCount += data.length ;
197    }
198
199    /**
200     * Returns an array containing all of the elements in this ByteBuffer
201     * in the correct order.
202     *
203     * @since 1.2
204     */
205    public byte[] toArray() {
206        return elementData ;
207    }
208}
209