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
19f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughesimport libcore.io.Memory;
2043a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughesimport libcore.io.SizeOf;
218fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * HeapByteBuffer, ReadWriteHeapByteBuffer and ReadOnlyHeapByteBuffer compose
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the implementation of array based byte buffers.
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ReadWriteHeapByteBuffer extends HeapByteBuffer with all the write methods.
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is marked final for runtime performance.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
31f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectfinal class ReadWriteHeapByteBuffer extends HeapByteBuffer {
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static ReadWriteHeapByteBuffer copy(HeapByteBuffer other, int markOfOther) {
3617b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes        ReadWriteHeapByteBuffer buf =
3717b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes                new ReadWriteHeapByteBuffer(other.backingArray, 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
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ReadWriteHeapByteBuffer(byte[] backingArray) {
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(backingArray);
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ReadWriteHeapByteBuffer(int capacity) {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(capacity);
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ReadWriteHeapByteBuffer(byte[] backingArray, int capacity, int arrayOffset) {
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(backingArray, capacity, arrayOffset);
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer asReadOnlyBuffer() {
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ReadOnlyHeapByteBuffer.copy(this, mark);
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer compact() {
6329dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes        System.arraycopy(backingArray, position + offset, backingArray, offset, remaining());
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = limit - position;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        limit = capacity;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mark = UNSET_MARK;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer duplicate() {
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return copy(this, mark);
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
75eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isReadOnly() {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
80bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override byte[] protectedArray() {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return backingArray;
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
84bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override int protectedArrayOffset() {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return offset;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override boolean protectedHasArray() {
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer put(byte b) {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (position == limit) {
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        backingArray[offset + position++] = b;
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
101eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer put(int index, byte b) {
103a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index);
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        backingArray[offset + index] = b;
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
108eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
1090e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes    public ByteBuffer put(byte[] src, int srcOffset, int byteCount) {
1108fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        checkPutBounds(1, src.length, srcOffset, byteCount);
1110e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        System.arraycopy(src, srcOffset, backingArray, offset + position, byteCount);
1120e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        position += byteCount;
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
115eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson
1168fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    final void put(char[] src, int srcOffset, int charCount) {
11743a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.CHAR, src.length, srcOffset, charCount);
118f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.unsafeBulkPut(backingArray, offset + position, byteCount, src, srcOffset, SizeOf.CHAR, order.needsSwap);
1198fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        position += byteCount;
1208fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    }
1218fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes
1228fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    final void put(double[] src, int srcOffset, int doubleCount) {
12343a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.DOUBLE, src.length, srcOffset, doubleCount);
124f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.unsafeBulkPut(backingArray, offset + position, byteCount, src, srcOffset, SizeOf.DOUBLE, order.needsSwap);
1258fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        position += byteCount;
1268fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    }
1278fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes
1288fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    final void put(float[] src, int srcOffset, int floatCount) {
12943a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.FLOAT, src.length, srcOffset, floatCount);
130f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.unsafeBulkPut(backingArray, offset + position, byteCount, src, srcOffset, SizeOf.FLOAT, order.needsSwap);
1318fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        position += byteCount;
1328fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    }
1338fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes
1348fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    final void put(int[] src, int srcOffset, int intCount) {
13543a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.INT, src.length, srcOffset, intCount);
136f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.unsafeBulkPut(backingArray, offset + position, byteCount, src, srcOffset, SizeOf.INT, order.needsSwap);
1378fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        position += byteCount;
1388fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    }
1398fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes
1408fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    final void put(long[] src, int srcOffset, int longCount) {
14143a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.LONG, src.length, srcOffset, longCount);
142f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.unsafeBulkPut(backingArray, offset + position, byteCount, src, srcOffset, SizeOf.LONG, order.needsSwap);
1438fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        position += byteCount;
1448fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    }
1458fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes
1468fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    final void put(short[] src, int srcOffset, int shortCount) {
14743a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int byteCount = checkPutBounds(SizeOf.SHORT, src.length, srcOffset, shortCount);
148f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.unsafeBulkPut(backingArray, offset + position, byteCount, src, srcOffset, SizeOf.SHORT, order.needsSwap);
1498fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes        position += byteCount;
1508fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes    }
1518fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes
152eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
1530bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    public ByteBuffer putChar(int index, char value) {
154a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.CHAR);
155f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeShort(backingArray, offset + index, (short) value, order);
1560bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        return this;
1570bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    }
1580bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes
1590bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    @Override
1600bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    public ByteBuffer putChar(char value) {
16143a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.CHAR;
1620bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        if (newPosition > limit) {
1630bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes            throw new BufferOverflowException();
1640bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        }
165f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeShort(backingArray, offset + position, (short) value, order);
1660bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        position = newPosition;
1670bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        return this;
1680bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    }
1690bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes
1700bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes    @Override
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putDouble(double value) {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return putLong(Double.doubleToRawLongBits(value));
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putDouble(int index, double value) {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return putLong(index, Double.doubleToRawLongBits(value));
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
180eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putFloat(float value) {
1820bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        return putInt(Float.floatToRawIntBits(value));
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
185eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putFloat(int index, float value) {
1870bc30ae8420b5b1abc1b2eefbdf8846309b5447dElliott Hughes        return putInt(index, Float.floatToRawIntBits(value));
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putInt(int value) {
19243a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.INT;
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
196f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeInt(backingArray, offset + position, value, order);
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putInt(int index, int value) {
203a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.INT);
204f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeInt(backingArray, offset + index, value, order);
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
208eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putLong(int index, long value) {
210a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.LONG);
211f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeLong(backingArray, offset + index, value, order);
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
215eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putLong(long value) {
21743a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.LONG;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
221f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeLong(backingArray, offset + position, value, order);
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
226eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putShort(int index, short value) {
228a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index, SizeOf.SHORT);
229f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeShort(backingArray, offset + index, value, order);
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer putShort(short value) {
23543a9f774d075e0e441d8b996e3f6c81ea483ec89Elliott Hughes        int newPosition = position + SizeOf.SHORT;
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (newPosition > limit) {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferOverflowException();
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
239f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeShort(backingArray, offset + position, value, order);
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
244eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteBuffer slice() {
24617b2f493468764dc1f237c02d94747d122dbd101Elliott Hughes        return new ReadWriteHeapByteBuffer(backingArray, remaining(), offset + position);
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
249