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
2043a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughesimport libcore.io.SizeOf;
21f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughesimport libcore.io.Memory;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DirectByteBuffer, ReadWriteDirectByteBuffer and ReadOnlyDirectByteBuffer
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * compose the implementation of platform memory based byte buffers.
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ReadWriteDirectByteBuffer extends DirectByteBuffer with all the write
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * methods.
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is marked final for runtime performance.
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectfinal class ReadWriteDirectByteBuffer extends DirectByteBuffer {
354940ff34c242c7907f548e6eb7b1680d7d53fbc7Elliott Hughes    static ReadWriteDirectByteBuffer copy(DirectByteBuffer other, int markOfOther) {
3617b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes        ReadWriteDirectByteBuffer buf =
3717b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes                new ReadWriteDirectByteBuffer(other.block, other.capacity(), other.offset);
380c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes        buf.limit = other.limit;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.position = other.position();
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.mark = markOfOther;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buf;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
4429dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes    // Used by ByteBuffer.allocateDirect.
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ReadWriteDirectByteBuffer(int capacity) {
4627c11c7c7b1fc023cb6464bd551aceef300e39b6Elliott Hughes        super(MemoryBlock.allocate(capacity), capacity, 0);
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
494d68282a79fb0417f43efdef41b9a920385bddedElliott Hughes    // Used by the JNI NewDirectByteBuffer function.
50040bb9d72f4a406a40f40e198857a8a27e3de688Elliott Hughes    ReadWriteDirectByteBuffer(int address, int capacity) {
51eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        super(MemoryBlock.wrapFromJni(address, capacity), capacity, 0);
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes    ReadWriteDirectByteBuffer(MemoryBlock block, int capacity, int offset) {
55eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        super(block, capacity, offset);
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer asReadOnlyBuffer() {
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ReadOnlyDirectByteBuffer.copy(this, mark);
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer compact() {
650568a63ba1086a78ffb4cff68dd2eac4f9908e13Elliott Hughes        Memory.memmove(this, 0, this, position, remaining());
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = limit - position;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        limit = capacity;
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mark = UNSET_MARK;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer duplicate() {
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return copy(this, mark);
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isReadOnly() {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer put(byte value) {
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (position == limit) {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
87eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        this.block.pokeByte(offset + position++, value);
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer put(int index, byte value) {
93a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index);
94eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        this.block.pokeByte(offset + index, value);
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
990e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes    public ByteBuffer put(byte[] src, int srcOffset, int byteCount) {
1008fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        checkPutBounds(1, src.length, srcOffset, byteCount);
1010e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        this.block.pokeByteArray(offset + position, src, srcOffset, byteCount);
1020e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        position += byteCount;
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
105eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson
106961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes    final void put(char[] src, int srcOffset, int charCount) {
10743a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.CHAR, src.length, srcOffset, charCount);
1080e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        this.block.pokeCharArray(offset + position, src, srcOffset, charCount, order.needsSwap);
10929dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes        position += byteCount;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes    final void put(double[] src, int srcOffset, int doubleCount) {
11343a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.DOUBLE, src.length, srcOffset, doubleCount);
1140e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        this.block.pokeDoubleArray(offset + position, src, srcOffset, doubleCount, order.needsSwap);
11529dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes        position += byteCount;
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
117bfb0099cc4c8eca744eeda0f20e5b3644f1a4cb9Owen Lin
118961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes    final void put(float[] src, int srcOffset, int floatCount) {
11943a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.FLOAT, src.length, srcOffset, floatCount);
1200e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        this.block.pokeFloatArray(offset + position, src, srcOffset, floatCount, order.needsSwap);
12129dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes        position += byteCount;
122bfb0099cc4c8eca744eeda0f20e5b3644f1a4cb9Owen Lin    }
123eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson
124961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes    final void put(int[] src, int srcOffset, int intCount) {
12543a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.INT, src.length, srcOffset, intCount);
1260e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        this.block.pokeIntArray(offset + position, src, srcOffset, intCount, order.needsSwap);
127692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes        position += byteCount;
128692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes    }
129692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes
130961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes    final void put(long[] src, int srcOffset, int longCount) {
13143a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.LONG, src.length, srcOffset, longCount);
1320e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        this.block.pokeLongArray(offset + position, src, srcOffset, longCount, order.needsSwap);
133692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes        position += byteCount;
134692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes    }
135692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes
136961da1e7487bdb8ad8ac226d4f2789d003aa87b9Elliott Hughes    final void put(short[] src, int srcOffset, int shortCount) {
13743a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.SHORT, src.length, srcOffset, shortCount);
1380e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        this.block.pokeShortArray(offset + position, src, srcOffset, shortCount, order.needsSwap);
139692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes        position += byteCount;
140692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes    }
141692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes
142eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
1430bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    public ByteBuffer putChar(char value) {
14443a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.CHAR;
1450bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        if (newPosition > limit) {
1460bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes            throw new BufferOverflowException();
1470bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        }
1480bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        this.block.pokeShort(offset + position, (short) value, order);
1490bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        position = newPosition;
1500bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        return this;
1510bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    }
1520bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes
1530bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    @Override
1540bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    public ByteBuffer putChar(int index, char value) {
155a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.CHAR);
1560bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        this.block.pokeShort(offset + index, (short) value, order);
1570bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        return this;
1580bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    }
1590bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes
1600bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    @Override
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putDouble(double value) {
16243a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.DOUBLE;
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1660bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        this.block.pokeLong(offset + position, Double.doubleToRawLongBits(value), order);
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
171eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putDouble(int index, double value) {
173a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.DOUBLE);
1740bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        this.block.pokeLong(offset + index, Double.doubleToRawLongBits(value), order);
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
178eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putFloat(float value) {
18043a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.FLOAT;
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1840bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        this.block.pokeInt(offset + position, Float.floatToRawIntBits(value), order);
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
189eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putFloat(int index, float value) {
191a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.FLOAT);
1920bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        this.block.pokeInt(offset + index, Float.floatToRawIntBits(value), order);
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
196eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putInt(int value) {
19843a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.INT;
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
202eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        this.block.pokeInt(offset + position, value, order);
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
207eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putInt(int index, int value) {
209a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.INT);
210eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        this.block.pokeInt(offset + index, value, order);
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
214eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putLong(long value) {
21643a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.LONG;
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
220eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        this.block.pokeLong(offset + position, value, order);
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
225eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putLong(int index, long value) {
227a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.LONG);
228eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        this.block.pokeLong(offset + index, value, order);
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
232eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putShort(short value) {
23443a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.SHORT;
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
238eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        this.block.pokeShort(offset + position, value, order);
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putShort(int index, short value) {
245a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.SHORT);
246eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes        this.block.pokeShort(offset + index, value, order);
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
250eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer slice() {
25217b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes        return new ReadWriteDirectByteBuffer(block, remaining(), offset + position);
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
256