1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.text; 18 19 import android.annotation.NonNull; 20 21 import java.text.CharacterIterator; 22 23 /** 24 * An implementation of {@link java.text.CharacterIterator} that iterates over a given CharSequence. 25 * {@hide} 26 */ 27 public class CharSequenceCharacterIterator implements CharacterIterator { 28 private final int mBeginIndex, mEndIndex; 29 private int mIndex; 30 private final CharSequence mCharSeq; 31 32 /** 33 * Constructs the iterator given a CharSequence and a range. The position of the iterator index 34 * is set to the beginning of the range. 35 */ CharSequenceCharacterIterator(@onNull CharSequence text, int start, int end)36 public CharSequenceCharacterIterator(@NonNull CharSequence text, int start, int end) { 37 mCharSeq = text; 38 mBeginIndex = mIndex = start; 39 mEndIndex = end; 40 } 41 first()42 public char first() { 43 mIndex = mBeginIndex; 44 return current(); 45 } 46 last()47 public char last() { 48 if (mBeginIndex == mEndIndex) { 49 mIndex = mEndIndex; 50 return DONE; 51 } else { 52 mIndex = mEndIndex - 1; 53 return mCharSeq.charAt(mIndex); 54 } 55 } 56 current()57 public char current() { 58 return (mIndex == mEndIndex) ? DONE : mCharSeq.charAt(mIndex); 59 } 60 next()61 public char next() { 62 mIndex++; 63 if (mIndex >= mEndIndex) { 64 mIndex = mEndIndex; 65 return DONE; 66 } else { 67 return mCharSeq.charAt(mIndex); 68 } 69 } 70 previous()71 public char previous() { 72 if (mIndex <= mBeginIndex) { 73 return DONE; 74 } else { 75 mIndex--; 76 return mCharSeq.charAt(mIndex); 77 } 78 } 79 setIndex(int position)80 public char setIndex(int position) { 81 if (mBeginIndex <= position && position <= mEndIndex) { 82 mIndex = position; 83 return current(); 84 } else { 85 throw new IllegalArgumentException("invalid position"); 86 } 87 } 88 getBeginIndex()89 public int getBeginIndex() { 90 return mBeginIndex; 91 } 92 getEndIndex()93 public int getEndIndex() { 94 return mEndIndex; 95 } 96 getIndex()97 public int getIndex() { 98 return mIndex; 99 } 100 clone()101 public Object clone() { 102 try { 103 return super.clone(); 104 } catch (CloneNotSupportedException e) { 105 throw new InternalError(); 106 } 107 } 108 } 109