1 /* 2 * Copyright (c) 2000, 2008, 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 26 #warn This file is preprocessed before being compiled 27 28 package java.nio; 29 30 31 /** 32 #if[rw] 33 * A read/write Heap$Type$Buffer. 34 #else[rw] 35 * A read-only Heap$Type$Buffer. This class extends the corresponding 36 * read/write class, overriding the mutation methods to throw a {@link 37 * ReadOnlyBufferException} and overriding the view-buffer methods to return an 38 * instance of this class rather than of the superclass. 39 #end[rw] 40 */ 41 42 class Heap$Type$Buffer$RW$ 43 extends {#if[ro]?Heap}$Type$Buffer 44 { 45 46 // For speed these fields are actually declared in X-Buffer; 47 // these declarations are here as documentation 48 /* 49 #if[rw] 50 protected final $type$[] hb; 51 protected final int offset; 52 #end[rw] 53 */ 54 55 Heap$Type$Buffer$RW$(int cap, int lim) { // package-private 56 #if[rw] 57 super(-1, 0, lim, cap, new $type$[cap], 0); 58 /* 59 hb = new $type$[cap]; 60 offset = 0; 61 */ 62 #else[rw] 63 super(cap, lim); 64 this.isReadOnly = true; 65 #end[rw] 66 } 67 68 Heap$Type$Buffer$RW$($type$[] buf, int off, int len) { // package-private 69 #if[rw] 70 super(-1, off, off + len, buf.length, buf, 0); 71 /* 72 hb = buf; 73 offset = 0; 74 */ 75 #else[rw] 76 super(buf, off, len); 77 this.isReadOnly = true; 78 #end[rw] 79 } 80 81 protected Heap$Type$Buffer$RW$($type$[] buf, 82 int mark, int pos, int lim, int cap, 83 int off) 84 { 85 #if[rw] 86 super(mark, pos, lim, cap, buf, off); 87 /* 88 hb = buf; 89 offset = off; 90 */ 91 #else[rw] 92 super(buf, mark, pos, lim, cap, off); 93 this.isReadOnly = true; 94 #end[rw] 95 } 96 97 public $Type$Buffer slice() { 98 return new Heap$Type$Buffer$RW$(hb, 99 -1, 100 0, 101 this.remaining(), 102 this.remaining(), 103 this.position() + offset); 104 } 105 106 public $Type$Buffer duplicate() { 107 return new Heap$Type$Buffer$RW$(hb, 108 this.markValue(), 109 this.position(), 110 this.limit(), 111 this.capacity(), 112 offset); 113 } 114 115 public $Type$Buffer asReadOnlyBuffer() { 116 #if[rw] 117 return new Heap$Type$BufferR(hb, 118 this.markValue(), 119 this.position(), 120 this.limit(), 121 this.capacity(), 122 offset); 123 #else[rw] 124 return duplicate(); 125 #end[rw] 126 } 127 128 #if[rw] 129 130 protected int ix(int i) { 131 return i + offset; 132 } 133 134 public $type$ get() { 135 return hb[ix(nextGetIndex())]; 136 } 137 138 public $type$ get(int i) { 139 return hb[ix(checkIndex(i))]; 140 } 141 142 public $Type$Buffer get($type$[] dst, int offset, int length) { 143 checkBounds(offset, length, dst.length); 144 if (length > remaining()) 145 throw new BufferUnderflowException(); 146 System.arraycopy(hb, ix(position()), dst, offset, length); 147 position(position() + length); 148 return this; 149 } 150 151 public boolean isDirect() { 152 return false; 153 } 154 155 #end[rw] 156 157 public boolean isReadOnly() { 158 return {#if[rw]?false:true}; 159 } 160 161 public $Type$Buffer put($type$ x) { 162 #if[rw] 163 hb[ix(nextPutIndex())] = x; 164 return this; 165 #else[rw] 166 throw new ReadOnlyBufferException(); 167 #end[rw] 168 } 169 170 public $Type$Buffer put(int i, $type$ x) { 171 #if[rw] 172 hb[ix(checkIndex(i))] = x; 173 return this; 174 #else[rw] 175 throw new ReadOnlyBufferException(); 176 #end[rw] 177 } 178 179 public $Type$Buffer put($type$[] src, int offset, int length) { 180 #if[rw] 181 checkBounds(offset, length, src.length); 182 if (length > remaining()) 183 throw new BufferOverflowException(); 184 System.arraycopy(src, offset, hb, ix(position()), length); 185 position(position() + length); 186 return this; 187 #else[rw] 188 throw new ReadOnlyBufferException(); 189 #end[rw] 190 } 191 192 public $Type$Buffer put($Type$Buffer src) { 193 #if[rw] 194 if (src instanceof Heap$Type$Buffer) { 195 if (src == this) 196 throw new IllegalArgumentException(); 197 Heap$Type$Buffer sb = (Heap$Type$Buffer)src; 198 int n = sb.remaining(); 199 if (n > remaining()) 200 throw new BufferOverflowException(); 201 System.arraycopy(sb.hb, sb.ix(sb.position()), 202 hb, ix(position()), n); 203 sb.position(sb.position() + n); 204 position(position() + n); 205 } else if (src.isDirect()) { 206 int n = src.remaining(); 207 if (n > remaining()) 208 throw new BufferOverflowException(); 209 src.get(hb, ix(position()), n); 210 position(position() + n); 211 } else { 212 super.put(src); 213 } 214 return this; 215 #else[rw] 216 throw new ReadOnlyBufferException(); 217 #end[rw] 218 } 219 220 public $Type$Buffer compact() { 221 #if[rw] 222 System.arraycopy(hb, ix(position()), hb, ix(0), remaining()); 223 position(remaining()); 224 limit(capacity()); 225 discardMark(); 226 return this; 227 #else[rw] 228 throw new ReadOnlyBufferException(); 229 #end[rw] 230 } 231 232 233 234 #if[byte] 235 236 byte _get(int i) { // package-private 237 return hb[i]; 238 } 239 240 void _put(int i, byte b) { // package-private 241 #if[rw] 242 hb[i] = b; 243 #else[rw] 244 throw new ReadOnlyBufferException(); 245 #end[rw] 246 } 247 248 // char 249 250 #if[rw] 251 252 public char getChar() { 253 return Bits.getChar(this, ix(nextGetIndex(2)), bigEndian); 254 } 255 256 public char getChar(int i) { 257 return Bits.getChar(this, ix(checkIndex(i, 2)), bigEndian); 258 } 259 260 #end[rw] 261 262 public $Type$Buffer putChar(char x) { 263 #if[rw] 264 Bits.putChar(this, ix(nextPutIndex(2)), x, bigEndian); 265 return this; 266 #else[rw] 267 throw new ReadOnlyBufferException(); 268 #end[rw] 269 } 270 271 public $Type$Buffer putChar(int i, char x) { 272 #if[rw] 273 Bits.putChar(this, ix(checkIndex(i, 2)), x, bigEndian); 274 return this; 275 #else[rw] 276 throw new ReadOnlyBufferException(); 277 #end[rw] 278 } 279 280 public CharBuffer asCharBuffer() { 281 int size = this.remaining() >> 1; 282 int off = offset + position(); 283 return (bigEndian 284 ? (CharBuffer)(new ByteBufferAsCharBuffer$RW$B(this, 285 -1, 286 0, 287 size, 288 size, 289 off)) 290 : (CharBuffer)(new ByteBufferAsCharBuffer$RW$L(this, 291 -1, 292 0, 293 size, 294 size, 295 off))); 296 } 297 298 299 // short 300 301 #if[rw] 302 303 public short getShort() { 304 return Bits.getShort(this, ix(nextGetIndex(2)), bigEndian); 305 } 306 307 public short getShort(int i) { 308 return Bits.getShort(this, ix(checkIndex(i, 2)), bigEndian); 309 } 310 311 #end[rw] 312 313 public $Type$Buffer putShort(short x) { 314 #if[rw] 315 Bits.putShort(this, ix(nextPutIndex(2)), x, bigEndian); 316 return this; 317 #else[rw] 318 throw new ReadOnlyBufferException(); 319 #end[rw] 320 } 321 322 public $Type$Buffer putShort(int i, short x) { 323 #if[rw] 324 Bits.putShort(this, ix(checkIndex(i, 2)), x, bigEndian); 325 return this; 326 #else[rw] 327 throw new ReadOnlyBufferException(); 328 #end[rw] 329 } 330 331 public ShortBuffer asShortBuffer() { 332 int size = this.remaining() >> 1; 333 int off = offset + position(); 334 return (bigEndian 335 ? (ShortBuffer)(new ByteBufferAsShortBuffer$RW$B(this, 336 -1, 337 0, 338 size, 339 size, 340 off)) 341 : (ShortBuffer)(new ByteBufferAsShortBuffer$RW$L(this, 342 -1, 343 0, 344 size, 345 size, 346 off))); 347 } 348 349 350 // int 351 352 #if[rw] 353 354 public int getInt() { 355 return Bits.getInt(this, ix(nextGetIndex(4)), bigEndian); 356 } 357 358 public int getInt(int i) { 359 return Bits.getInt(this, ix(checkIndex(i, 4)), bigEndian); 360 } 361 362 #end[rw] 363 364 public $Type$Buffer putInt(int x) { 365 #if[rw] 366 Bits.putInt(this, ix(nextPutIndex(4)), x, bigEndian); 367 return this; 368 #else[rw] 369 throw new ReadOnlyBufferException(); 370 #end[rw] 371 } 372 373 public $Type$Buffer putInt(int i, int x) { 374 #if[rw] 375 Bits.putInt(this, ix(checkIndex(i, 4)), x, bigEndian); 376 return this; 377 #else[rw] 378 throw new ReadOnlyBufferException(); 379 #end[rw] 380 } 381 382 public IntBuffer asIntBuffer() { 383 int size = this.remaining() >> 2; 384 int off = offset + position(); 385 return (bigEndian 386 ? (IntBuffer)(new ByteBufferAsIntBuffer$RW$B(this, 387 -1, 388 0, 389 size, 390 size, 391 off)) 392 : (IntBuffer)(new ByteBufferAsIntBuffer$RW$L(this, 393 -1, 394 0, 395 size, 396 size, 397 off))); 398 } 399 400 401 // long 402 403 #if[rw] 404 405 public long getLong() { 406 return Bits.getLong(this, ix(nextGetIndex(8)), bigEndian); 407 } 408 409 public long getLong(int i) { 410 return Bits.getLong(this, ix(checkIndex(i, 8)), bigEndian); 411 } 412 413 #end[rw] 414 415 public $Type$Buffer putLong(long x) { 416 #if[rw] 417 Bits.putLong(this, ix(nextPutIndex(8)), x, bigEndian); 418 return this; 419 #else[rw] 420 throw new ReadOnlyBufferException(); 421 #end[rw] 422 } 423 424 public $Type$Buffer putLong(int i, long x) { 425 #if[rw] 426 Bits.putLong(this, ix(checkIndex(i, 8)), x, bigEndian); 427 return this; 428 #else[rw] 429 throw new ReadOnlyBufferException(); 430 #end[rw] 431 } 432 433 public LongBuffer asLongBuffer() { 434 int size = this.remaining() >> 3; 435 int off = offset + position(); 436 return (bigEndian 437 ? (LongBuffer)(new ByteBufferAsLongBuffer$RW$B(this, 438 -1, 439 0, 440 size, 441 size, 442 off)) 443 : (LongBuffer)(new ByteBufferAsLongBuffer$RW$L(this, 444 -1, 445 0, 446 size, 447 size, 448 off))); 449 } 450 451 452 // float 453 454 #if[rw] 455 456 public float getFloat() { 457 return Bits.getFloat(this, ix(nextGetIndex(4)), bigEndian); 458 } 459 460 public float getFloat(int i) { 461 return Bits.getFloat(this, ix(checkIndex(i, 4)), bigEndian); 462 } 463 464 #end[rw] 465 466 public $Type$Buffer putFloat(float x) { 467 #if[rw] 468 Bits.putFloat(this, ix(nextPutIndex(4)), x, bigEndian); 469 return this; 470 #else[rw] 471 throw new ReadOnlyBufferException(); 472 #end[rw] 473 } 474 475 public $Type$Buffer putFloat(int i, float x) { 476 #if[rw] 477 Bits.putFloat(this, ix(checkIndex(i, 4)), x, bigEndian); 478 return this; 479 #else[rw] 480 throw new ReadOnlyBufferException(); 481 #end[rw] 482 } 483 484 public FloatBuffer asFloatBuffer() { 485 int size = this.remaining() >> 2; 486 int off = offset + position(); 487 return (bigEndian 488 ? (FloatBuffer)(new ByteBufferAsFloatBuffer$RW$B(this, 489 -1, 490 0, 491 size, 492 size, 493 off)) 494 : (FloatBuffer)(new ByteBufferAsFloatBuffer$RW$L(this, 495 -1, 496 0, 497 size, 498 size, 499 off))); 500 } 501 502 503 // double 504 505 #if[rw] 506 507 public double getDouble() { 508 return Bits.getDouble(this, ix(nextGetIndex(8)), bigEndian); 509 } 510 511 public double getDouble(int i) { 512 return Bits.getDouble(this, ix(checkIndex(i, 8)), bigEndian); 513 } 514 515 #end[rw] 516 517 public $Type$Buffer putDouble(double x) { 518 #if[rw] 519 Bits.putDouble(this, ix(nextPutIndex(8)), x, bigEndian); 520 return this; 521 #else[rw] 522 throw new ReadOnlyBufferException(); 523 #end[rw] 524 } 525 526 public $Type$Buffer putDouble(int i, double x) { 527 #if[rw] 528 Bits.putDouble(this, ix(checkIndex(i, 8)), x, bigEndian); 529 return this; 530 #else[rw] 531 throw new ReadOnlyBufferException(); 532 #end[rw] 533 } 534 535 public DoubleBuffer asDoubleBuffer() { 536 int size = this.remaining() >> 3; 537 int off = offset + position(); 538 return (bigEndian 539 ? (DoubleBuffer)(new ByteBufferAsDoubleBuffer$RW$B(this, 540 -1, 541 0, 542 size, 543 size, 544 off)) 545 : (DoubleBuffer)(new ByteBufferAsDoubleBuffer$RW$L(this, 546 -1, 547 0, 548 size, 549 size, 550 off))); 551 } 552 553 554 #end[byte] 555 556 557 #if[char] 558 559 String toString(int start, int end) { // package-private 560 try { 561 return new String(hb, start + offset, end - start); 562 } catch (StringIndexOutOfBoundsException x) { 563 throw new IndexOutOfBoundsException(); 564 } 565 } 566 567 568 // --- Methods to support CharSequence --- 569 570 public CharBuffer subSequence(int start, int end) { 571 if ((start < 0) 572 || (end > length()) 573 || (start > end)) 574 throw new IndexOutOfBoundsException(); 575 int pos = position(); 576 return new HeapCharBuffer$RW$(hb, 577 -1, 578 pos + start, 579 pos + end, 580 capacity(), 581 offset); 582 } 583 584 #end[char] 585 586 587 #if[!byte] 588 589 public ByteOrder order() { 590 return ByteOrder.nativeOrder(); 591 } 592 593 #end[!byte] 594 595 }