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
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
208510524dab13e0acc1babf22cbc55002fb122777Elliott Hughesimport java.nio.channels.FileChannel.MapMode;
2143a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughesimport libcore.io.SizeOf;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238510524dab13e0acc1babf22cbc55002fb122777Elliott Hughes/**
24dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes * Rather than duplicate all the code from ReadOnlyDirectByteBuffer and
25dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes * ReadWriteDirectByteBuffer (and their superclasses), we delegate to one or the other.
26dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes * The tricky part is that we need to keep our fields in sync with our delegate's fields.
27dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes * There are lots of methods that access the fields directly.
28dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes *
295a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * The main consequences of this implementation are:
305a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes *
315a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * 1. we need to explicitly call wrapped.position(int) before any operation on our delegate
325a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * that makes use of the implicit position.
335a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes *
345a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * 2. we need to explicitly update position after any operation on our delegate that makes
355a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * use of the implicit position.
365a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes *
375a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * This means that, even more than usual, the implicit iteration
38dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes * operations are more expensive than the indexed operations.
39dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes *
40dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes * But we save a ton of code, for classes that no-one really uses because the API's broken
41dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes * by design (disallowing munmap(2) calls). Internally, we can use libcore.io.MemoryMappedFile
42dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes * as a high-performance and more usable replacement for MappedByteBuffer.
435a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes *
445a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * FIXME: harmony changed their implementation after we diverged, switching to a scheme
455a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * where DirectByteBuffer extends MappedByteBuffer and this class doesn't exist. That's
465a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes * much better than their original implementation, fossilized here.
478510524dab13e0acc1babf22cbc55002fb122777Elliott Hughes */
48ae704b984c10a63883cc366e823d53902d6ac7a9Elliott Hughesfinal class MappedByteBufferAdapter extends MappedByteBuffer {
49c73a5be50cdd804ff3c12e7b43da08c33cdd6f21Elliott Hughes    private MappedByteBufferAdapter(ByteBuffer buffer) {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(buffer);
510c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        effectiveDirectAddress = wrapped.effectiveDirectAddress;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes    public MappedByteBufferAdapter(MemoryBlock block, int capacity, int offset, MapMode mode) {
55eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        super(block, capacity, offset, mode);
560c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        effectiveDirectAddress = wrapped.effectiveDirectAddress;
570c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    }
580c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes
590c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    @Override void limitImpl(int newLimit) {
600c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        super.limitImpl(newLimit);
610c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.limit(newLimit);
620c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    }
630c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes
640c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    @Override void positionImpl(int newPosition) {
650c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        super.positionImpl(newPosition);
660c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(newPosition);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharBuffer asCharBuffer() {
710c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.asCharBuffer();
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DoubleBuffer asDoubleBuffer() {
760c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.asDoubleBuffer();
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public FloatBuffer asFloatBuffer() {
810c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.asFloatBuffer();
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
84eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public IntBuffer asIntBuffer() {
860c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.asIntBuffer();
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
89eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public LongBuffer asLongBuffer() {
910c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.asLongBuffer();
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer asReadOnlyBuffer() {
96dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        MappedByteBufferAdapter result = new MappedByteBufferAdapter(wrapped.asReadOnlyBuffer());
97dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        result.limit(limit);
98dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        result.position(position);
99dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        result.mark = mark;
100dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        return result;
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
103eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ShortBuffer asShortBuffer() {
1050c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.asShortBuffer();
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
108eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer compact() {
1100c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        if (wrapped.isReadOnly()) {
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new ReadOnlyBufferException();
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1130c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.compact();
114dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        limit(capacity);
115dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        position(wrapped.position());
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.mark = UNSET_MARK;
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
120eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer duplicate() {
122dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        MappedByteBufferAdapter result = new MappedByteBufferAdapter(wrapped.duplicate());
123dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        result.limit(limit);
124dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        result.position(position);
125dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        result.mark = mark;
126dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        return result;
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
129eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte get() {
131dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        wrapped.position(position);
1320c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        byte result = wrapped.get();
1330c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        ++position;
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte get(int index) {
1390c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.get(index);
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
143f714d3767875c96c5122683ef8c75cc9d5f1259fElliott Hughes    public ByteBuffer get(byte[] dst, int dstOffset, int byteCount) {
1445a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes        ByteBuffer result = wrapped.get(dst, dstOffset, byteCount);
1455a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes        position += byteCount;
1465a1e8cc38e1cc6c3f2fc66f039ca0fc5309a0dc3Elliott Hughes        return result;
147f714d3767875c96c5122683ef8c75cc9d5f1259fElliott Hughes    }
148f714d3767875c96c5122683ef8c75cc9d5f1259fElliott Hughes
149f714d3767875c96c5122683ef8c75cc9d5f1259fElliott Hughes    @Override
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char getChar() {
151dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        wrapped.position(position);
1520c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        char result = wrapped.getChar();
15343a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        position += SizeOf.CHAR;
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
157eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char getChar(int index) {
1590c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.getChar(index);
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
162eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double getDouble() {
164dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        wrapped.position(position);
1650c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        double result = wrapped.getDouble();
16643a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        position += SizeOf.DOUBLE;
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
170eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double getDouble(int index) {
1720c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.getDouble(index);
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float getFloat() {
177dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        wrapped.position(position);
1780c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        float result = wrapped.getFloat();
17943a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        position += SizeOf.FLOAT;
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
183eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float getFloat(int index) {
1850c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.getFloat(index);
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getInt() {
190dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        wrapped.position(position);
1910c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        int result = wrapped.getInt();
19243a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        position += SizeOf.INT;
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
196eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getInt(int index) {
1980c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.getInt(index);
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getLong() {
203dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        wrapped.position(position);
2040c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        long result = wrapped.getLong();
20543a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        position += SizeOf.LONG;
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
209eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getLong(int index) {
2110c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.getLong(index);
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
214eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short getShort() {
216dbb973b7f1dc6d3e86c6f9528a2aadff1e01c0cbElliott Hughes        wrapped.position(position);
2170c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        short result = wrapped.getShort();
21843a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        position += SizeOf.SHORT;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short getShort(int index) {
2240c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.getShort(index);
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isDirect() {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
232eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isReadOnly() {
2340c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.isReadOnly();
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2370c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes    @Override void orderImpl(ByteOrder byteOrder) {
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super.orderImpl(byteOrder);
2390c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.order(byteOrder);
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
242eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer put(byte b) {
2440c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
2450c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.put(b);
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.position++;
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
250eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
2510e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes    public ByteBuffer put(byte[] src, int srcOffset, int byteCount) {
2520c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
2530e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        wrapped.put(src, srcOffset, byteCount);
2540e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        this.position += byteCount;
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer put(int index, byte b) {
2600c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
2610c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.put(index, b);
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
265eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putChar(char value) {
2670c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
2680c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putChar(value);
26943a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        this.position += SizeOf.CHAR;
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putChar(int index, char value) {
2750c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
2760c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putChar(index, value);
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putDouble(double value) {
2820c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
2830c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putDouble(value);
28443a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        this.position += SizeOf.DOUBLE;
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
288eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putDouble(int index, double value) {
2900c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
2910c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putDouble(index, value);
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
295eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putFloat(float value) {
2970c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
2980c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putFloat(value);
29943a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        this.position += SizeOf.FLOAT;
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
303eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putFloat(int index, float value) {
3050c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
3060c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putFloat(index, value);
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
310eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putInt(int index, int value) {
3120c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
3130c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putInt(index, value);
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
317eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putInt(int value) {
3190c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
3200c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putInt(value);
32143a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        this.position += SizeOf.INT;
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
325eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putLong(int index, long value) {
3270c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
3280c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putLong(index, value);
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
332eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putLong(long value) {
3340c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
3350c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putLong(value);
33643a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        this.position += SizeOf.LONG;
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
340eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putShort(int index, short value) {
3420c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
3430c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putShort(index, value);
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
347eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putShort(short value) {
3490c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
3500c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.putShort(value);
35143a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        this.position += SizeOf.SHORT;
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
355eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer slice() {
3570c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.position(this.position);
3580c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        MappedByteBufferAdapter result = new MappedByteBufferAdapter(wrapped.slice());
3590c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.clear();
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
363bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override byte[] protectedArray() {
3640c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.protectedArray();
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
367bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override int protectedArrayOffset() {
3680c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.protectedArrayOffset();
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
371bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override boolean protectedHasArray() {
3720c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        return wrapped.protectedHasArray();
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
375c3c38fbbccaf428200acdd819b1f7799edac54d2Elliott Hughes    public final void free() {
3760c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        wrapped.free();
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
379