ShortBuffer.java 11.1 KB
Newer Older
1
/* ShortBuffer.java -- 
2
   Copyright (C) 2002, 2003, 2004  Free Software Foundation, Inc.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


39
package java.nio;
40

41 42 43 44 45
/**
 * @since 1.4
 */
public abstract class ShortBuffer extends Buffer
  implements Comparable
46
{
47 48
  int array_offset;
  short[] backing_buffer;
49

50
  ShortBuffer (int capacity, int limit, int position, int mark)
51
  {
52 53
    super (capacity, limit, position, mark);
    array_offset = 0;
54 55
  }

56 57 58 59
  /**
   * Allocates a new <code>ShortBuffer</code> object with a given capacity.
   */
  public static ShortBuffer allocate (int capacity)
60
  {
61
    return new ShortBufferImpl (capacity);
62 63
  }

64 65 66 67 68 69 70
  /**
   * Wraps a <code>short</code> array into a <code>ShortBuffer</code>
   * object.
   *
   * @exception IndexOutOfBoundsException If the preconditions on the offset
   * and length parameters do not hold
   */
71
  public static final ShortBuffer wrap (short[] array, int offset, int length)
72
  {
73
    return new ShortBufferImpl (array, 0, array.length, offset + length, offset, -1, false);
74 75
  }

76 77 78 79
  /**
   * Wraps a <code>short</code> array into a <code>ShortBuffer</code>
   * object.
   */
80
  public static final ShortBuffer wrap (short[] array)
81
  {
82
    return wrap (array, 0, array.length);
83 84
  }
  
85
  /**
86 87 88
   * This method transfers <code>short</code>s from this buffer into the given
   * destination array. Before the transfer, it checks if there are fewer than
   * length <code>short</code>s remaining in this buffer. 
89 90 91 92 93 94 95 96
   *
   * @param dst The destination array
   * @param offset The offset within the array of the first <code>short</code>
   * to be written; must be non-negative and no larger than dst.length.
   * @param length The maximum number of bytes to be written to the given array;
   * must be non-negative and no larger than dst.length - offset.
   *
   * @exception BufferUnderflowException If there are fewer than length
97
   * <code>short</code>s remaining in this buffer.
98 99 100
   * @exception IndexOutOfBoundsException If the preconditions on the offset
   * and length parameters do not hold.
   */
101
  public ShortBuffer get (short[] dst, int offset, int length)
102
  {
103 104 105
    checkArraySize(dst.length, offset, length);
    checkForUnderflow(length);

106 107
    for (int i = offset; i < offset + length; i++)
      {
108
        dst [i] = get ();
109 110 111 112 113
      }

    return this;
  }

114
  /**
115
   * This method transfers <code>short</code>s from this buffer into the given
116 117 118 119 120
   * destination array.
   *
   * @param dst The byte array to write into.
   *
   * @exception BufferUnderflowException If there are fewer than dst.length
121
   * <code>short</code>s remaining in this buffer.
122
   */
123
  public ShortBuffer get (short[] dst)
124
  {
125
    return get (dst, 0, dst.length);
126 127
  }

128 129
  /**
   * Writes the content of the the <code>ShortBUFFER</code> src
130 131
   * into the buffer. Before the transfer, it checks if there is fewer than
   * <code>src.remaining()</code> space remaining in this buffer.
132 133 134 135
   *
   * @param src The source data.
   *
   * @exception BufferOverflowException If there is insufficient space in this
136
   * buffer for the remaining <code>short</code>s in the source buffer.
137 138 139
   * @exception IllegalArgumentException If the source buffer is this buffer.
   * @exception ReadOnlyBufferException If this buffer is read-only.
   */
140
  public ShortBuffer put (ShortBuffer src)
141
  {
142 143 144
    if (src == this)
      throw new IllegalArgumentException ();

145
    checkForOverflow(src.remaining ());
146 147 148 149 150

    if (src.remaining () > 0)
      {
        short[] toPut = new short [src.remaining ()];
        src.get (toPut);
Andreas Tobler committed
151
        put (toPut);
152
      }
153 154 155 156

    return this;
  }

157 158
  /**
   * Writes the content of the the <code>short array</code> src
159 160
   * into the buffer. Before the transfer, it checks if there is fewer than
   * length space remaining in this buffer.
161 162 163 164 165 166 167 168
   *
   * @param src The array to copy into the buffer.
   * @param offset The offset within the array of the first byte to be read;
   * must be non-negative and no larger than src.length.
   * @param length The number of bytes to be read from the given array;
   * must be non-negative and no larger than src.length - offset.
   * 
   * @exception BufferOverflowException If there is insufficient space in this
169
   * buffer for the remaining <code>short</code>s in the source array.
170 171 172 173
   * @exception IndexOutOfBoundsException If the preconditions on the offset
   * and length parameters do not hold
   * @exception ReadOnlyBufferException If this buffer is read-only.
   */
174
  public ShortBuffer put (short[] src, int offset, int length)
175
  {
176 177 178
    checkArraySize(src.length, offset, length);
    checkForOverflow(length);

179
    for (int i = offset; i < offset + length; i++)
180
      put (src [i]);
181 182 183 184

    return this;
  }

185 186 187 188 189 190 191
  /**
   * Writes the content of the the <code>short array</code> src
   * into the buffer.
   *
   * @param src The array to copy into the buffer.
   * 
   * @exception BufferOverflowException If there is insufficient space in this
192
   * buffer for the remaining <code>short</code>s in the source array.
193 194 195
   * @exception ReadOnlyBufferException If this buffer is read-only.
   */
  public final ShortBuffer put (short[] src)
196
  {
197
    return put (src, 0, src.length);
198 199
  }

200 201 202 203 204
  /**
   * Tells whether ot not this buffer is backed by an accessible
   * <code>short</code> array.
   */
  public final boolean hasArray ()
205
  {
206 207
    return (backing_buffer != null
            && !isReadOnly ());
208 209
  }

210 211 212 213 214 215 216 217
  /**
   * Returns the <code>short</code> array that backs this buffer.
   *
   * @exception ReadOnlyBufferException If this buffer is read-only.
   * @exception UnsupportedOperationException If this buffer is not backed
   * by an accessible array.
   */
  public final short[] array ()
218
  {
219 220 221
    if (backing_buffer == null)
      throw new UnsupportedOperationException ();

222
    checkIfReadOnly();
223
    
224 225 226
    return backing_buffer;
  }

227 228 229 230 231 232 233 234
  /**
   * Returns the offset within this buffer's backing array of the first element.
   *
   * @exception ReadOnlyBufferException If this buffer is read-only.
   * @exception UnsupportedOperationException If this buffer is not backed
   * by an accessible array.
   */
  public final int arrayOffset ()
235
  {
236 237 238
    if (backing_buffer == null)
      throw new UnsupportedOperationException ();

239
    checkIfReadOnly();
240
    
241
    return array_offset;
242 243
  }

244 245
  /**
   * Calculates a hash code for this buffer.
246 247 248 249 250 251 252 253 254 255
   *
   * This is done with <code>int</code> arithmetic,
   * where ** represents exponentiation, by this formula:<br>
   * <code>s[position()] + 31 + (s[position()+1] + 30)*31**1 + ... +
   * (s[limit()-1]+30)*31**(limit()-1)</code>.
   * Where s is the buffer data. Note that the hashcode is dependent
   * on buffer content, and therefore is not useful if the buffer
   * content may change.
   *
   * @return the hash code
256 257
   */
  public int hashCode ()
258
  {
259 260 261 262 263 264 265 266
    int hashCode = get(position()) + 31;
    int multiplier = 1;
    for (int i = position() + 1; i < limit(); ++i)
      {
	  multiplier *= 31;
	  hashCode += (get(i) + 30)*multiplier;
      }
    return hashCode;
267 268
  }

269 270 271 272
  /**
   * Checks if this buffer is equal to obj.
   */
  public boolean equals (Object obj)
273 274 275
  {
    if (obj instanceof ShortBuffer)
      {
276
        return compareTo (obj) == 0;
277 278 279 280 281
      }

    return false;
  }

282 283 284 285 286 287 288
  /**
   * Compares two <code>ShortBuffer</code> objects.
   *
   * @exception ClassCastException If obj is not an object derived from
   * <code>ShortBuffer</code>.
   */
  public int compareTo (Object obj)
289
  {
290
    ShortBuffer other = (ShortBuffer) obj;
291

292 293 294 295 296
    int num = Math.min(remaining(), other.remaining());
    int pos_this = position();
    int pos_other = other.position();
    
    for (int count = 0; count < num; count++)
297
      {
298 299 300 301 302 303 304 305 306 307
	 short a = get(pos_this++);
	 short b = other.get(pos_other++);
      	 
	 if (a == b)
	   continue;
      	   
	 if (a < b)
	   return -1;
      	   
	 return 1;
308
      }
309 310
      
     return remaining() - other.remaining();
311 312
  }

313 314 315
  /**
   * Returns the byte order of this buffer.
   */
316
  public abstract ByteOrder order ();
317 318 319 320 321 322

  /**
   * Reads the <code>short</code> at this buffer's current position,
   * and then increments the position.
   *
   * @exception BufferUnderflowException If there are no remaining
323
   * <code>short</code>s in this buffer.
324 325 326 327 328 329 330 331
   */
  public abstract short get ();

  /**
   * Writes the <code>short</code> at this buffer's current position,
   * and then increments the position.
   *
   * @exception BufferOverflowException If there no remaining 
332
   * <code>short</code>s in this buffer.
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
   * @exception ReadOnlyBufferException If this buffer is read-only.
   */
  public abstract ShortBuffer put (short b);

  /**
   * Absolute get method.
   *
   * @exception IndexOutOfBoundsException If index is negative or not smaller
   * than the buffer's limit.
   */
  public abstract short get (int index);
  
  /**
   * Absolute put method.
   *
   * @exception IndexOutOfBoundsException If index is negative or not smaller
   * than the buffer's limit.
   * @exception ReadOnlyBufferException If this buffer is read-only.
   */
  public abstract ShortBuffer put (int index, short b);

  /**
   * Compacts this buffer.
   * 
   * @exception ReadOnlyBufferException If this buffer is read-only.
   */
  public abstract ShortBuffer compact ();

  /**
   * Tells wether or not this buffer is direct.
   */
  public abstract boolean isDirect ();

  /**
   * Creates a new <code>ShortBuffer</code> whose content is a shared
   * subsequence of this buffer's content.
   */
  public abstract ShortBuffer slice ();

  /**
   * Creates a new <code>ShortBuffer</code> that shares this buffer's
   * content.
   */
  public abstract ShortBuffer duplicate ();

  /**
   * Creates a new read-only <code>ShortBuffer</code> that shares this
   * buffer's content.
   */
  public abstract ShortBuffer asReadOnlyBuffer ();
383
}