1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.nio;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A buffer of chars.
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A char buffer can be created in either one of the following ways:
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ul>
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>{@link #allocate(int) Allocate} a new char array and create a buffer
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * based on it;</li>
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>{@link #wrap(char[]) Wrap} an existing char array to create a new
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * buffer;</li>
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>{@link #wrap(CharSequence) Wrap} an existing char sequence to create a
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * new buffer;</li>
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>Use {@link java.nio.ByteBuffer#asCharBuffer() ByteBuffer.asCharBuffer}
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to create a char buffer based on a byte buffer.</li>
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ul>
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
37d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilsonpublic abstract class CharBuffer extends Buffer implements
38d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        Comparable<CharBuffer>, CharSequence, Appendable, Readable {
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a char buffer based on a newly allocated char array.
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param capacity
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the capacity of the new buffer.
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the created char buffer.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if {@code capacity} is less than zero.
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CharBuffer allocate(int capacity) {
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (capacity < 0) {
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException();
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return BufferFactory.newCharBuffer(capacity);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new char buffer by wrapping the given char array.
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calling this method has the same effect as
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code wrap(array, 0, array.length)}.
61d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param array
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the char array which the new buffer will be based on.
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the created char buffer.
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CharBuffer wrap(char[] array) {
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return wrap(array, 0, array.length);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new char buffer by wrapping the given char array.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer's position will be {@code start}, limit will be
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code start + len}, capacity will be the length of the array.
75d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param array
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the char array which the new buffer will be based on.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param start
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the start index, must not be negative and not greater than
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code array.length}.
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param len
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the length, must not be negative and not greater than
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code array.length - start}.
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the created char buffer.
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if either {@code start} or {@code len} is invalid.
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CharBuffer wrap(char[] array, int start, int len) {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int length = array.length;
90d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if ((start < 0) || (len < 0) || (long) start + (long) len > length) {
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CharBuffer buf = BufferFactory.newCharBuffer(array);
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.position = start;
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.limit = start + len;
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return buf;
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new char buffer by wrapping the given char sequence.
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calling this method has the same effect as
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code wrap(chseq, 0, chseq.length())}.
106d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param chseq
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the char sequence which the new buffer will be based on.
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the created char buffer.
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CharBuffer wrap(CharSequence chseq) {
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return BufferFactory.newCharBuffer(chseq);
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new char buffer by wrapping the given char sequence.
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer's position will be {@code start}, limit will be
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code end}, capacity will be the length of the char sequence. The new
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer is read-only.
121d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param chseq
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the char sequence which the new buffer will be based on.
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param start
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the start index, must not be negative and not greater than
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code chseq.length()}.
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param end
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the end index, must be no less than {@code start} and no
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            greater than {@code chseq.length()}.
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the created char buffer.
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if either {@code start} or {@code end} is invalid.
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CharBuffer wrap(CharSequence chseq, int start, int end) {
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (chseq == null) {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (start < 0 || end < start || end > chseq.length()) {
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
141d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CharBuffer result = BufferFactory.newCharBuffer(chseq);
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.position = start;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.limit = end;
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs a {@code CharBuffer} with given capacity.
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param capacity
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the capacity of the buffer.
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    CharBuffer(int capacity) {
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(capacity);
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // BEGIN android-added
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        _elementSizeShift = 1;
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // END android-added
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the char array which this buffer is based on, if there is one.
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the char array which this buffer is based on.
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if this buffer is based on an array, but it is read-only.
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception UnsupportedOperationException
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if this buffer is not based on an array.
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final char[] array() {
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return protectedArray();
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the offset of the char array which this buffer is based on, if
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * there is one.
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The offset is the index of the array corresponds to the zero position of
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the buffer.
180d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the offset of the char array which this buffer is based on.
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if this buffer is based on an array but it is read-only.
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception UnsupportedOperationException
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if this buffer is not based on an array.
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int arrayOffset() {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return protectedArrayOffset();
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // BEGIN android-added
192d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Object _array() {
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (hasArray()) {
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return array();
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int _arrayOffset() {
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (hasArray()) {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return arrayOffset();
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 0;
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // END android-added
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a read-only buffer that shares its content with this buffer.
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The returned buffer is guaranteed to be a new instance, even if this
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer is read-only itself. The new buffer's position, limit, capacity
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and mark are the same as this buffer's.
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer shares its content with this buffer, which means this
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer's change of content will be visible to the new buffer. The two
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer's position, limit and mark are independent.
219d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a read-only version of this buffer.
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract CharBuffer asReadOnlyBuffer();
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the character located at the specified index in the buffer. The
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * index value is referenced from the current buffer position.
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index referenced from the current buffer position. It must
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            not be less than zero but less than the value obtained from a
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            call to {@code remaining()}.
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the character located at the specified index (referenced from the
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         current position) in the buffer.
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the index is invalid.
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final char charAt(int index) {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index < 0 || index >= remaining()) {
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return get(position + index);
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compacts this char buffer.
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The remaining chars will be moved to the head of the buffer,
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * starting from position zero. Then the position is set to
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code remaining()}; the limit is set to capacity; the mark is cleared.
250d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract CharBuffer compact();
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare the remaining chars of this buffer to another char
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer's remaining chars.
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param otherBuffer
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            another char buffer.
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a negative value if this is less than {@code otherBuffer}; 0 if
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         this equals to {@code otherBuffer}; a positive value if this is
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         greater than {@code otherBuffer}.
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ClassCastException
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code otherBuffer} is not a char buffer.
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int compareTo(CharBuffer otherBuffer) {
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int compareRemaining = (remaining() < otherBuffer.remaining()) ? remaining()
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                : otherBuffer.remaining();
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int thisPos = position;
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int otherPos = otherBuffer.position;
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        char thisByte, otherByte;
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (compareRemaining > 0) {
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            thisByte = get(thisPos);
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            otherByte = otherBuffer.get(otherPos);
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (thisByte != otherByte) {
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return thisByte < otherByte ? -1 : 1;
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            thisPos++;
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            otherPos++;
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            compareRemaining--;
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return remaining() - otherBuffer.remaining();
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a duplicated buffer that shares its content with this buffer.
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The duplicated buffer's initial position, limit, capacity and mark are
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the same as this buffer's. The duplicated buffer's read-only property and
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * byte order are the same as this buffer's, too.
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer shares its content with this buffer, which means either
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer's change of content will be visible to the other. The two buffer's
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * position, limit and mark are independent.
298d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a duplicated buffer that shares its content with this buffer.
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract CharBuffer duplicate();
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Checks whether this char buffer is equal to another object.
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If {@code other} is not a char buffer then {@code false} is returned. Two
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * char buffers are equal if and only if their remaining chars are exactly
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the same. Position, limit, capacity and mark are not considered.
309d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param other
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the object to compare with this char buffer.
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this char buffer is equal to {@code other},
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         {@code false} otherwise.
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
315d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object other) {
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(other instanceof CharBuffer)) {
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CharBuffer otherBuffer = (CharBuffer) other;
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (remaining() != otherBuffer.remaining()) {
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int myPosition = position;
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int otherPosition = otherBuffer.position;
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean equalSoFar = true;
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (equalSoFar && (myPosition < limit)) {
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            equalSoFar = get(myPosition++) == otherBuffer.get(otherPosition++);
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return equalSoFar;
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the char at the current position and increases the position by 1.
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the char at the current position.
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferUnderflowException
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if the position is equal or greater than limit.
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract char get();
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads chars from the current position into the specified char array and
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * increases the position by the number of chars read.
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calling this method has the same effect as
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code get(dest, 0, dest.length)}.
351d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param dest
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the destination char array.
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferUnderflowException
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code dest.length} is greater than {@code remaining()}.
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer get(char[] dest) {
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return get(dest, 0, dest.length);
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads chars from the current position into the specified char array,
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * starting from the specified offset, and increases the position by the
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of chars read.
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param dest
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the target char array.
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param off
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the offset of the char array, must not be negative and not
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            greater than {@code dest.length}.
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param len
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            The number of chars to read, must be no less than zero and no
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            greater than {@code dest.length - off}.
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if either {@code off} or {@code len} is invalid.
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferUnderflowException
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code len} is greater than {@code remaining()}.
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer get(char[] dest, int off, int len) {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int length = dest.length;
383d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if ((off < 0) || (len < 0) || (long) off + (long) len > length) {
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
386d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (len > remaining()) {
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new BufferUnderflowException();
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = off; i < off + len; i++) {
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            dest[i] = get();
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a char at the specified index; the position is not changed.
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index, must not be negative and less than limit.
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a char at the specified index.
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if index is invalid.
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract char get(int index);
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Indicates whether this buffer is based on a char array and is read/write.
409d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this buffer is based on a byte array and provides
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         read/write access, {@code false} otherwise.
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final boolean hasArray() {
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return protectedHasArray();
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calculates this buffer's hash code from the remaining chars. The
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * position, limit, capacity and mark don't affect the hash code.
420d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the hash code calculated from the remaining chars.
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
423d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int myPosition = position;
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int hash = 0;
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (myPosition < limit) {
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            hash = hash + get(myPosition++);
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hash;
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Indicates whether this buffer is direct. A direct buffer will try its
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * best to take advantage of native memory APIs and it may not stay in the
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Java heap, so it is not affected by garbage collection.
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * A char buffer is direct if it is based on a byte buffer and the byte
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer is direct.
440d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this buffer is direct, {@code false} otherwise.
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract boolean isDirect();
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the number of remaining chars.
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of remaining chars.
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int length() {
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return remaining();
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the byte order used by this buffer when converting chars from/to
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * bytes.
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If this buffer is not based on a byte buffer, then this always returns
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the platform's native byte order.
460d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the byte order used by this buffer when converting chars from/to
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         bytes.
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract ByteOrder order();
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Child class implements this method to realize {@code array()}.
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #array()
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    abstract char[] protectedArray();
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Child class implements this method to realize {@code arrayOffset()}.
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #arrayOffset()
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    abstract int protectedArrayOffset();
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Child class implements this method to realize {@code hasArray()}.
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #hasArray()
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    abstract boolean protectedHasArray();
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes the given char to the current position and increases the position
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * by 1.
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the char to write.
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if position is equal or greater than limit.
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract CharBuffer put(char c);
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes chars from the given char array to the current position and
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * increases the position by the number of chars written.
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calling this method has the same effect as
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code put(src, 0, src.length)}.
507d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param src
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the source char array.
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code remaining()} is less than {@code src.length}.
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final CharBuffer put(char[] src) {
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return put(src, 0, src.length);
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes chars from the given char array, starting from the specified offset,
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to the current position and increases the position by the number of chars
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * written.
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param src
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the source char array.
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param off
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the offset of char array, must not be negative and not greater
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            than {@code src.length}.
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param len
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the number of chars to write, must be no less than zero and no
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            greater than {@code src.length - off}.
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code remaining()} is less than {@code len}.
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if either {@code off} or {@code len} is invalid.
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer put(char[] src, int off, int len) {
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int length = src.length;
543d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if ((off < 0) || (len < 0) || (long) off + (long) len > length) {
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
546d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (len > remaining()) {
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new BufferOverflowException();
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = off; i < off + len; i++) {
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            put(src[i]);
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes all the remaining chars of the {@code src} char buffer to this
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer's current position, and increases both buffers' position by the
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of chars copied.
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param src
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the source char buffer.
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code src.remaining()} is greater than this buffer's
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                {@code remaining()}.
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IllegalArgumentException
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code src} is this buffer.
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer put(CharBuffer src) {
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (src == this) {
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException();
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (src.remaining() > remaining()) {
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new BufferOverflowException();
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
579d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        char[] contents = new char[src.remaining()];
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        src.get(contents);
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        put(contents);
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes a char to the specified index of this buffer; the position is not
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * changed.
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index, must be no less than zero and less than the limit.
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the char to write.
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if index is invalid.
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract CharBuffer put(int index, char c);
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes all chars of the given string to the current position of this
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer, and increases the position by the length of string.
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calling this method has the same effect as
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code put(str, 0, str.length())}.
608d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param str
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the string to write.
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code remaining()} is less than the length of string.
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final CharBuffer put(String str) {
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return put(str, 0, str.length());
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes chars of the given string to the current position of this buffer,
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and increases the position by the number of chars written.
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param str
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the string to write.
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param start
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the first char to write, must not be negative and not greater
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            than {@code str.length()}.
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param end
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the last char to write (excluding), must be less than
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code start} and not greater than {@code str.length()}.
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code remaining()} is less than {@code end - start}.
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if either {@code start} or {@code end} is invalid.
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer put(String str, int start, int end) {
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int length = str.length();
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (start < 0 || end < start || end > length) {
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
646d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (end - start > remaining()) {
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new BufferOverflowException();
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = start; i < end; i++) {
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            put(str.charAt(i));
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a sliced buffer that shares its content with this buffer.
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The sliced buffer's capacity will be this buffer's {@code remaining()},
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and its zero position will correspond to this buffer's current position.
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer's position will be 0, limit will be its capacity, and its
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * mark is cleared. The new buffer's read-only property and byte order are
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * same as this buffer.
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer shares its content with this buffer, which means either
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer's change of content will be visible to the other. The two buffer's
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * position, limit and mark are independent.
668d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a sliced buffer that shares its content with this buffer.
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract CharBuffer slice();
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a new char buffer representing a sub-sequence of this buffer's
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * current remaining content.
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer's position will be {@code position() + start}, limit will
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be {@code position() + end}, capacity will be the same as this buffer.
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer's read-only property and byte order are the same as this
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer.
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The new buffer shares its content with this buffer, which means either
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * buffer's change of content will be visible to the other. The two buffer's
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * position, limit and mark are independent.
685d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param start
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the start index of the sub-sequence, referenced from the
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            current buffer position. Must not be less than zero and not
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            greater than the value obtained from a call to
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code remaining()}.
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param end
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the end index of the sub-sequence, referenced from the current
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            buffer position. Must not be less than {@code start} and not
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            be greater than the value obtained from a call to
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code remaining()}.
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a new char buffer represents a sub-sequence of this buffer's
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         current remaining content.
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if either {@code start} or {@code end} is invalid.
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public abstract CharSequence subSequence(int start, int end);
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a string representing the current remaining chars of this buffer.
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return a string representing the current remaining chars of this buffer.
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
708d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
7102c5e73632c4bb75004fd3858b2bba30857e82598Elliott Hughes        StringBuilder result = new StringBuilder(limit - position);
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = position; i < limit; i++) {
7122c5e73632c4bb75004fd3858b2bba30857e82598Elliott Hughes            result.append(get(i));
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
7142c5e73632c4bb75004fd3858b2bba30857e82598Elliott Hughes        return result.toString();
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes the given char to the current position and increases the position
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * by 1.
720d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param c
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the char to write.
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if position is equal or greater than limit.
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
729d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    public CharBuffer append(char c) {
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return put(c);
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes all chars of the given character sequence {@code csq} to the
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * current position of this buffer, and increases the position by the length
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * of the csq.
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Calling this method has the same effect as {@code append(csq.toString())}.
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the {@code CharSequence} is {@code null} the string "null" will be
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * written to the buffer.
741d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param csq
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the {@code CharSequence} to write.
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code remaining()} is less than the length of csq.
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
750d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    public CharBuffer append(CharSequence csq) {
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (csq != null) {
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return put(csq.toString());
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return put("null"); //$NON-NLS-1$
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Writes chars of the given {@code CharSequence} to the current position of
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this buffer, and increases the position by the number of chars written.
760d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param csq
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the {@code CharSequence} to write.
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param start
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the first char to write, must not be negative and not greater
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            than {@code csq.length()}.
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param end
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the last char to write (excluding), must be less than
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code start} and not greater than {@code csq.length()}.
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return this buffer.
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception BufferOverflowException
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if {@code remaining()} is less than {@code end - start}.
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IndexOutOfBoundsException
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if either {@code start} or {@code end} is invalid.
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception ReadOnlyBufferException
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *                if no changes may be made to the contents of this buffer.
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
777d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    public CharBuffer append(CharSequence csq, int start, int end) {
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (csq == null) {
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            csq = "null"; //$NON-NLS-1$
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CharSequence cs = csq.subSequence(start, end);
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (cs.length() > 0) {
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return put(cs.toString());
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Reads characters from this buffer and puts them into {@code target}. The
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of chars that are copied is either the number of remaining chars
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in this buffer or the number of remaining chars in {@code target},
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * whichever is smaller.
793d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson     *
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param target
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the target char buffer.
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IllegalArgumentException
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if {@code target} is this buffer.
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws IOException
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if an I/O error occurs.
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws ReadOnlyBufferException
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if no changes may be made to the contents of {@code target}.
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the number of chars copied or -1 if there are no chars left to be
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         read from this buffer.
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int read(CharBuffer target) throws IOException {
806d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        int remaining = remaining();
807d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if (target == this) {
808d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson            if (remaining == 0) {
809d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson                return -1;
810d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson            }
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException();
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
813d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if (remaining == 0) {
814d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson            return limit > 0 && target.remaining() == 0 ? 0 : -1;
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
816d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        remaining = Math.min(target.remaining(), remaining);
817d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if (remaining > 0) {
818d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson            char[] chars = new char[remaining];
819d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson            get(chars);
820d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson            target.put(chars);
821d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        }
822d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        return remaining;
823d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    }
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
825