DirectByteBuffer.java revision 1817e4d9ef742ceebb2d6a04d624c086686b42ba
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;
34dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
35fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmeraclass DirectByteBuffer extends MappedByteBuffer
36fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    implements DirectBuffer {
37dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
38f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera    private boolean isAccessible = true;
39d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera
40dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // Base address, used in all indexing calculations
41dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // NOTE: moved up to Buffer.java for speed in JNI GetDirectBufferAddress
42dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    //    protected long address;
43dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
44dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // An object attached to this buffer. If this buffer is a view of another
45dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // buffer then we use this field to keep a reference to that buffer to
46dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // ensure that its memory isn't freed before we are done with it.
47dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private final Object att;
48dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
49dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public Object attachment() {
50dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return att;
51dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
52dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
53fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    private Cleaner cleaner;
54dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
551817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera    private long actualAddress;
561817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera
57dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public Cleaner cleaner() { return cleaner; }
58dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
591817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera    DirectByteBuffer(int capacity, long address, byte[] hb, int offset) {
601817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        super(-1, 0, capacity, capacity, hb, offset);
6180eddeeb7660e50af95155decf4c64ba2dd0abf0Mathieu Chartier        // Only have references to java objects, no need for a cleaner since the GC will do all
6280eddeeb7660e50af95155decf4c64ba2dd0abf0Mathieu Chartier        // the work.
631817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        this.address = address + offset;
641817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        this.actualAddress = address;
6580eddeeb7660e50af95155decf4c64ba2dd0abf0Mathieu Chartier        cleaner = null;
669b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        this.isReadOnly = false;
67dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        att = null;
68dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
69dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
70dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    DirectByteBuffer(long addr, int cap, Object ob) {
71dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(-1, 0, cap, cap);
72dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        address = addr;
731817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        actualAddress = addr;
74dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        cleaner = null;
75dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        att = ob;
76dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
77dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
78dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // Invoked only by JNI: NewDirectByteBuffer(void*, long)
79dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    //
80dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private DirectByteBuffer(long addr, int cap) {
81dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(-1, 0, cap, cap);
82dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        address = addr;
831817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        actualAddress = addr;
84dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        cleaner = null;
85dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        att = null;
86dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
87dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
88dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // For memory-mapped buffers -- invoked by FileChannelImpl via reflection
89dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    //
90dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    protected DirectByteBuffer(int cap, long addr,
91c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera                               FileDescriptor fd,
92fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera                               Runnable unmapper) {
939b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        this(cap, addr, fd, unmapper, false);
949b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera    }
959b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera
969b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera    protected DirectByteBuffer(int cap, long addr,
979b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                               FileDescriptor fd,
989b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                               Runnable unmapper,
999b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                               boolean isReadOnly) {
100dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(-1, 0, cap, cap, fd);
1019b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        this.isReadOnly = isReadOnly;
102dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        address = addr;
1031817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        actualAddress = addr;
104dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        cleaner = Cleaner.create(this, unmapper);
105dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        att = null;
106dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
107dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
108dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // For duplicates and slices
109dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    //
110d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera    DirectByteBuffer(DirectByteBuffer db,         // package-private
111c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera                     int mark, int pos, int lim, int cap,
112fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera                     int off) {
1139b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        this(db, mark, pos, lim, cap, off, false);
1149b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera    }
1159b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera
116d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera    DirectByteBuffer(DirectByteBuffer db,         // package-private
1179b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                     int mark, int pos, int lim, int cap,
1189b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                     int off, boolean isReadOnly) {
119d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera        super(mark, pos, lim, cap, db.hb, off);
1209b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        this.isReadOnly = isReadOnly;
1211817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        address = db.address;
1221817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        actualAddress = db.actualAddress;
123dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        cleaner = null;
124dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        att = db;
125dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
126dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
127dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer slice() {
128f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
129f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
130f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
1311817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        int pos = position();
1321817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        int lim = limit();
133dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (pos <= lim);
134dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (pos <= lim ? lim - pos : 0);
1351817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        int off = (pos << 0) + offset;
136dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off >= 0);
1379b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        return new DirectByteBuffer(this, -1, 0, rem, rem, off, isReadOnly);
138dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
139dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
140dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer duplicate() {
141f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
142f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
143f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
144dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return new DirectByteBuffer(this,
145c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera                                    this.markValue(),
146c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera                                    this.position(),
147c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera                                    this.limit(),
148c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera                                    this.capacity(),
1491817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera                                    offset,
1509b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                                    isReadOnly);
151dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
152dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
153dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer asReadOnlyBuffer() {
154f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
155f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
156f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
1579b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        return new DirectByteBuffer(this,
1589b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                                    this.markValue(),
1599b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                                    this.position(),
1609b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                                    this.limit(),
1619b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                                    this.capacity(),
1621817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera                                    offset,
1639b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                                    true);
164dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
165dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
166dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public long address() {
167dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return address;
168dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
169dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
170dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private long ix(int i) {
1711817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        return actualAddress + offset + (i << 0);
172dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
173dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
1741817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera    private byte get(long a) {
175fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Memory.peekByte(a);
176fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    }
177fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera
178dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public byte get() {
179f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
180d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
1819b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
1821817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        return get(ix(nextGetIndex()));
183dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
184dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
185dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public byte get(int i) {
186f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
187d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
1889b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
1891817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        return get(ix(checkIndex(i)));
190dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
191dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
192fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    public ByteBuffer get(byte[] dst, int dstOffset, int length) {
193f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
194d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
1959b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
196fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        checkBounds(dstOffset, length, dst.length);
197fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int pos = position();
198fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int lim = limit();
199fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        assert (pos <= lim);
200fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int rem = (pos <= lim ? lim - pos : 0);
201fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        if (length > rem)
202fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera            throw new BufferUnderflowException();
2031817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        Memory.peekByteArray(ix(pos),
204fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera                             dst, dstOffset, length);
205fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        position = pos + length;
206eb638671b477b765d763ed737d5dcbe6e5e3102eShubham Ajmera        return this;
207eb638671b477b765d763ed737d5dcbe6e5e3102eShubham Ajmera    }
208dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
209fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    public ByteBuffer put(long a, byte x) {
210fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeByte(a, x);
211fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return this;
212fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    }
21366102fec246eb9e68e4e2d5c009f69902259823bNarayan Kamath
214dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer put(byte x) {
2159b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
2169b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
2179b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
218f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
219d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2209b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
221fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        put(ix(nextPutIndex()), x);
222dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
223dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
224dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
225dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer put(int i, byte x) {
2269b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
2279b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
2289b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
229f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
230d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2319b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
232fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        put(ix(checkIndex(i)), x);
233dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
234dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
235dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
236dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer put(ByteBuffer src) {
2379b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
2389b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
2399b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
240f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
241d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2429b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
243d556642d9c5ef258a0867b0101842fae10165f64Shubham Ajmera        if (src.hb != null) {
244dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            int spos = src.position();
245dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            int slim = src.limit();
246dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            assert (spos <= slim);
247dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            int srem = (spos <= slim ? slim - spos : 0);
248d556642d9c5ef258a0867b0101842fae10165f64Shubham Ajmera            if (src == this)
249d556642d9c5ef258a0867b0101842fae10165f64Shubham Ajmera                throw new IllegalArgumentException();
250dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            put(src.hb, src.offset + spos, srem);
251dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            src.position(spos + srem);
252dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        } else {
253dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski            super.put(src);
254dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        }
255dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
256dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
257dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
258fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    public ByteBuffer put(byte[] src, int srcOffset, int length) {
2599b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
2609b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
2619b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
262f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
263d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2649b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
265fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        checkBounds(srcOffset, length, src.length);
266fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int pos = position();
267fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int lim = limit();
268fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        assert (pos <= lim);
269fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int rem = (pos <= lim ? lim - pos : 0);
270fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        if (length > rem)
271fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera            throw new BufferOverflowException();
2721817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        Memory.pokeByteArray(ix(pos),
273fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera                             src, srcOffset, length);
274fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        position = pos + length;
275dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
276dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
277dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
278dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer compact() {
2799b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
2809b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
2819b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
282f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
283d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2849b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
285dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int pos = position();
286dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = limit();
287dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (pos <= lim);
288dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (pos <= lim ? lim - pos : 0);
2891817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        System.arraycopy(hb, position + offset, hb, offset, remaining());
290dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        position(rem);
291dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        limit(capacity());
292dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        discardMark();
293dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
294dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
295dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
296dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public boolean isDirect() {
297dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return true;
298dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
299dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
300dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public boolean isReadOnly() {
3019b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        return isReadOnly;
302dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
303dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
304dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    byte _get(int i) {                          // package-private
3059b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        return get(i);
306dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
307dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
308dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    void _put(int i, byte b) {                  // package-private
3099b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        put(i, b);
310dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
311dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
312dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private char getChar(long a) {
313f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
314d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3159b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
316fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return (char) Memory.peekShort(position, !nativeByteOrder);
317dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
318dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
319dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public char getChar() {
320f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
321d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3229b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
323fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int newPosition = position + SizeOf.CHAR;
324fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        if (newPosition > limit()) {
325fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera            throw new BufferUnderflowException();
326fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        }
3271817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        char x = (char) Memory.peekShort(ix(position), !nativeByteOrder);
328fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        position = newPosition;
329fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return x;
330dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
331dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
332dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public char getChar(int i) {
333f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
334d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3359b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
336fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        checkIndex(i, SizeOf.CHAR);
3371817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        char x = (char)Memory.peekShort(ix(i), !nativeByteOrder);
338fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return x;
339dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
340dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
341dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putChar(long a, char x) {
342fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeShort(a, (short) x, !nativeByteOrder);
343dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
344dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
345dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
346dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putChar(char x) {
3479b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
3489b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
3499b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
350f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
351d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3529b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
353fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putChar(ix(nextPutIndex(SizeOf.CHAR)), x);
354dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
355dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
356dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
357dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putChar(int i, char x) {
3589b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
3599b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
3609b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
361f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
362d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3639b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
364fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putChar(ix(checkIndex(i, SizeOf.CHAR)), x);
365dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
366dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
367dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
368dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public CharBuffer asCharBuffer() {
369f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
370f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
371f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
372dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
373dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
374dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
375dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
376dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 1;
37746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera        return  (CharBuffer)(new ByteBufferAsCharBuffer(this,
37846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                        -1,
37946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                        0,
38046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                        size,
38146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                        size,
38246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                        off,
38346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                        order()));
384dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
385dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
386dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private short getShort(long a) {
387fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Memory.peekShort(a, !nativeByteOrder);
388dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
389dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
390dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public short getShort() {
391f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
392d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3939b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
394fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getShort(ix(nextGetIndex(SizeOf.SHORT)));
395dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
396dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
397dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public short getShort(int i) {
398f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
399d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4009b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
401fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getShort(ix(checkIndex(i, SizeOf.SHORT)));
402dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
403dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
404dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putShort(long a, short x) {
405fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeShort(a, x, !nativeByteOrder);
406dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
407dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
408dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
409dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putShort(short x) {
4109b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
4119b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
4129b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
413f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
414d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4159b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
416fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putShort(ix(nextPutIndex(SizeOf.SHORT)), x);
417dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
418dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
419dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
420dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putShort(int i, short x) {
4219b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
4229b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
4239b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
424f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
425d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4269b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
427fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putShort(ix(checkIndex(i, SizeOf.SHORT)), x);
428dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
429dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
430dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
431dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ShortBuffer asShortBuffer() {
432f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
433f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
434f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
435dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
436dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
437dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
438dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
439dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 1;
44046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera        return (ShortBuffer)(new ByteBufferAsShortBuffer(this,
44146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         -1,
44246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         0,
44346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         size,
44446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         size,
44546edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         off,
44646edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         order()));
447dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
448dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
449dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private int getInt(long a) {
450fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return  Memory.peekInt(a, !nativeByteOrder);
451dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
452dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
453dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public int getInt() {
454f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
455d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4569b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
457fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getInt(ix(nextGetIndex(SizeOf.INT)));
458dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
459dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
460dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public int getInt(int i) {
461f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
462d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4639b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
464fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getInt(ix(checkIndex(i, (SizeOf.INT))));
465dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
466dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
467dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putInt(long a, int x) {
468fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeInt(a, x, !nativeByteOrder);
469dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
470dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
471dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
472dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putInt(int x) {
4739b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
4749b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
4759b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
476f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
477d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4789b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
479fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putInt(ix(nextPutIndex(SizeOf.INT)), x);
480dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
481dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
482dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
483dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putInt(int i, int x) {
4849b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
4859b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
4869b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
487f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
488d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4899b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
490fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putInt(ix(checkIndex(i, SizeOf.INT)), x);
491dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
492dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
493dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
494dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public IntBuffer asIntBuffer() {
495f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
496f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
497f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
498dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
499dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
500dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
501dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
502dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 2;
50346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera        return (IntBuffer)(new ByteBufferAsIntBuffer(this,
50446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                     -1,
50546edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                     0,
50646edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                     size,
50746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                     size,
50846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                     off,
50946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                     order()));
510dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
511dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
512dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private long getLong(long a) {
513fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Memory.peekLong(a, !nativeByteOrder);
514dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
515dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
516dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public long getLong() {
517f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
518d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5199b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
520fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getLong(ix(nextGetIndex(SizeOf.LONG)));
521dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
522dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
523dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public long getLong(int i) {
524f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
525d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5269b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
527fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getLong(ix(checkIndex(i, SizeOf.LONG)));
528dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
529dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
530dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putLong(long a, long x) {
531fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeLong(a, x, !nativeByteOrder);
532dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
533dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
534dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
535dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putLong(long x) {
5369b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
5379b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
5389b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
539f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
540d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5419b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
542fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putLong(ix(nextPutIndex(SizeOf.LONG)), x);
543dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
544dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
545dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
546dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putLong(int i, long x) {
5479b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
5489b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
5499b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
550f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
551d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5529b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
553fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putLong(ix(checkIndex(i, SizeOf.LONG)), x);
554dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
555dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
556dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
557dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public LongBuffer asLongBuffer() {
558f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
559f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
560f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
561dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
562dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
563dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
564dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
565dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 3;
56646edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera        return (LongBuffer)(new ByteBufferAsLongBuffer(this,
56746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                       -1,
56846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                       0,
56946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                       size,
57046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                       size,
57146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                       off,
57246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                       order()));
573dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
574dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
575dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private float getFloat(long a) {
576fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int x = Memory.peekInt(a, !nativeByteOrder);
577fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Float.intBitsToFloat(x);
578dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
579dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
580dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public float getFloat() {
581f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
582d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5839b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
584fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getFloat(ix(nextGetIndex(SizeOf.FLOAT)));
585dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
586dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
587dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public float getFloat(int i) {
588f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
589d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5909b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
591fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getFloat(ix(checkIndex(i, SizeOf.FLOAT)));
592dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
593dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
594dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putFloat(long a, float x) {
595fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int y = Float.floatToRawIntBits(x);
596fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeInt(a, y, !nativeByteOrder);
597dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
598dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
599dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
600dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putFloat(float x) {
6019b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
6029b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
6039b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
604f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
605d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6069b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
607fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putFloat(ix(nextPutIndex(SizeOf.FLOAT)), x);
608dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
609dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
610dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
611dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putFloat(int i, float x) {
6129b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
6139b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
6149b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
615f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
616d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6179b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
618fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putFloat(ix(checkIndex(i, SizeOf.FLOAT)), x);
619dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
620dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
621dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
622dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public FloatBuffer asFloatBuffer() {
623f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
624f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
625f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
626dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
627dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
628dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
629dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
630dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 2;
63146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera        return (FloatBuffer)(new ByteBufferAsFloatBuffer(this,
63246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         -1,
63346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         0,
63446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         size,
63546edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         size,
63646edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         off,
63746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                         order()));
638dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
639dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
640dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private double getDouble(long a) {
641fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        long x = Memory.peekLong(a, !nativeByteOrder);
642fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Double.longBitsToDouble(x);
643dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
644dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
645dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public double getDouble() {
646f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
647d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6489b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
649fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getDouble(ix(nextGetIndex(SizeOf.DOUBLE)));
650dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
651dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
652dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public double getDouble(int i) {
653f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
654d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6559b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
656fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getDouble(ix(checkIndex(i, SizeOf.DOUBLE)));
657dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
658dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
659dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putDouble(long a, double x) {
660fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        long y = Double.doubleToRawLongBits(x);
661fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeLong(a, y, !nativeByteOrder);
662dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
663dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
664dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
665dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putDouble(double x) {
6669b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
6679b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
6689b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
669f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
670d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6719b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
672fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putDouble(ix(nextPutIndex(SizeOf.DOUBLE)), x);
673dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
674dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
675dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
676dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public ByteBuffer putDouble(int i, double x) {
6779b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        if (isReadOnly) {
6789b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera            throw new ReadOnlyBufferException();
6799b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
680f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
681d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6829b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
683fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putDouble(ix(checkIndex(i, SizeOf.DOUBLE)), x);
684dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
685dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
686dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
687dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public DoubleBuffer asDoubleBuffer() {
688f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        if (!isAccessible) {
689f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
690f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
691dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
692dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
693dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
694dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
695dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
696dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 3;
69746edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera        return (DoubleBuffer)(new ByteBufferAsDoubleBuffer(this,
69846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                           -1,
69946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                           0,
70046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                           size,
70146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                           size,
70246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                           off,
70346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera                                                           order()));
704dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
705dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
706d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera    public boolean isAccessible() {
707d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera        return isAccessible;
708d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera    }
709d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera
710d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera    public void setAccessible(boolean value) {
711d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera        isAccessible = value;
712d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera    }
713dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski}
714