1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20a1603838fe9e865575c87982e32c6343740e464cElliott Hughesimport java.util.Arrays;
21a1603838fe9e865575c87982e32c6343740e464cElliott Hughes
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class wraps a char sequence to be a char buffer.
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Implementation notice:
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Char sequence based buffer is always readonly.</li>
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
30f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectfinal class CharSequenceAdapter extends CharBuffer {
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static CharSequenceAdapter copy(CharSequenceAdapter other) {
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CharSequenceAdapter buf = new CharSequenceAdapter(other.sequence);
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.limit = other.limit;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.position = other.position;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.mark = other.mark;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buf;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final CharSequence sequence;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    CharSequenceAdapter(CharSequence chseq) {
452589e301d1fb85960045c9ef29682d7e73b1aee7Narayan Kamath        super(chseq.length(), 0);
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sequence = chseq;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharBuffer asReadOnlyBuffer() {
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return duplicate();
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharBuffer compact() {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new ReadOnlyBufferException();
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharBuffer duplicate() {
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return copy(this);
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char get() {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (position == limit) {
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sequence.charAt(position++);
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
72eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char get(int index) {
74a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkIndex(index);
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sequence.charAt(index);
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
790e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes    public final CharBuffer get(char[] dst, int dstOffset, int charCount) {
80a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        Arrays.checkOffsetAndCount(dst.length, dstOffset, charCount);
810e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        if (charCount > remaining()) {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BufferUnderflowException();
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
840e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        int newPosition = position + charCount;
850e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes        sequence.toString().getChars(position, newPosition, dst, dstOffset);
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        position = newPosition;
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return this;
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isDirect() {
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
95eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isReadOnly() {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
100eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ByteOrder order() {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ByteOrder.nativeOrder();
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override char[] protectedArray() {
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override int protectedArrayOffset() {
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnsupportedOperationException();
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113bdd17cde8cf675f5d5703aad4dfb565932fb4c50Elliott Hughes    @Override boolean protectedHasArray() {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
117eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharBuffer put(char c) {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new ReadOnlyBufferException();
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharBuffer put(int index, char c) {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new ReadOnlyBufferException();
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
1280e1b748ecabf720065a632f28330f5d4d037d5aeElliott Hughes    public final CharBuffer put(char[] src, int srcOffset, int charCount) {
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new ReadOnlyBufferException();
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharBuffer put(String src, int start, int end) {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new ReadOnlyBufferException();
135eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public CharBuffer slice() {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new CharSequenceAdapter(sequence.subSequence(position, limit));
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
14240b4f1db4031eff92cb0b31740b6e644b8e4c733Elliott Hughes    @Override public CharBuffer subSequence(int start, int end) {
143a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        checkStartEndRemaining(start, end);
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CharSequenceAdapter result = copy(this);
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.position = position + start;
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.limit = position + end;
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
150