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