1dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski/* 22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project 3dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. 4dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 6dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 7dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 8dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 9dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 10dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 11dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 12dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 13dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 16dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * accompanied this code). 17dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 18dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 19dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 20dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 21dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 22dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 23dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 24dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * questions. 25dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */ 26dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 27dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskipackage java.nio; 28dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 29dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski/** 30dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * A read/write HeapShortBuffer. 31dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */ 32dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 33996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmeraclass HeapShortBuffer extends ShortBuffer { 34dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 35dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // For speed these fields are actually declared in X-Buffer; 36dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // these declarations are here as documentation 37dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski /* 38dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 39996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera protected final short[] hb; 40996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera protected final int offset; 41dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 42dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */ 43dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 44dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski HeapShortBuffer(int cap, int lim) { // package-private 45996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this(cap, lim, false); 46996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 47dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 48996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera HeapShortBuffer(int cap, int lim, boolean isReadOnly) { // package-private 49dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super(-1, 0, lim, cap, new short[cap], 0); 50996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.isReadOnly = isReadOnly; 51dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 52dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 53dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski HeapShortBuffer(short[] buf, int off, int len) { // package-private 54996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this(buf, off, len, false); 55996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 56dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 57996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera HeapShortBuffer(short[] buf, int off, int len, boolean isReadOnly) { // package-private 58dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super(-1, off, off + len, buf.length, buf, 0); 59996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.isReadOnly = isReadOnly; 60dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 61dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 62dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected HeapShortBuffer(short[] buf, 63996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera int mark, int pos, int lim, int cap, 64996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera int off) { 65996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this(buf, mark, pos, lim, cap, off, false); 66996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 67dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 68996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera protected HeapShortBuffer(short[] buf, 69996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera int mark, int pos, int lim, int cap, 70996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera int off, boolean isReadOnly) { 71dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super(mark, pos, lim, cap, buf, off); 72996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.isReadOnly = isReadOnly; 73dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 74dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 75dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer slice() { 76dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return new HeapShortBuffer(hb, 77996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera -1, 78996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera 0, 79996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.remaining(), 80996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.remaining(), 81996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.position() + offset, 82996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera isReadOnly); 83dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer duplicate() { 86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return new HeapShortBuffer(hb, 87996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.markValue(), 88996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.position(), 89996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.limit(), 90996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.capacity(), 91996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera offset, 92996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera isReadOnly); 93dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 94dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 95dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer asReadOnlyBuffer() { 96dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 97996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera return new HeapShortBuffer(hb, 98996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.markValue(), 99996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.position(), 100996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.limit(), 101996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.capacity(), 102996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera offset, true); 103dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 104dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 105dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected int ix(int i) { 106dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return i + offset; 107dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 108dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 109dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public short get() { 110dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return hb[ix(nextGetIndex())]; 111dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 112dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 113dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public short get(int i) { 114dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return hb[ix(checkIndex(i))]; 115dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 116dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 117dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer get(short[] dst, int offset, int length) { 118dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski checkBounds(offset, length, dst.length); 119dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (length > remaining()) 120dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new BufferUnderflowException(); 121dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski System.arraycopy(hb, ix(position()), dst, offset, length); 122dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(position() + length); 123dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 124dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 125dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 126dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public boolean isDirect() { 127dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return false; 128dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 129dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 130dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public boolean isReadOnly() { 131996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera return isReadOnly; 132dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 133dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 134dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer put(short x) { 135996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 136996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 137996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 138dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski hb[ix(nextPutIndex())] = x; 139dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 140dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 141dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 142dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer put(int i, short x) { 143996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 144996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 145996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 146dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski hb[ix(checkIndex(i))] = x; 147dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 148dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 149dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 150dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer put(short[] src, int offset, int length) { 151996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 152996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 153996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 154dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski checkBounds(offset, length, src.length); 155dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (length > remaining()) 156dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new BufferOverflowException(); 157dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski System.arraycopy(src, offset, hb, ix(position()), length); 158dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(position() + length); 159dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 160dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 161dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 162dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer put(ShortBuffer src) { 1633f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov if (src == this) { 1643f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov throw new IllegalArgumentException(); 1653f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov } 166996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 167996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 168996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 169dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (src instanceof HeapShortBuffer) { 170dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski HeapShortBuffer sb = (HeapShortBuffer)src; 171dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int n = sb.remaining(); 172dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (n > remaining()) 173dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new BufferOverflowException(); 174dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski System.arraycopy(sb.hb, sb.ix(sb.position()), 175dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski hb, ix(position()), n); 176dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski sb.position(sb.position() + n); 177dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(position() + n); 178dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } else if (src.isDirect()) { 179dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int n = src.remaining(); 180dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (n > remaining()) 181dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new BufferOverflowException(); 182dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski src.get(hb, ix(position()), n); 183dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(position() + n); 184dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } else { 185dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super.put(src); 186dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 187dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 188dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 189dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 190dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer compact() { 191996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 192996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 193996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 194dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski System.arraycopy(hb, ix(position()), hb, ix(0), remaining()); 195dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(remaining()); 196dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski limit(capacity()); 197dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski discardMark(); 198dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 199dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 200dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 201dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteOrder order() { 202dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return ByteOrder.nativeOrder(); 203dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 204dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski} 205