1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilsonpackage java.nio; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 21fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes * DoubleArrayBuffer implements double[]-based DoubleBuffers. 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 23fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughesfinal class DoubleArrayBuffer extends DoubleBuffer { 24fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 25fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes private final double[] backingArray; 26fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 27fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes private final int arrayOffset; 28fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 29fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes private final boolean isReadOnly; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 31fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes DoubleArrayBuffer(double[] array) { 32fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes this(array.length, array, 0, false); 33fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes private DoubleArrayBuffer(int capacity, double[] backingArray, int arrayOffset, boolean isReadOnly) { 362589e301d1fb85960045c9ef29682d7e73b1aee7Narayan Kamath super(capacity, 0); 37fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes this.backingArray = backingArray; 38fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes this.arrayOffset = arrayOffset; 39fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes this.isReadOnly = isReadOnly; 40fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes private static DoubleArrayBuffer copy(DoubleArrayBuffer other, int markOfOther, boolean isReadOnly) { 43fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes DoubleArrayBuffer buf = new DoubleArrayBuffer(other.capacity(), other.backingArray, other.arrayOffset, isReadOnly); 44fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes buf.limit = other.limit; 45fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes buf.position = other.position(); 46fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes buf.mark = markOfOther; 47fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return buf; 48fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 49fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 50fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public DoubleBuffer asReadOnlyBuffer() { 51fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return copy(this, mark, true); 52fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 53fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 54fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public DoubleBuffer compact() { 55fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (isReadOnly) { 56fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new ReadOnlyBufferException(); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes System.arraycopy(backingArray, position + arrayOffset, backingArray, arrayOffset, remaining()); 59fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes position = limit - position; 60fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes limit = capacity; 61fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes mark = UNSET_MARK; 62fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return this; 63fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 64fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 65fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public DoubleBuffer duplicate() { 66fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return copy(this, mark, isReadOnly); 67fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 68fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 69fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public DoubleBuffer slice() { 70fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return new DoubleArrayBuffer(remaining(), backingArray, arrayOffset + position, isReadOnly); 71fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 73fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public boolean isReadOnly() { 74fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return isReadOnly; 75fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 76fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 77fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override double[] protectedArray() { 78fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (isReadOnly) { 79fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new ReadOnlyBufferException(); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 81fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return backingArray; 82fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 84fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override int protectedArrayOffset() { 85fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (isReadOnly) { 86fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new ReadOnlyBufferException(); 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return arrayOffset; 89fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override boolean protectedHasArray() { 92fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (isReadOnly) { 93fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return false; 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 95fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return true; 96fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 98fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public final double get() { 99fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (position == limit) { 100fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new BufferUnderflowException(); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return backingArray[arrayOffset + position++]; 103fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 104fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 105fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public final double get(int index) { 106fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes checkIndex(index); 107fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return backingArray[arrayOffset + index]; 108fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 110fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public final DoubleBuffer get(double[] dst, int dstOffset, int doubleCount) { 111fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (doubleCount > remaining()) { 112fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new BufferUnderflowException(); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes System.arraycopy(backingArray, arrayOffset + position, dst, dstOffset, doubleCount); 115fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes position += doubleCount; 116fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return this; 117fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 118fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 119fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public final boolean isDirect() { 120fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return false; 121fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 122fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes 123fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public final ByteOrder order() { 124fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return ByteOrder.nativeOrder(); 125fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 126eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson 127fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public DoubleBuffer put(double c) { 128fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (isReadOnly) { 129fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new ReadOnlyBufferException(); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (position == limit) { 132fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new BufferOverflowException(); 133fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 134fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes backingArray[arrayOffset + position++] = c; 135fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return this; 136fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 138fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public DoubleBuffer put(int index, double c) { 139fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (isReadOnly) { 140fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new ReadOnlyBufferException(); 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 142fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes checkIndex(index); 143fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes backingArray[arrayOffset + index] = c; 144fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return this; 145fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 147fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes @Override public DoubleBuffer put(double[] src, int srcOffset, int doubleCount) { 148fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (isReadOnly) { 149fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new ReadOnlyBufferException(); 150fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 151fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (doubleCount > remaining()) { 152fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes throw new BufferOverflowException(); 153fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 154fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes System.arraycopy(src, srcOffset, backingArray, arrayOffset + position, doubleCount); 155fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes position += doubleCount; 156fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return this; 157fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes } 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 159