1dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski/*
22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project
3dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
4dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski *
6dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
7dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
8dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
9dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
10dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
11dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski *
12dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
13dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
16dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * accompanied this code).
17dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski *
18dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
19dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
20dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski *
22dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
24dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski * questions.
25dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski */
26dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
27dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskipackage java.nio;
28dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
29dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskiimport java.io.FileDescriptor;
30fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
31fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamathimport dalvik.system.VMRuntime;
32190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmeraimport libcore.io.Memory;
33190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmeraimport libcore.io.SizeOf;
34dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskiimport sun.misc.Cleaner;
35dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebskiimport sun.nio.ch.DirectBuffer;
36dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
37fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath/** @hide */
38757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller// Not final because it is extended in tests.
39fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamathpublic class DirectByteBuffer extends MappedByteBuffer implements DirectBuffer {
40fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
41fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    /**
42fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     * Stores the details of the memory backing a DirectByteBuffer. This could be a pointer
43fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     * (passed through from JNI or resulting from a mapping) or a non-movable byte array allocated
44fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     * from Java. Each MemoryRef also has an isAccessible associated with it, which determines
45fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     * whether the underlying memory is "accessible". The notion of "accessibility" is usually
46fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     * defined by the allocator of the reference, and is separate from the accessibility of the
47fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     * memory as defined by the underlying system.
48fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     *
49fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     * A single MemoryRef instance is shared across all slices and duplicates of a given buffer.
50fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath     */
51757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final static class MemoryRef {
52fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        byte[] buffer;
53fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        long allocatedAddress;
54fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        final int offset;
55fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        boolean isAccessible;
56dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        boolean isFreed;
57fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
581a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak
591a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        // Reference to original DirectByteBuffer that held this MemoryRef. The field is set
601a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        // only for the MemoryRef created through JNI NewDirectByteBuffer(void*, long) function.
611a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        // This allows users of JNI NewDirectByteBuffer to create a PhantomReference on the
621a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        // DirectByteBuffer instance that will only be put in the associated ReferenceQueue when
631a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        // the underlying memory is not referenced by any DirectByteBuffer instance. The
641a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        // MemoryRef can outlive the original DirectByteBuffer instance if, for example, slice()
651a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        // or asReadOnlyBuffer() are called and all strong references to the original DirectByteBuffer
661a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        // are discarded.
671a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        final Object originalBufferObject;
681a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak
69fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        MemoryRef(int capacity) {
70fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            VMRuntime runtime = VMRuntime.getRuntime();
71190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera            buffer = (byte[]) runtime.newNonMovableArray(byte.class, capacity + 7);
72fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            allocatedAddress = runtime.addressOf(buffer);
73fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            // Offset is set to handle the alignment: http://b/16449607
74190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera            offset = (int) (((allocatedAddress + 7) & ~(long) 7) - allocatedAddress);
75fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            isAccessible = true;
76dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            isFreed = false;
771a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak            originalBufferObject = null;
78fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        }
79fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
801a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        MemoryRef(long allocatedAddress, Object originalBufferObject) {
81fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            buffer = null;
82fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            this.allocatedAddress = allocatedAddress;
83fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            this.offset = 0;
841a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak            this.originalBufferObject = originalBufferObject;
85fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            isAccessible = true;
86fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        }
87fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
88fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        void free() {
89fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            buffer = null;
90fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            allocatedAddress = 0;
91fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath            isAccessible = false;
92dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            isFreed = true;
93fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        }
94fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    }
95fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
96fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    final Cleaner cleaner;
97fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    final MemoryRef memoryRef;
98fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
99fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    DirectByteBuffer(int capacity, MemoryRef memoryRef) {
100fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        super(-1, 0, capacity, capacity, memoryRef.buffer, memoryRef.offset);
10180eddeeb7660e50af95155decf4c64ba2dd0abf0Mathieu Chartier        // Only have references to java objects, no need for a cleaner since the GC will do all
10280eddeeb7660e50af95155decf4c64ba2dd0abf0Mathieu Chartier        // the work.
103fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        this.memoryRef = memoryRef;
104190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera        this.address = memoryRef.allocatedAddress + memoryRef.offset;
10580eddeeb7660e50af95155decf4c64ba2dd0abf0Mathieu Chartier        cleaner = null;
1069b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        this.isReadOnly = false;
107dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
108dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
109dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // Invoked only by JNI: NewDirectByteBuffer(void*, long)
110757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @SuppressWarnings("unused")
111dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private DirectByteBuffer(long addr, int cap) {
112dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(-1, 0, cap, cap);
1131a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        memoryRef = new MemoryRef(addr, this);
114dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        address = addr;
115dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        cleaner = null;
1169b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera    }
1179b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera
118fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    /** @hide */
119fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    public DirectByteBuffer(int cap, long addr,
120fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath                            FileDescriptor fd,
121fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath                            Runnable unmapper,
122fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath                            boolean isReadOnly) {
123dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        super(-1, 0, cap, cap, fd);
1249b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        this.isReadOnly = isReadOnly;
1251a6436a8de0d3dd8e1ec0c6a3a54529468dc298dPrzemyslaw Szczepaniak        memoryRef = new MemoryRef(addr, null);
126dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        address = addr;
127fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        cleaner = Cleaner.create(memoryRef, unmapper);
128dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
129dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
130dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    // For duplicates and slices
131fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    DirectByteBuffer(MemoryRef memoryRef,         // package-private
132c1b2d56a068a7bce28a429a1ffb085cbac28c221Shubham Ajmera                     int mark, int pos, int lim, int cap,
133fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera                     int off) {
134fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        this(memoryRef, mark, pos, lim, cap, off, false);
1359b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera    }
1369b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera
137fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    DirectByteBuffer(MemoryRef memoryRef,         // package-private
1389b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                     int mark, int pos, int lim, int cap,
1399b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera                     int off, boolean isReadOnly) {
140fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        super(mark, pos, lim, cap, memoryRef.buffer, off);
1419b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        this.isReadOnly = isReadOnly;
142fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        this.memoryRef = memoryRef;
1437b67633543b3202edbd60add5161495540b9ac51Alex Klyubin        address = memoryRef.allocatedAddress + off;
144dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        cleaner = null;
145fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    }
146fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
147fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    @Override
148757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final Object attachment() {
149fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        return memoryRef;
150fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    }
151fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath
152fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath    @Override
153757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final Cleaner cleaner() {
154fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        return cleaner;
155dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
156dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
157757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
158757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer slice() {
159fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
160f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
161f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
1621817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        int pos = position();
1631817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        int lim = limit();
164dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (pos <= lim);
165dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (pos <= lim ? lim - pos : 0);
166fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        int off = pos + offset;
167dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off >= 0);
168fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        return new DirectByteBuffer(memoryRef, -1, 0, rem, rem, off, isReadOnly);
169dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
170dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
171757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
172757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer duplicate() {
173dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (memoryRef.isFreed) {
174dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer has been freed");
175f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
176fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        return new DirectByteBuffer(memoryRef,
177190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.markValue(),
178190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.position(),
179190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.limit(),
180190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.capacity(),
181190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                offset,
182190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                isReadOnly);
183dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
184dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
185757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
186757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer asReadOnlyBuffer() {
187dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (memoryRef.isFreed) {
188dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer has been freed");
189f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
190fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        return new DirectByteBuffer(memoryRef,
191190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.markValue(),
192190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.position(),
193190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.limit(),
194190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                this.capacity(),
195190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                offset,
196190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                true);
197dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
198dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
1997b67633543b3202edbd60add5161495540b9ac51Alex Klyubin    @Override
200757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final long address() {
201dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return address;
202dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
203dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
204dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private long ix(int i) {
2057b67633543b3202edbd60add5161495540b9ac51Alex Klyubin        return address + i;
206dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
207dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
2081817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera    private byte get(long a) {
209fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Memory.peekByte(a);
210fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    }
211fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera
212757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
213757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final byte get() {
214fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
215d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2169b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
2171817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        return get(ix(nextGetIndex()));
218dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
219dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
220757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
221757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final byte get(int i) {
222fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
223d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2249b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
2251817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        return get(ix(checkIndex(i)));
226dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
227dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
228757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    // This method is not declared final because it is overridden in tests.
229757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
230fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    public ByteBuffer get(byte[] dst, int dstOffset, int length) {
231fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
232d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2339b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
234fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        checkBounds(dstOffset, length, dst.length);
235fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int pos = position();
236fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int lim = limit();
237fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        assert (pos <= lim);
238fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int rem = (pos <= lim ? lim - pos : 0);
239fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        if (length > rem)
240fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera            throw new BufferUnderflowException();
2411817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        Memory.peekByteArray(ix(pos),
242190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                dst, dstOffset, length);
243fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        position = pos + length;
244eb638671b477b765d763ed737d5dcbe6e5e3102eShubham Ajmera        return this;
245eb638671b477b765d763ed737d5dcbe6e5e3102eShubham Ajmera    }
246dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
247757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    private ByteBuffer put(long a, byte x) {
248fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeByte(a, x);
249fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return this;
250fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    }
25166102fec246eb9e68e4e2d5c009f69902259823bNarayan Kamath
252757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
253757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer put(byte x) {
254fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
255d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2569b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
257dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
258dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
259dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
260fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        put(ix(nextPutIndex()), x);
261dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
262dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
263dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
264757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
265757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer put(int i, byte x) {
266fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
267d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2689b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
269dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
270dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
271dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
272fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        put(ix(checkIndex(i)), x);
273dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
274dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
275dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
276757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    // This method is not declared final because it is overridden in tests.
277757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
278fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera    public ByteBuffer put(byte[] src, int srcOffset, int length) {
279fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
280d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
2819b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
282dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
283dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
284dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
285fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        checkBounds(srcOffset, length, src.length);
286fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int pos = position();
287fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int lim = limit();
288fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        assert (pos <= lim);
289fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int rem = (pos <= lim ? lim - pos : 0);
290fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        if (length > rem)
291fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera            throw new BufferOverflowException();
2921817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        Memory.pokeByteArray(ix(pos),
293190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                src, srcOffset, length);
294fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        position = pos + length;
295dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
296dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
297dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
298757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
299757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer compact() {
300fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
301d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3029b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
303dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
304dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
305dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
306dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int pos = position();
307dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = limit();
308dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (pos <= lim);
309dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (pos <= lim ? lim - pos : 0);
3101817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        System.arraycopy(hb, position + offset, hb, offset, remaining());
311dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        position(rem);
312dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        limit(capacity());
313dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        discardMark();
314dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
315dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
316dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
317757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
318757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final boolean isDirect() {
319dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return true;
320dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
321dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
322757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
323757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final boolean isReadOnly() {
3249b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        return isReadOnly;
325dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
326dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
327757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    // Used by java.nio.Bits
328757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
329757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final byte _get(int i) {                          // package-private
3309b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        return get(i);
331dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
332dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
333757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    // Used by java.nio.Bits
334757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
335757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void _put(int i, byte b) {                  // package-private
3369b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        put(i, b);
337dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
338dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
339757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
340757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final char getChar() {
341fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
342d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3439b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
344fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int newPosition = position + SizeOf.CHAR;
345fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        if (newPosition > limit()) {
346fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera            throw new BufferUnderflowException();
347fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        }
3481817e4d9ef742ceebb2d6a04d624c086686b42baShubham Ajmera        char x = (char) Memory.peekShort(ix(position), !nativeByteOrder);
349fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        position = newPosition;
350fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return x;
351dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
352dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
353757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
354757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final char getChar(int i) {
355fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
356d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3579b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
358fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        checkIndex(i, SizeOf.CHAR);
359757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller        return (char) Memory.peekShort(ix(i), !nativeByteOrder);
360dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
361dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
362757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
363e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    char getCharUnchecked(int i) {
364dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
365dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
366dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
367190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera        return (char) Memory.peekShort(ix(i), !nativeByteOrder);
368e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
369e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
370757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
371f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    void getUnchecked(int pos, char[] dst, int dstOffset, int length) {
372dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
373dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
374dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
375f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.peekCharArray(ix(pos),
376190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                dst, dstOffset, length, !nativeByteOrder);
377f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
378f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
379dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putChar(long a, char x) {
380fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeShort(a, (short) x, !nativeByteOrder);
381dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
382dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
383dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
384757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
385757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putChar(char x) {
386fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
387d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
3889b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
389dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
390dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
391dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
392fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putChar(ix(nextPutIndex(SizeOf.CHAR)), x);
393dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
394dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
395dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
396757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
397757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putChar(int i, char x) {
398fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
399d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4009b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
401dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
402dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
403dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
404fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putChar(ix(checkIndex(i, SizeOf.CHAR)), x);
405dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
406dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
407dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
408757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
409e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    void putCharUnchecked(int i, char x) {
410dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
411dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
412dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
413e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        putChar(ix(i), x);
414e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
415e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
416757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
417f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    void putUnchecked(int pos, char[] src, int srcOffset, int length) {
418dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
419dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
420dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
421f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.pokeCharArray(ix(pos),
422190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                src, srcOffset, length, !nativeByteOrder);
423f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
424f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
425757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
426757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final CharBuffer asCharBuffer() {
427dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (memoryRef.isFreed) {
428dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer has been freed");
429f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
430dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
431dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
432dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
433dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
434dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 1;
435757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller        return new ByteBufferAsCharBuffer(this,
436190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                -1,
437190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                0,
438190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
439190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
440190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                off,
441757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller                order());
442dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
443dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
444dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private short getShort(long a) {
445fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Memory.peekShort(a, !nativeByteOrder);
446dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
447dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
448757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
449757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final short getShort() {
450fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
451d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4529b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
453fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getShort(ix(nextGetIndex(SizeOf.SHORT)));
454dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
455dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
456757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
457757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final short getShort(int i) {
458fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
459d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4609b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
461fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getShort(ix(checkIndex(i, SizeOf.SHORT)));
462dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
463dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
464757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
465e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    short getShortUnchecked(int i) {
466dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
467dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
468dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
469e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        return getShort(ix(i));
470e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
471e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
472757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
473f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    void getUnchecked(int pos, short[] dst, int dstOffset, int length) {
474dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
475dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
476dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
477f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.peekShortArray(ix(pos),
478190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                dst, dstOffset, length, !nativeByteOrder);
479f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
480f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
481dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putShort(long a, short x) {
482fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeShort(a, x, !nativeByteOrder);
483dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
484dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
485dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
486757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
487757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putShort(short x) {
488fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
489d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
4909b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
491dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
492dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
493dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
494fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putShort(ix(nextPutIndex(SizeOf.SHORT)), x);
495dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
496dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
497dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
498757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
499757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putShort(int i, short x) {
500fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
501d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5029b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
503dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
504dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
505dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
506fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putShort(ix(checkIndex(i, SizeOf.SHORT)), x);
507dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
508dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
509dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
510757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
511e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    void putShortUnchecked(int i, short x) {
512dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
513dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
514dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
515e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        putShort(ix(i), x);
516e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
517e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
518757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
519f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    void putUnchecked(int pos, short[] src, int srcOffset, int length) {
520dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
521dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
522dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
523f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.pokeShortArray(ix(pos),
524190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                src, srcOffset, length, !nativeByteOrder);
525f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
526f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
527757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
528757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ShortBuffer asShortBuffer() {
529dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (memoryRef.isFreed) {
530dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer has been freed");
531f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
532dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
533dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
534dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
535dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
536dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 1;
537757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller        return new ByteBufferAsShortBuffer(this,
538190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                -1,
539190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                0,
540190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
541190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
542190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                off,
543757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller                order());
544dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
545dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
546dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private int getInt(long a) {
547190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera        return Memory.peekInt(a, !nativeByteOrder);
548dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
549dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
550757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
551dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public int getInt() {
552fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
553d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5549b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
555fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getInt(ix(nextGetIndex(SizeOf.INT)));
556dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
557dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
558757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
559dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    public int getInt(int i) {
560fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
561d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5629b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
563fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getInt(ix(checkIndex(i, (SizeOf.INT))));
564dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
565dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
566757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
567757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final int getIntUnchecked(int i) {
568dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
569dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
570dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
571e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        return getInt(ix(i));
572e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
573e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
574757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
575757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void getUnchecked(int pos, int[] dst, int dstOffset, int length) {
576dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
577dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
578dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
579f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.peekIntArray(ix(pos),
580190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                dst, dstOffset, length, !nativeByteOrder);
581f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
582f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
583dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putInt(long a, int x) {
584fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeInt(a, x, !nativeByteOrder);
585dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
586dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
587dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
588757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
589757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putInt(int x) {
590fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
591d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
5929b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
593dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
594dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
595dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
596fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putInt(ix(nextPutIndex(SizeOf.INT)), x);
597dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
598dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
599dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
600757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
601757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putInt(int i, int x) {
602fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
603d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6049b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
605dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
606dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
607dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
608fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putInt(ix(checkIndex(i, SizeOf.INT)), x);
609dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
610dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
611dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
612757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
613757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void putIntUnchecked(int i, int x) {
614dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
615dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
616dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
617e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        putInt(ix(i), x);
618e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
619e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
620757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
621757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void putUnchecked(int pos, int[] src, int srcOffset, int length) {
622dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
623dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
624dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
625f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.pokeIntArray(ix(pos),
626190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                src, srcOffset, length, !nativeByteOrder);
627f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
628f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
629757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
630757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final IntBuffer asIntBuffer() {
631dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (memoryRef.isFreed) {
632dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer has been freed");
633f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
634dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
635dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
636dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
637dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
638dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 2;
639757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller        return new ByteBufferAsIntBuffer(this,
640190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                -1,
641190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                0,
642190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
643190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
644190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                off,
645757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller                order());
646dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
647dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
648dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private long getLong(long a) {
649fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Memory.peekLong(a, !nativeByteOrder);
650dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
651dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
652757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
653757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final long getLong() {
654fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
655d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6569b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
657fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getLong(ix(nextGetIndex(SizeOf.LONG)));
658dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
659dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
660757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
661757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final long getLong(int i) {
662fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
663d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6649b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
665fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getLong(ix(checkIndex(i, SizeOf.LONG)));
666dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
667dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
668757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
669757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final long getLongUnchecked(int i) {
670dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
671dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
672dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
673e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        return getLong(ix(i));
674e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
675e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
676757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
677757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void getUnchecked(int pos, long[] dst, int dstOffset, int length) {
678dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
679dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
680dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
681f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.peekLongArray(ix(pos),
682190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                dst, dstOffset, length, !nativeByteOrder);
683f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
684f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
685dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putLong(long a, long x) {
686fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeLong(a, x, !nativeByteOrder);
687dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
688dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
689dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
690757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
691757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putLong(long x) {
692fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
693d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
6949b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
695dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
696dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
697dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
698fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putLong(ix(nextPutIndex(SizeOf.LONG)), x);
699dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
700dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
701dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
702757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
703757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putLong(int i, long x) {
704fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
705d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
7069b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
707dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
708dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
709dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
710fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putLong(ix(checkIndex(i, SizeOf.LONG)), x);
711dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
712dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
713dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
714757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
715757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void putLongUnchecked(int i, long x) {
716dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
717dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
718dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
719e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        putLong(ix(i), x);
720e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
721e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
722757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
723757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void putUnchecked(int pos, long[] src, int srcOffset, int length) {
724dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
725dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
726dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
727f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.pokeLongArray(ix(pos),
728190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                src, srcOffset, length, !nativeByteOrder);
729f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
730f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
731757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
732757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final LongBuffer asLongBuffer() {
733dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (memoryRef.isFreed) {
734dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer has been freed");
735f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
736dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
737dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
738dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
739dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
740dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 3;
741757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller        return new ByteBufferAsLongBuffer(this,
742190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                -1,
743190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                0,
744190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
745190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
746190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                off,
747757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller                order());
748dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
749dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
750dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private float getFloat(long a) {
751fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int x = Memory.peekInt(a, !nativeByteOrder);
752fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Float.intBitsToFloat(x);
753dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
754dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
755757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
756757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final float getFloat() {
757fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
758d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
7599b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
760fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getFloat(ix(nextGetIndex(SizeOf.FLOAT)));
761dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
762dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
763757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
764757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final float getFloat(int i) {
765fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
766d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
7679b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
768fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getFloat(ix(checkIndex(i, SizeOf.FLOAT)));
769dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
770dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
771757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
772757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final float getFloatUnchecked(int i) {
773dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
774dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
775dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
776e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        return getFloat(ix(i));
777e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
778e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
779757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
780757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void getUnchecked(int pos, float[] dst, int dstOffset, int length) {
781dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
782dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
783dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
784f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.peekFloatArray(ix(pos),
785190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                dst, dstOffset, length, !nativeByteOrder);
786f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
787f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
788dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putFloat(long a, float x) {
789fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        int y = Float.floatToRawIntBits(x);
790fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeInt(a, y, !nativeByteOrder);
791dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
792dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
793dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
794757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
795757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putFloat(float x) {
796fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
797d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
7989b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
799dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
800dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
801dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
802fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putFloat(ix(nextPutIndex(SizeOf.FLOAT)), x);
803dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
804dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
805dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
806757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
807757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putFloat(int i, float x) {
808fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
809d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
8109b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
811dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
812dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
813dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
814fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putFloat(ix(checkIndex(i, SizeOf.FLOAT)), x);
815dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
816dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
817dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
818757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
819757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void putFloatUnchecked(int i, float x) {
820dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
821dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
822dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
823e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        putFloat(ix(i), x);
824e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
825e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
826757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
827757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void putUnchecked(int pos, float[] src, int srcOffset, int length) {
828dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
829dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
830dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
831f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.pokeFloatArray(ix(pos),
832190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                src, srcOffset, length, !nativeByteOrder);
833f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
834f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
835757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
836757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final FloatBuffer asFloatBuffer() {
837dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (memoryRef.isFreed) {
838dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer has been freed");
839f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
840dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
841dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
842dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
843dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
844dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 2;
845757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller        return new ByteBufferAsFloatBuffer(this,
846190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                -1,
847190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                0,
848190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
849190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
850190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                off,
851757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller                order());
852dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
853dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
854dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private double getDouble(long a) {
855fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        long x = Memory.peekLong(a, !nativeByteOrder);
856fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return Double.longBitsToDouble(x);
857dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
858dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
859757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
860757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final double getDouble() {
861fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
862d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
8639b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
864fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getDouble(ix(nextGetIndex(SizeOf.DOUBLE)));
865dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
866dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
867757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
868757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final double getDouble(int i) {
869fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
870d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
8719b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
872fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        return getDouble(ix(checkIndex(i, SizeOf.DOUBLE)));
873dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
874dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
875757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
876757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final double getDoubleUnchecked(int i) {
877dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
878dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
879dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
880e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        return getDouble(ix(i));
881e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
882e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
883757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
884757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void getUnchecked(int pos, double[] dst, int dstOffset, int length) {
885dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
886dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
887dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
888f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.peekDoubleArray(ix(pos),
889190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                dst, dstOffset, length, !nativeByteOrder);
890f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
891f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
892dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    private ByteBuffer putDouble(long a, double x) {
893fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        long y = Double.doubleToRawLongBits(x);
894fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        Memory.pokeLong(a, y, !nativeByteOrder);
895dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
896dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
897dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
898757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
899757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putDouble(double x) {
900fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
901d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
9029b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
903dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
904dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
905dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
906fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putDouble(ix(nextPutIndex(SizeOf.DOUBLE)), x);
907dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
908dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
909dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
910757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
911757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final ByteBuffer putDouble(int i, double x) {
912fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        if (!memoryRef.isAccessible) {
913d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
9149b30f636b4ce3e4c48a817d7b2f7bd7a8d579631Shubham Ajmera        }
915dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (isReadOnly) {
916dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new ReadOnlyBufferException();
917dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
918fde0200e844b5c508b628da74a15eff193f31745Shubham Ajmera        putDouble(ix(checkIndex(i, SizeOf.DOUBLE)), x);
919dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        return this;
920dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
921dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
922757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
923757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void putDoubleUnchecked(int i, double x) {
924dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
925dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
926dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
927e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera        putDouble(ix(i), x);
928e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera    }
929e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera
930757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
931757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    final void putUnchecked(int pos, double[] src, int srcOffset, int length) {
932dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (!memoryRef.isAccessible) {
933dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer is inaccessible");
934dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        }
935f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera        Memory.pokeDoubleArray(ix(pos),
936190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                src, srcOffset, length, !nativeByteOrder);
937f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera    }
938f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera
939757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
940757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final DoubleBuffer asDoubleBuffer() {
941dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera        if (memoryRef.isFreed) {
942dc5090e980361d9c0831c2a7ecd5341d50fc2b00Shubham Ajmera            throw new IllegalStateException("buffer has been freed");
943f4145724170d5e3e52b3bf683d527fa5698cb12dShubham Ajmera        }
944dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int off = this.position();
945dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int lim = this.limit();
946dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        assert (off <= lim);
947dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int rem = (off <= lim ? lim - off : 0);
948dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
949dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski        int size = rem >> 3;
950757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller        return new ByteBufferAsDoubleBuffer(this,
951190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                -1,
952190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                0,
953190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
954190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                size,
955190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera                off,
956757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller                order());
957dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski    }
958dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski
959757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
960757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final boolean isAccessible() {
961fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        return memoryRef.isAccessible;
962d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera    }
963d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera
964757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    @Override
965757b76e91f9d1f8006a970d9ca894b81c6fadea8Neil Fuller    public final void setAccessible(boolean value) {
966fe0e5d3e460de87d24e0224ef10b089289355c47Narayan Kamath        memoryRef.isAccessible = value;
967d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera    }
968dee594e6a72064fc994b305487a61f2e2bb250e1Piotr Jastrzebski}
969