1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1943a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughesimport libcore.io.SizeOf; 2043a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class wraps a byte buffer to be a double buffer. 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Implementation notice: 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>After a byte buffer instance is wrapped, it becomes privately owned by 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the adapter. It must NOT be accessed outside the adapter any more.</li> 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>The byte buffer's position and limit are NOT linked with the adapter. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The adapter extends Buffer, thus has its own position and limit.</li> 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p> 32f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 34fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughesfinal class ByteBufferAsDoubleBuffer extends DoubleBuffer { 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final ByteBuffer byteBuffer; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 3817b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes static DoubleBuffer asDoubleBuffer(ByteBuffer byteBuffer) { 3917b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes ByteBuffer slice = byteBuffer.slice(); 4017b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes slice.order(byteBuffer.order()); 41fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes return new ByteBufferAsDoubleBuffer(slice); 4217b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes } 4317b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes 44fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes private ByteBufferAsDoubleBuffer(ByteBuffer byteBuffer) { 4543a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes super(byteBuffer.capacity() / SizeOf.DOUBLE); 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.byteBuffer = byteBuffer; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.byteBuffer.clear(); 480440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes this.effectiveDirectAddress = byteBuffer.effectiveDirectAddress; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 50eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson 51eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DoubleBuffer asReadOnlyBuffer() { 53fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes ByteBufferAsDoubleBuffer buf = new ByteBufferAsDoubleBuffer(byteBuffer.asReadOnlyBuffer()); 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.limit = limit; 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.position = position; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.mark = mark; 570c0934430f2cdd830b54eacf518355057f3567f3Elliott Hughes buf.byteBuffer.order = byteBuffer.order; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buf; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DoubleBuffer compact() { 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (byteBuffer.isReadOnly()) { 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new ReadOnlyBufferException(); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 6643a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.limit(limit * SizeOf.DOUBLE); 6743a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.position(position * SizeOf.DOUBLE); 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byteBuffer.compact(); 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byteBuffer.clear(); 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = limit - position; 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project limit = capacity; 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mark = UNSET_MARK; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DoubleBuffer duplicate() { 78eebf863ca5c8a7497f92602fe9ea3d1282c8bdedElliott Hughes ByteBuffer bb = byteBuffer.duplicate().order(byteBuffer.order()); 79fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes ByteBufferAsDoubleBuffer buf = new ByteBufferAsDoubleBuffer(bb); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.limit = limit; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.position = position; 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project buf.mark = mark; 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return buf; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 86eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public double get() { 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (position == limit) { 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 9143a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes return byteBuffer.getDouble(position++ * SizeOf.DOUBLE); 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 94eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public double get(int index) { 9686f5f3e0e2bd808e4c85b0563ae50f17b7d48309Elliott Hughes checkIndex(index); 9743a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes return byteBuffer.getDouble(index * SizeOf.DOUBLE); 98961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes } 99961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes 100961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes @Override 101961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes public DoubleBuffer get(double[] dst, int dstOffset, int doubleCount) { 10243a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.limit(limit * SizeOf.DOUBLE); 10343a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.position(position * SizeOf.DOUBLE); 104961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes if (byteBuffer instanceof DirectByteBuffer) { 105961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes ((DirectByteBuffer) byteBuffer).get(dst, dstOffset, doubleCount); 106961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes } else { 107fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes ((ByteArrayBuffer) byteBuffer).get(dst, dstOffset, doubleCount); 108961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes } 1096944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes this.position += doubleCount; 1106944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes return this; 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isDirect() { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return byteBuffer.isDirect(); 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isReadOnly() { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return byteBuffer.isReadOnly(); 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 123eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ByteOrder order() { 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return byteBuffer.order(); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 128bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes @Override double[] protectedArray() { 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes @Override int protectedArrayOffset() { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 136bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes @Override boolean protectedHasArray() { 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DoubleBuffer put(double c) { 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (position == limit) { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferOverflowException(); 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 14543a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.putDouble(position++ * SizeOf.DOUBLE, c); 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 149eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DoubleBuffer put(int index, double c) { 151a1603838fe9e865575c87982e32c6343740e464cElliott Hughes checkIndex(index); 15243a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.putDouble(index * SizeOf.DOUBLE, c); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 156eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 1570e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes public DoubleBuffer put(double[] src, int srcOffset, int doubleCount) { 15843a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.limit(limit * SizeOf.DOUBLE); 15943a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.position(position * SizeOf.DOUBLE); 160fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes if (byteBuffer instanceof DirectByteBuffer) { 161fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes ((DirectByteBuffer) byteBuffer).put(src, srcOffset, doubleCount); 162692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes } else { 163fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes ((ByteArrayBuffer) byteBuffer).put(src, srcOffset, doubleCount); 164692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes } 1658fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes this.position += doubleCount; 1668fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes return this; 167692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes } 168692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes 169692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes @Override 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DoubleBuffer slice() { 17143a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.limit(limit * SizeOf.DOUBLE); 17243a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes byteBuffer.position(position * SizeOf.DOUBLE); 173eebf863ca5c8a7497f92602fe9ea3d1282c8bdedElliott Hughes ByteBuffer bb = byteBuffer.slice().order(byteBuffer.order()); 174fe5da19e0e366286cd4d95f7628fe9442b9062c8Elliott Hughes DoubleBuffer result = new ByteBufferAsDoubleBuffer(bb); 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byteBuffer.clear(); 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 180