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 HeapFloatBuffer. 31dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */ 32dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 33996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmeraclass HeapFloatBuffer extends FloatBuffer { 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 float[] hb; 40996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera protected final int offset; 41dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 42dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */ 43dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 44dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski HeapFloatBuffer(int cap, int lim) { // package-private 45996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this(cap, lim, false); 46996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 47dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 48996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera HeapFloatBuffer(int cap, int lim, boolean isReadOnly) { // package-private 49dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super(-1, 0, lim, cap, new float[cap], 0); 50996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.isReadOnly = isReadOnly; 51dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 52dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 53dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski HeapFloatBuffer(float[] buf, int off, int len) { // package-private 54996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this(buf, off, len, false); 55996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 56dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 57996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera HeapFloatBuffer(float[] 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 HeapFloatBuffer(float[] 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 HeapFloatBuffer(float[] 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 FloatBuffer slice() { 76dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return new HeapFloatBuffer(hb, 77190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera -1, 78190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera 0, 79190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.remaining(), 80190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.remaining(), 81190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.position() + offset, 82190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera isReadOnly); 83dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer duplicate() { 86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return new HeapFloatBuffer(hb, 87190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.markValue(), 88190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.position(), 89190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.limit(), 90190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.capacity(), 91190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, 92190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera isReadOnly); 93dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 94dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 95dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer asReadOnlyBuffer() { 96996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera return new HeapFloatBuffer(hb, 97190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.markValue(), 98190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.position(), 99190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.limit(), 100190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.capacity(), 101190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, true); 102dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 103dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 104dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected int ix(int i) { 105dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return i + offset; 106dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 107dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 108dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public float get() { 109dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return hb[ix(nextGetIndex())]; 110dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 111dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 112dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public float get(int i) { 113dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return hb[ix(checkIndex(i))]; 114dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 115dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 116dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer get(float[] dst, int offset, int length) { 117dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski checkBounds(offset, length, dst.length); 118dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (length > remaining()) 119dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new BufferUnderflowException(); 120dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski System.arraycopy(hb, ix(position()), dst, offset, length); 121dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(position() + length); 122dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 123dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 124dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 125dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public boolean isDirect() { 126dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return false; 127dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 128dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 129dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public boolean isReadOnly() { 130996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera return isReadOnly; 131dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 132dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 133dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer put(float x) { 134996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 135996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 136996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 137dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski hb[ix(nextPutIndex())] = x; 138dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 139dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 140dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 141dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer put(int i, float x) { 142996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 143996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 144996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 145dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski hb[ix(checkIndex(i))] = x; 146dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 147dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 148dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 149dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer put(float[] src, int offset, int length) { 150996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 151996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 152996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 153dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski checkBounds(offset, length, src.length); 154dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (length > remaining()) 155dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new BufferOverflowException(); 156dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski System.arraycopy(src, offset, hb, ix(position()), length); 157dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(position() + length); 158dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 159dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 160dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 161dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer put(FloatBuffer src) { 1623f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov if (src == this) { 1633f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov throw new IllegalArgumentException(); 1643f7495294d8b27c00ff647773fcac75afe10c629Serguei Katkov } 165996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 166996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 167996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 168dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (src instanceof HeapFloatBuffer) { 169190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera HeapFloatBuffer sb = (HeapFloatBuffer) src; 170dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int n = sb.remaining(); 171dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (n > remaining()) 172dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new BufferOverflowException(); 173dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski System.arraycopy(sb.hb, sb.ix(sb.position()), 174190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera hb, ix(position()), n); 175dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski sb.position(sb.position() + n); 176dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(position() + n); 177dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } else if (src.isDirect()) { 178dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int n = src.remaining(); 179dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (n > remaining()) 180dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new BufferOverflowException(); 181dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski src.get(hb, ix(position()), n); 182dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(position() + n); 183dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } else { 184dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super.put(src); 185dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 186dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 187dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 188dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 189dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer compact() { 190996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 191996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 192996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 193dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski System.arraycopy(hb, ix(position()), hb, ix(0), remaining()); 194dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(remaining()); 195dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski limit(capacity()); 196dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski discardMark(); 197dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 198dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 199dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 200dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteOrder order() { 201dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return ByteOrder.nativeOrder(); 202dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 203dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski} 204