1cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera/* 2cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. 3cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * 5cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * This code is free software; you can redistribute it and/or modify it 6cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * under the terms of the GNU General Public License version 2 only, as 7cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * published by the Free Software Foundation. Oracle designates this 8cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * particular file as subject to the "Classpath" exception as provided 9cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * by Oracle in the LICENSE file that accompanied this code. 10cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * 11cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * This code is distributed in the hope that it will be useful, but WITHOUT 12cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * version 2 for more details (a copy is included in the LICENSE file that 15cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * accompanied this code). 16cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * 17cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * You should have received a copy of the GNU General Public License version 18cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * 2 along with this work; if not, write to the Free Software Foundation, 19cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * 21cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * or visit www.oracle.com if you need additional information or have any 23cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera * questions. 24cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera */ 25cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 26cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmerapackage java.nio; 27cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 2846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmeraimport libcore.io.Memory; 2946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 30cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmeraclass ByteBufferAsLongBuffer extends LongBuffer { // package-private 31cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 32cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera protected final ByteBuffer bb; 33cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera protected final int offset; 34cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera private final ByteOrder order; 35cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 36cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera ByteBufferAsLongBuffer(ByteBuffer bb, 37cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int mark, int pos, int lim, int cap, 38cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int off, ByteOrder order) { 39cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera super(mark, pos, lim, cap); 40c3005946d4806ca6a975fcfc63bdfd3e54b56b9aShubham Ajmera this.bb = bb.duplicate(); 41d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera this.isReadOnly = bb.isReadOnly; 42e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // There are only two possibilities for the type of ByteBuffer "bb", viz, DirectByteBuffer and 43e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // HeapByteBuffer. We only have to initialize the field when bb is an instance of 44e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // DirectByteBuffer. 45e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // The address field is used by NIOAccess#getBasePointer and GetDirectBufferAddress method 46e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // in art which return the address of the first usable byte of the underlying memory, i.e, 47e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // the position of parent buffer. Therefore, value of "off" will be equal to parent buffer's 48e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // position when the method is called from either HeapByteBuffer or DirectByteBuffer. 49e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera if (bb instanceof DirectByteBuffer) { 50e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera this.address = bb.address + off; 51e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera } 52cdf4dbb3c1ee370333fdfa628def46a4250c292dShubham Ajmera this.bb.order(order); 53cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera this.order = order; 54cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera offset = off; 55cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 56cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 57cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public LongBuffer slice() { 58cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int pos = this.position(); 59cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int lim = this.limit(); 60cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera assert (pos <= lim); 61cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int rem = (pos <= lim ? lim - pos : 0); 62cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int off = (pos << 3) + offset; 63cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera assert (off >= 0); 6446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return new ByteBufferAsLongBuffer(bb, -1, 0, rem, rem, off, order); 65cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 66cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 67cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public LongBuffer duplicate() { 68cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera return new ByteBufferAsLongBuffer(bb, 69190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.markValue(), 70190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.position(), 71190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.limit(), 72190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.capacity(), 73190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, 74190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera order); 75cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 76cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 77cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public LongBuffer asReadOnlyBuffer() { 7846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return new ByteBufferAsLongBuffer(bb.asReadOnlyBuffer(), 79190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.markValue(), 80190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.position(), 81190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.limit(), 82190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera this.capacity(), 83190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, 84190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera order); 85cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 86cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 87cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera protected int ix(int i) { 88cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera return (i << 3) + offset; 89cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 90cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 91cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public long get() { 9246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return get(nextGetIndex()); 93cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 94cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 95cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public long get(int i) { 96e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera return bb.getLongUnchecked(ix(checkIndex(i))); 97cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 98cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 99f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera public LongBuffer get(long[] dst, int offset, int length) { 100f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera checkBounds(offset, length, dst.length); 101f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera if (length > remaining()) 102f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera throw new BufferUnderflowException(); 103f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera bb.getUnchecked(ix(position), dst, offset, length); 104f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera position += length; 105f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera return this; 106f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera } 107f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera 108cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public LongBuffer put(long x) { 10946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera put(nextPutIndex(), x); 110cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera return this; 111cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 112cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 113cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public LongBuffer put(int i, long x) { 114e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera if (isReadOnly) { 115e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera throw new ReadOnlyBufferException(); 116e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera } 117e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera bb.putLongUnchecked(ix(checkIndex(i)), x); 118cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera return this; 119cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 120cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 121f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera public LongBuffer put(long[] src, int offset, int length) { 122f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera checkBounds(offset, length, src.length); 123f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera if (length > remaining()) 124f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera throw new BufferOverflowException(); 125f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera bb.putUnchecked(ix(position), src, offset, length); 126f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera position += length; 127f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera return this; 128f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera } 129f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera 130cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public LongBuffer compact() { 131cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera if (isReadOnly) { 132cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera throw new ReadOnlyBufferException(); 133cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 134cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int pos = position(); 135cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int lim = limit(); 136cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera assert (pos <= lim); 137cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera int rem = (pos <= lim ? lim - pos : 0); 13846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera if (!(bb instanceof DirectByteBuffer)) { 13946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera System.arraycopy(bb.array(), ix(pos), bb.array(), ix(0), rem << 3); 14046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera } else { 14146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera Memory.memmove(this, ix(0), this, ix(pos), rem << 3); 14246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera } 143cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera position(rem); 144cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera limit(capacity()); 145cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera discardMark(); 146cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera return this; 147cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 148cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 149cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public boolean isDirect() { 150cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera return bb.isDirect(); 151cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 152cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 153cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public boolean isReadOnly() { 154d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera return isReadOnly; 155cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 156cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera 157cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera public ByteOrder order() { 158cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera return order; 159cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera } 160cb270ef16cdf175422468ea7d69a8df47cfddff6Shubham Ajmera} 161