1dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski/* 2dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. 3dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 5dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 6dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 7dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 8dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 9dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 10dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 11dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 12dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 15dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * accompanied this code). 16dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 17dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 18dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 19dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 21dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 23dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * questions. 24dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */ 25dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 26dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskipackage java.nio; 27dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 2846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmeraimport libcore.io.Memory; 2946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 30490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmeraclass ByteBufferAsShortBuffer extends ShortBuffer { // package-private 31dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 32dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected final ByteBuffer bb; 33dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected final int offset; 34490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera private final ByteOrder order; 35dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 36490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera ByteBufferAsShortBuffer(ByteBuffer bb, 37490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera int mark, int pos, int lim, int cap, 38490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera int off, ByteOrder order) { 39dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super(mark, pos, lim, cap); 40c3005946d4806ca6a975fcfc63bdfd3e54b56b9aShubham Ajmera this.bb = bb.duplicate(); 41d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera this.isReadOnly = bb.isReadOnly; 42e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // There are only two possibilities for the type of ByteBuffer "bb", viz, DirectByteBuffer and 43e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // HeapByteBuffer. We only have to initialize the field when bb is an instance of 44e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // DirectByteBuffer. 45e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // The address field is use by NIOAccess#getBasePointer and GetDirectBufferAddress method 46e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // in art which return the address of the first usable byte of the underlying memory, i.e, 47e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // the position of parent buffer. Therefore, value of "off" will be equal to parent buffer's 48e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // position when the method is called from either HeapByteBuffer or DirectByteBuffer. 49e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera if (bb instanceof DirectByteBuffer) { 50e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera this.address = bb.address + off; 51e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera } 52cdf4dbb3c1ee370333fdfa628def46a4250c292dShubham Ajmera this.bb.order(order); 53490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera this.order = order; 54dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski offset = off; 55dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 56dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 57dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer slice() { 58dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int pos = this.position(); 59dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = this.limit(); 60dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (pos <= lim); 61dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (pos <= lim ? lim - pos : 0); 62dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int off = (pos << 1) + offset; 63dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (off >= 0); 6446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return new ByteBufferAsShortBuffer(bb, -1, 0, rem, rem, off, order); 65dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 66dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 67dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer duplicate() { 68490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera return new ByteBufferAsShortBuffer(bb, 69190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.markValue(), 70190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.position(), 71190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.limit(), 72190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.capacity(), 73190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, order); 74dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 75dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 76dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer asReadOnlyBuffer() { 7746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return new ByteBufferAsShortBuffer(bb.asReadOnlyBuffer(), 78190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.markValue(), 79190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.position(), 80190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.limit(), 81190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.capacity(), 82190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, order); 83dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected int ix(int i) { 86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return (i << 1) + offset; 87dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 88dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 89dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public short get() { 9046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return get(nextGetIndex()); 91dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 92dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 93dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public short get(int i) { 94e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera return bb.getShortUnchecked(ix(checkIndex(i))); 95e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera 96dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 97dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 98f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera public ShortBuffer get(short[] dst, int offset, int length) { 99f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera checkBounds(offset, length, dst.length); 100f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera if (length > remaining()) 101f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera throw new BufferUnderflowException(); 102f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera bb.getUnchecked(ix(position), dst, offset, length); 103f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera position += length; 104f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera return this; 105f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera } 106f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera 107dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer put(short x) { 10846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera put(nextPutIndex(), x); 109dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 110dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 111dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 112dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer put(int i, short x) { 113e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera if (isReadOnly) { 114e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera throw new ReadOnlyBufferException(); 115e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera } 116e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera bb.putShortUnchecked(ix(checkIndex(i)), x); 117dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 118dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 119dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 120f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera public ShortBuffer put(short[] src, int offset, int length) { 121f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera checkBounds(offset, length, src.length); 122f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera if (length > remaining()) 123f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera throw new BufferOverflowException(); 124f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera bb.putUnchecked(ix(position), src, offset, length); 125f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera position += length; 126f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera return this; 127f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera } 128f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera 129dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer compact() { 130490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera if (isReadOnly) { 131490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera throw new ReadOnlyBufferException(); 132490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera } 133dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int pos = position(); 134dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = limit(); 135dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (pos <= lim); 136dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (pos <= lim ? lim - pos : 0); 13746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera if (!(bb instanceof DirectByteBuffer)) { 13846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera System.arraycopy(bb.array(), ix(pos), bb.array(), ix(0), rem << 1); 13946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera } else { 14046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera Memory.memmove(this, ix(0), this, ix(pos), rem << 1); 14146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera } 142dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(rem); 143dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski limit(capacity()); 144dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski discardMark(); 145dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 146dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 147dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 148dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public boolean isDirect() { 149dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return bb.isDirect(); 150dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 151dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 152dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public boolean isReadOnly() { 153d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera return isReadOnly; 154dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 155dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 156dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteOrder order() { 157490d8356c6d541aa296c5bf19b872473cd78deb8Shubham Ajmera return order; 158dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 159dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski} 160