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 HeapDoubleBuffer. 31dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */ 32dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 33996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmeraclass HeapDoubleBuffer extends DoubleBuffer { 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 double[] hb; 40996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera protected final int offset; 41dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 42dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */ 43dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 44996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera HeapDoubleBuffer(int cap, int lim) { // package-private 45996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this(cap, lim, false); 46dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 47dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 48dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski HeapDoubleBuffer(double[] buf, int off, int len) { // package-private 49996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this(buf, off, len, false); 50996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 51dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 52996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera protected HeapDoubleBuffer(double[] buf, 53996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera int mark, int pos, int lim, int cap, 54996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera int off) { 55996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this(buf, mark, pos, lim, cap, off, false); 56996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 57dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 58996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera HeapDoubleBuffer(int cap, int lim, boolean isReadOnly) { // package-private 59996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera super(-1, 0, lim, cap, new double[cap], 0); 60996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.isReadOnly = isReadOnly; 61996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 62dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 63996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera HeapDoubleBuffer(double[] buf, int off, int len, boolean isReadOnly) { // package-private 64996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera super(-1, off, off + len, buf.length, buf, 0); 65996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.isReadOnly = isReadOnly; 66dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 67dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 68dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected HeapDoubleBuffer(double[] 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 75996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera 76dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public DoubleBuffer slice() { 77dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return new HeapDoubleBuffer(hb, 78996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera -1, 79996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera 0, 80996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.remaining(), 81996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.remaining(), 82996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.position() + offset, 83996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera isReadOnly); 84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public DoubleBuffer duplicate() { 87dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return new HeapDoubleBuffer(hb, 88996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.markValue(), 89996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.position(), 90996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.limit(), 91996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera this.capacity(), 92996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera offset, 93996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera isReadOnly); 94dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 95dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 96dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public DoubleBuffer asReadOnlyBuffer() { 97996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera return new HeapDoubleBuffer(hb, 98dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski this.markValue(), 99dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski this.position(), 100dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski this.limit(), 101dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 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 double get() { 110dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return hb[ix(nextGetIndex())]; 111dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 112dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 113dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public double get(int i) { 114dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return hb[ix(checkIndex(i))]; 115dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 116dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 117dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public DoubleBuffer get(double[] 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 DoubleBuffer put(double 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 DoubleBuffer put(int i, double 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 DoubleBuffer put(double[] 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 DoubleBuffer put(DoubleBuffer src) { 163996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera if (isReadOnly) { 164996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera throw new ReadOnlyBufferException(); 165996ddbb7d5f12d04732d9b484f9077e4d7ef4aaeShubham Ajmera } 166dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (src instanceof HeapDoubleBuffer) { 167dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (src == this) 168dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new IllegalArgumentException(); 169dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski HeapDoubleBuffer sb = (HeapDoubleBuffer)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()), 174dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 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 DoubleBuffer 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