DirectByteBuffer.java revision f4145724170d5e3e52b3bf683d527fa5698cb12d
1dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski/* 2dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Copyright (c) 2000, 2011, 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 28dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskiimport java.io.FileDescriptor; 29dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskiimport sun.misc.Cleaner; 30dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskiimport sun.misc.VM; 31dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskiimport sun.nio.ch.DirectBuffer; 32fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmeraimport libcore.io.SizeOf; 33fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmeraimport libcore.io.Memory; 34fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmeraimport dalvik.system.VMRuntime; 35dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 36fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmeraclass DirectByteBuffer extends MappedByteBuffer 37fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera implements DirectBuffer { 38dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 39dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // Cached unaligned-access capability 40dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private static Boolean unalignedCache; 41dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected static boolean unaligned() { 42dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (unalignedCache == null) { 43dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski unalignedCache = Bits.unaligned(); 44dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 45dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return unalignedCache; 46dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 47dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 48f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera private boolean isAccessible = true; 49d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera 50dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // Base address, used in all indexing calculations 51dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // NOTE: moved up to Buffer.java for speed in JNI GetDirectBufferAddress 52dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // protected long address; 53dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 54dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // An object attached to this buffer. If this buffer is a view of another 55dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // buffer then we use this field to keep a reference to that buffer to 56dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // ensure that its memory isn't freed before we are done with it. 57dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private final Object att; 58dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 59fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera private boolean freed = false; 60fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera 61dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public Object attachment() { 62dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return att; 63dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 64dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 65fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera private class Deallocator implements Runnable { 66dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 67dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public void run() { 68fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera free(); 69dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 70dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 71dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 72fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera private Cleaner cleaner; 73dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 74dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public Cleaner cleaner() { return cleaner; } 75dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 76fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera DirectByteBuffer(int capacity) { 77fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera super(-1, 0, capacity, capacity, (byte[]) VMRuntime.getRuntime() 78fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera .newNonMovableArray(byte.class, capacity), 0); 79fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera VMRuntime runtime = VMRuntime.getRuntime(); 80fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera address = runtime.addressOf(hb); 81fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera cleaner = Cleaner.create(this, new Deallocator()); 829b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this.isReadOnly = false; 83dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski att = null; 84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski DirectByteBuffer(long addr, int cap, Object ob) { 87dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super(-1, 0, cap, cap); 88dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski address = addr; 89dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski cleaner = null; 90dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski att = ob; 91dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 92dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 93dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // Invoked only by JNI: NewDirectByteBuffer(void*, long) 94dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // 95dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private DirectByteBuffer(long addr, int cap) { 96dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super(-1, 0, cap, cap); 97dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski address = addr; 98dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski cleaner = null; 99dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski att = null; 100dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 101dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 102dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // For memory-mapped buffers -- invoked by FileChannelImpl via reflection 103dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // 104dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski protected DirectByteBuffer(int cap, long addr, 105c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera FileDescriptor fd, 106fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Runnable unmapper) { 1079b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this(cap, addr, fd, unmapper, false); 1089b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 1099b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera 1109b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera protected DirectByteBuffer(int cap, long addr, 1119b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera FileDescriptor fd, 1129b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera Runnable unmapper, 1139b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera boolean isReadOnly) { 114dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super(-1, 0, cap, cap, fd); 1159b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this.isReadOnly = isReadOnly; 116dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski address = addr; 117dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski cleaner = Cleaner.create(this, unmapper); 118dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski att = null; 119dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 120dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 121dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // For duplicates and slices 122dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski // 123d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera DirectByteBuffer(DirectByteBuffer db, // package-private 124c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera int mark, int pos, int lim, int cap, 125fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int off) { 1269b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this(db, mark, pos, lim, cap, off, false); 1279b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 1289b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera 129d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera DirectByteBuffer(DirectByteBuffer db, // package-private 1309b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera int mark, int pos, int lim, int cap, 1319b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera int off, boolean isReadOnly) { 132d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera super(mark, pos, lim, cap, db.hb, off); 1339b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this.isReadOnly = isReadOnly; 134dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski address = db.address() + off; 135dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski cleaner = null; 136dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski att = db; 137dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 138dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 139dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer slice() { 140f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 141f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 142f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 143dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int pos = this.position(); 144dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = this.limit(); 145dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (pos <= lim); 146dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (pos <= lim ? lim - pos : 0); 147dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int off = (pos << 0); 148dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (off >= 0); 1499b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera return new DirectByteBuffer(this, -1, 0, rem, rem, off, isReadOnly); 150dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 151dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 152dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer duplicate() { 153f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 154f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 155f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 156dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return new DirectByteBuffer(this, 157c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera this.markValue(), 158c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera this.position(), 159c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera this.limit(), 160c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera this.capacity(), 1619b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera 0, 1629b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera isReadOnly); 163dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 164dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 165dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer asReadOnlyBuffer() { 166f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 167f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 168f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 1699b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera return new DirectByteBuffer(this, 1709b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this.markValue(), 1719b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this.position(), 1729b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this.limit(), 1739b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera this.capacity(), 1749b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera 0, 1759b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera true); 176dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 177dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 178dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public long address() { 179dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return address; 180dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 181dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 182dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private long ix(int i) { 183dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return address + (i << 0); 184dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 185dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 186fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera public byte get(long a) { 187fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return Memory.peekByte(a); 188fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera } 189fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera 190dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public byte get() { 191f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 192d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 1939b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 194fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return get(address + nextGetIndex()); 195dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 196dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 197dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public byte get(int i) { 198f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 199d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 2009b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 201fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return get(address + checkIndex(i)); 202dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 203dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 204fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera public ByteBuffer get(byte[] dst, int dstOffset, int length) { 205f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 206d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 2079b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 208fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera checkBounds(dstOffset, length, dst.length); 209fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int pos = position(); 210fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int lim = limit(); 211fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera assert (pos <= lim); 212fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int rem = (pos <= lim ? lim - pos : 0); 213fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera if (length > rem) 214fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera throw new BufferUnderflowException(); 215d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera Memory.peekByteArray(address + pos, 216fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera dst, dstOffset, length); 217fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera position = pos + length; 218eb638671b477b765d763ed737d5dcbe6e5e3102eShubham Ajmera return this; 219eb638671b477b765d763ed737d5dcbe6e5e3102eShubham Ajmera } 220dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 221fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera public ByteBuffer put(long a, byte x) { 222fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.pokeByte(a, x); 223fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return this; 224fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera } 22566102fec246eb9e68e4e2d5c009f69902259823bNarayan Kamath 226dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer put(byte x) { 2279b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 2289b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 2299b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 230f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 231d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 2329b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 233fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera put(ix(nextPutIndex()), x); 234dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 235dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 236dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 237dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer put(int i, byte x) { 2389b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 2399b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 2409b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 241f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 242d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 2439b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 244fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera put(ix(checkIndex(i)), x); 245dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 246dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 247dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 248dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer put(ByteBuffer src) { 2499b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 2509b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 2519b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 252f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 253d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 2549b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 255dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (src instanceof DirectByteBuffer) { 256dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski if (src == this) 257dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski throw new IllegalArgumentException(); 258dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski DirectByteBuffer sb = (DirectByteBuffer)src; 259fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera byte[] arr = sb.array(); 260fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera put(arr, src.offset, arr.length); 261dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } else if (src.hb != null) { 262dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int spos = src.position(); 263dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int slim = src.limit(); 264dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (spos <= slim); 265dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int srem = (spos <= slim ? slim - spos : 0); 266dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski put(src.hb, src.offset + spos, srem); 267dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski src.position(spos + srem); 268dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } else { 269dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski super.put(src); 270dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 271dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 272dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 273dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 274fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera public ByteBuffer put(byte[] src, int srcOffset, int length) { 2759b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 2769b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 2779b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 278f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 279d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 2809b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 281fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera checkBounds(srcOffset, length, src.length); 282fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int pos = position(); 283fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int lim = limit(); 284fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera assert (pos <= lim); 285fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int rem = (pos <= lim ? lim - pos : 0); 286fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera if (length > rem) 287fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera throw new BufferOverflowException(); 288fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.pokeByteArray((int) address + pos, 289fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera src, srcOffset, length); 290fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera position = pos + length; 291dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 292dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 293dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 294dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer compact() { 2959b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 2969b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 2979b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 298f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 299d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 3009b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 301dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int pos = position(); 302dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = limit(); 303dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (pos <= lim); 304dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (pos <= lim ? lim - pos : 0); 305fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.memmove(this, 0, this, position, remaining()); 306dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski position(rem); 307dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski limit(capacity()); 308dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski discardMark(); 309dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 310dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 311dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 312dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public boolean isDirect() { 313dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return true; 314dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 315dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 316dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public boolean isReadOnly() { 3179b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera return isReadOnly; 318dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 319dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 320dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski byte _get(int i) { // package-private 3219b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera return get(i); 322dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 323dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 324dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski void _put(int i, byte b) { // package-private 3259b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera put(i, b); 326dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 327dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 328dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private char getChar(long a) { 329f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 330d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 3319b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 332fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return (char) Memory.peekShort(position, !nativeByteOrder); 333dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 334dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 335dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public char getChar() { 336f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 337d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 3389b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 339fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int newPosition = position + SizeOf.CHAR; 340fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera if (newPosition > limit()) { 341fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera throw new BufferUnderflowException(); 342fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera } 343fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera char x = (char) Memory.peekShort(address + position, !nativeByteOrder); 344fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera position = newPosition; 345fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return x; 346dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 347dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 348dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public char getChar(int i) { 349f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 350d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 3519b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 352fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera checkIndex(i, SizeOf.CHAR); 353fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera char x = (char)Memory.peekShort(address + i, !nativeByteOrder); 354fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return x; 355dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 356dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 357dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private ByteBuffer putChar(long a, char x) { 358fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.pokeShort(a, (short) x, !nativeByteOrder); 359dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 360dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 361dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 362dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putChar(char x) { 3639b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 3649b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 3659b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 366f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 367d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 3689b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 369fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putChar(ix(nextPutIndex(SizeOf.CHAR)), x); 370dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 371dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 372dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 373dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putChar(int i, char x) { 3749b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 3759b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 3769b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 377f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 378d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 3799b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 380fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putChar(ix(checkIndex(i, SizeOf.CHAR)), x); 381dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 382dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 383dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 384dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public CharBuffer asCharBuffer() { 385f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 386f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 387f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 388dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int off = this.position(); 389dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = this.limit(); 390dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (off <= lim); 391dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (off <= lim ? lim - off : 0); 392dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int size = rem >> 1; 39346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return (CharBuffer)(new ByteBufferAsCharBuffer(this, 39446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera -1, 39546edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 0, 39646edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 39746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 39846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera off, 39946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera order())); 400dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 401dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 402dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private short getShort(long a) { 403fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return Memory.peekShort(a, !nativeByteOrder); 404dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 405dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 406dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public short getShort() { 407f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 408d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 4099b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 410fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getShort(ix(nextGetIndex(SizeOf.SHORT))); 411dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 412dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 413dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public short getShort(int i) { 414f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 415d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 4169b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 417fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getShort(ix(checkIndex(i, SizeOf.SHORT))); 418dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 419dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 420dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private ByteBuffer putShort(long a, short x) { 421fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.pokeShort(a, x, !nativeByteOrder); 422dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 423dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 424dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 425dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putShort(short x) { 4269b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 4279b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 4289b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 429f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 430d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 4319b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 432fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putShort(ix(nextPutIndex(SizeOf.SHORT)), x); 433dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 434dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 435dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 436dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putShort(int i, short x) { 4379b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 4389b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 4399b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 440f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 441d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 4429b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 443fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putShort(ix(checkIndex(i, SizeOf.SHORT)), x); 444dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 445dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 446dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 447dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ShortBuffer asShortBuffer() { 448f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 449f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 450f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 451dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int off = this.position(); 452dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = this.limit(); 453dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (off <= lim); 454dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (off <= lim ? lim - off : 0); 455dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int size = rem >> 1; 45646edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return (ShortBuffer)(new ByteBufferAsShortBuffer(this, 45746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera -1, 45846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 0, 45946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 46046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 46146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera off, 46246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera order())); 463dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 464dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 465dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private int getInt(long a) { 466fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return Memory.peekInt(a, !nativeByteOrder); 467dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 468dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 469dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public int getInt() { 470f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 471d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 4729b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 473fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getInt(ix(nextGetIndex(SizeOf.INT))); 474dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 475dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 476dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public int getInt(int i) { 477f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 478d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 4799b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 480fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getInt(ix(checkIndex(i, (SizeOf.INT)))); 481dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 482dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 483dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private ByteBuffer putInt(long a, int x) { 484fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.pokeInt(a, x, !nativeByteOrder); 485dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 486dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 487dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 488dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putInt(int x) { 4899b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 4909b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 4919b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 492f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 493d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 4949b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 495fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putInt(ix(nextPutIndex(SizeOf.INT)), x); 496dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 497dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 498dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 499dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putInt(int i, int x) { 5009b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 5019b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 5029b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 503f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 504d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 5059b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 506fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putInt(ix(checkIndex(i, SizeOf.INT)), x); 507dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 508dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 509dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 510dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public IntBuffer asIntBuffer() { 511f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 512f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 513f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 514dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int off = this.position(); 515dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = this.limit(); 516dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (off <= lim); 517dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (off <= lim ? lim - off : 0); 518dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int size = rem >> 2; 51946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return (IntBuffer)(new ByteBufferAsIntBuffer(this, 52046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera -1, 52146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 0, 52246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 52346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 52446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera off, 52546edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera order())); 526dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 527dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 528dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private long getLong(long a) { 529fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return Memory.peekLong(a, !nativeByteOrder); 530dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 531dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 532dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public long getLong() { 533f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 534d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 5359b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 536fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getLong(ix(nextGetIndex(SizeOf.LONG))); 537dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 538dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 539dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public long getLong(int i) { 540f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 541d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 5429b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 543fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getLong(ix(checkIndex(i, SizeOf.LONG))); 544dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 545dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 546dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private ByteBuffer putLong(long a, long x) { 547fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.pokeLong(a, x, !nativeByteOrder); 548dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 549dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 550dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 551dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putLong(long x) { 5529b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 5539b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 5549b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 555f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 556d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 5579b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 558fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putLong(ix(nextPutIndex(SizeOf.LONG)), x); 559dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 560dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 561dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 562dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putLong(int i, long x) { 5639b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 5649b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 5659b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 566f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 567d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 5689b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 569fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putLong(ix(checkIndex(i, SizeOf.LONG)), x); 570dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 571dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 572dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 573dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public LongBuffer asLongBuffer() { 574f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 575f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 576f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 577dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int off = this.position(); 578dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = this.limit(); 579dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (off <= lim); 580dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (off <= lim ? lim - off : 0); 581dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int size = rem >> 3; 58246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return (LongBuffer)(new ByteBufferAsLongBuffer(this, 58346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera -1, 58446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 0, 58546edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 58646edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 58746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera off, 58846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera order())); 589dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 590dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 591dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private float getFloat(long a) { 592fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int x = Memory.peekInt(a, !nativeByteOrder); 593fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return Float.intBitsToFloat(x); 594dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 595dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 596dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public float getFloat() { 597f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 598d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 5999b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 600fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getFloat(ix(nextGetIndex(SizeOf.FLOAT))); 601dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 602dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 603dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public float getFloat(int i) { 604f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 605d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 6069b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 607fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getFloat(ix(checkIndex(i, SizeOf.FLOAT))); 608dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 609dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 610dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private ByteBuffer putFloat(long a, float x) { 611fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera int y = Float.floatToRawIntBits(x); 612fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.pokeInt(a, y, !nativeByteOrder); 613dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 614dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 615dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 616dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putFloat(float x) { 6179b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 6189b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 6199b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 620f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 621d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 6229b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 623fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putFloat(ix(nextPutIndex(SizeOf.FLOAT)), x); 624dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 625dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 626dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 627dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putFloat(int i, float x) { 6289b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 6299b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 6309b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 631f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 632d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 6339b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 634fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putFloat(ix(checkIndex(i, SizeOf.FLOAT)), x); 635dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 636dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 637dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 638dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public FloatBuffer asFloatBuffer() { 639f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 640f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 641f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 642dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int off = this.position(); 643dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = this.limit(); 644dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (off <= lim); 645dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (off <= lim ? lim - off : 0); 646dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int size = rem >> 2; 64746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return (FloatBuffer)(new ByteBufferAsFloatBuffer(this, 64846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera -1, 64946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 0, 65046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 65146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 65246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera off, 65346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera order())); 654dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 655dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 656dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private double getDouble(long a) { 657fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera long x = Memory.peekLong(a, !nativeByteOrder); 658fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return Double.longBitsToDouble(x); 659dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 660dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 661dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public double getDouble() { 662f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 663d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 6649b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 665fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getDouble(ix(nextGetIndex(SizeOf.DOUBLE))); 666dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 667dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 668dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public double getDouble(int i) { 669f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 670d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 6719b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 672fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera return getDouble(ix(checkIndex(i, SizeOf.DOUBLE))); 673dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 674dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 675dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski private ByteBuffer putDouble(long a, double x) { 676fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera long y = Double.doubleToRawLongBits(x); 677fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera Memory.pokeLong(a, y, !nativeByteOrder); 678dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 679dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 680dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 681dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putDouble(double x) { 6829b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 6839b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 6849b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 685f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 686d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 6879b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 688fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putDouble(ix(nextPutIndex(SizeOf.DOUBLE)), x); 689dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 690dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 691dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 692dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public ByteBuffer putDouble(int i, double x) { 6939b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (isReadOnly) { 6949b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera throw new ReadOnlyBufferException(); 6959b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 696f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 697d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 6989b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 699fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera putDouble(ix(checkIndex(i, SizeOf.DOUBLE)), x); 700dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski return this; 701dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 702dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 703dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski public DoubleBuffer asDoubleBuffer() { 704f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera if (!isAccessible) { 705f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 706f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera } 707dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int off = this.position(); 708dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int lim = this.limit(); 709dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski assert (off <= lim); 710dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int rem = (off <= lim ? lim - off : 0); 711dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 712dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski int size = rem >> 3; 71346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return (DoubleBuffer)(new ByteBufferAsDoubleBuffer(this, 71446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera -1, 71546edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 0, 71646edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 71746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera size, 71846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera off, 71946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera order())); 720dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski } 721dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski 722fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera public final void free() { 723fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera freed = true; 724fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera } 725fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera 726fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera private final void checkIfFreed() { 7279b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera if (freed) { 728d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera throw new IllegalStateException("buffer is inaccessible"); 7299b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera } 730fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera } 731d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera 732d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera public boolean isAccessible() { 733d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera return isAccessible; 734d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera } 735d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera 736d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera public void setAccessible(boolean value) { 737d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera isAccessible = value; 738d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera } 739dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski} 740