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