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 Project/**
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class wraps a char sequence to be a char buffer.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Implementation notice:
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <ul>
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <li>Char sequence based buffer is always readonly.</li>
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </ul>
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p>
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfinal class CharSequenceAdapter extends CharBuffer {
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CharSequenceAdapter copy(CharSequenceAdapter other) {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CharSequenceAdapter buf = new CharSequenceAdapter(other.sequence);
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.limit = other.limit;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.position = other.position;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        buf.mark = other.mark;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return buf;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final CharSequence sequence;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    CharSequenceAdapter(CharSequence chseq) {
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(chseq.length());
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sequence = chseq;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer asReadOnlyBuffer() {
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return duplicate();
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer compact() {
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new ReadOnlyBufferException();
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
57d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer duplicate() {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return copy(this);
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public char get() {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (position == limit) {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new BufferUnderflowException();
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sequence.charAt(position++);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public char get(int index) {
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index < 0 || index >= limit) {
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sequence.charAt(index);
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final CharBuffer get(char[] dest, int off, int len) {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int length = dest.length;
81d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if ((off < 0) || (len < 0) || (long) off + (long) len > length) {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (len > remaining()) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new BufferUnderflowException();
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int newPosition = position + len;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sequence.toString().getChars(position, newPosition, dest, off);
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        position = newPosition;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isDirect() {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isReadOnly() {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return true;
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ByteOrder order() {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ByteOrder.nativeOrder();
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected char[] protectedArray() {
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected int protectedArrayOffset() {
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new UnsupportedOperationException();
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    protected boolean protectedHasArray() {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer put(char c) {
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new ReadOnlyBufferException();
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer put(int index, char c) {
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new ReadOnlyBufferException();
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final CharBuffer put(char[] src, int off, int len) {
135d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if ((off < 0) || (len < 0) || (long) off + (long) len > src.length) {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
138d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (len > remaining()) {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new BufferOverflowException();
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
142d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new ReadOnlyBufferException();
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer put(String src, int start, int end) {
148d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson        if ((start < 0) || (end < 0)
149d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson                || (long) start + (long) end > src.length()) {
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new ReadOnlyBufferException();
153d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    }
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
155d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharBuffer slice() {
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CharSequenceAdapter(sequence.subSequence(position, limit));
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson    @Override
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CharSequence subSequence(int start, int end) {
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (end < start || start < 0 || end > remaining()) {
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IndexOutOfBoundsException();
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
165d2510429e70ab91a04c67d5ca39b30f354eba221Jesse Wilson
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CharSequenceAdapter result = copy(this);
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.position = position + start;
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.limit = position + end;
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
172