• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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 libcore.icu;
18 
19 import java.text.CharacterIterator;
20 import java.text.StringCharacterIterator;
21 import java.util.Locale;
22 
23 public final class NativeBreakIterator implements Cloneable {
24     // Acceptable values for the 'type' field.
25     private static final int BI_CHAR_INSTANCE = 1;
26     private static final int BI_WORD_INSTANCE = 2;
27     private static final int BI_LINE_INSTANCE = 3;
28     private static final int BI_SENT_INSTANCE = 4;
29 
30     private final int address;
31     private final int type;
32     private CharacterIterator charIter;
33 
NativeBreakIterator(int address, int type)34     private NativeBreakIterator(int address, int type) {
35         this.address = address;
36         this.type = type;
37         this.charIter = new StringCharacterIterator("");
38     }
39 
40     @Override
clone()41     public Object clone() {
42         int cloneAddr = cloneImpl(this.address);
43         NativeBreakIterator clone = new NativeBreakIterator(cloneAddr, this.type);
44         // The RI doesn't clone the CharacterIterator.
45         clone.charIter = this.charIter;
46         return clone;
47     }
48 
49     @Override
equals(Object object)50     public boolean equals(Object object) {
51         if (object == this) {
52             return true;
53         }
54         if (!(object instanceof NativeBreakIterator)) {
55             return false;
56         }
57         // TODO: is this sufficient? shouldn't we be checking the underlying rules?
58         NativeBreakIterator rhs = (NativeBreakIterator) object;
59         return type == rhs.type && charIter.equals(rhs.charIter);
60     }
61 
62     @Override
hashCode()63     public int hashCode() {
64         return 42; // No-one uses BreakIterator as a hash key.
65     }
66 
finalize()67     @Override protected void finalize() throws Throwable {
68         try {
69             closeBreakIteratorImpl(this.address);
70         } finally {
71             super.finalize();
72         }
73     }
74 
current()75     public int current() {
76         return currentImpl(this.address);
77     }
78 
first()79     public int first() {
80         return firstImpl(this.address);
81     }
82 
following(int offset)83     public int following(int offset) {
84         return followingImpl(this.address, offset);
85     }
86 
getText()87     public CharacterIterator getText() {
88         int newLoc = currentImpl(this.address);
89         this.charIter.setIndex(newLoc);
90         return this.charIter;
91     }
92 
last()93     public int last() {
94         return lastImpl(this.address);
95     }
96 
next(int n)97     public int next(int n) {
98         return nextImpl(this.address, n);
99     }
100 
next()101     public int next() {
102         return nextImpl(this.address, 1);
103     }
104 
previous()105     public int previous() {
106         return previousImpl(this.address);
107     }
108 
setText(CharacterIterator newText)109     public void setText(CharacterIterator newText) {
110         StringBuilder sb = new StringBuilder();
111         for (char c = newText.first(); c != CharacterIterator.DONE; c = newText.next()) {
112             sb.append(c);
113         }
114         setText(sb.toString(), newText);
115     }
116 
setText(String newText)117     public void setText(String newText) {
118         setText(newText, new StringCharacterIterator(newText));
119     }
120 
setText(String s, CharacterIterator it)121     private void setText(String s, CharacterIterator it) {
122         this.charIter = it;
123         setTextImpl(this.address, s);
124     }
125 
isBoundary(int offset)126     public boolean isBoundary(int offset) {
127         return isBoundaryImpl(this.address, offset);
128     }
129 
preceding(int offset)130     public int preceding(int offset) {
131         return precedingImpl(this.address, offset);
132     }
133 
getCharacterInstance(Locale where)134     public static NativeBreakIterator getCharacterInstance(Locale where) {
135         return new NativeBreakIterator(getCharacterInstanceImpl(where.toString()), BI_CHAR_INSTANCE);
136     }
137 
getLineInstance(Locale where)138     public static NativeBreakIterator getLineInstance(Locale where) {
139         return new NativeBreakIterator(getLineInstanceImpl(where.toString()), BI_LINE_INSTANCE);
140     }
141 
getSentenceInstance(Locale where)142     public static NativeBreakIterator getSentenceInstance(Locale where) {
143         return new NativeBreakIterator(getSentenceInstanceImpl(where.toString()), BI_SENT_INSTANCE);
144     }
145 
getWordInstance(Locale where)146     public static NativeBreakIterator getWordInstance(Locale where) {
147         return new NativeBreakIterator(getWordInstanceImpl(where.toString()), BI_WORD_INSTANCE);
148     }
149 
getCharacterInstanceImpl(String locale)150     private static native int getCharacterInstanceImpl(String locale);
getWordInstanceImpl(String locale)151     private static native int getWordInstanceImpl(String locale);
getLineInstanceImpl(String locale)152     private static native int getLineInstanceImpl(String locale);
getSentenceInstanceImpl(String locale)153     private static native int getSentenceInstanceImpl(String locale);
closeBreakIteratorImpl(int address)154     private static native void closeBreakIteratorImpl(int address);
setTextImpl(int address, String text)155     private static native void setTextImpl(int address, String text);
cloneImpl(int address)156     private static native int cloneImpl(int address);
precedingImpl(int address, int offset)157     private static native int precedingImpl(int address, int offset);
isBoundaryImpl(int address, int offset)158     private static native boolean isBoundaryImpl(int address, int offset);
nextImpl(int address, int n)159     private static native int nextImpl(int address, int n);
previousImpl(int address)160     private static native int previousImpl(int address);
currentImpl(int address)161     private static native int currentImpl(int address);
firstImpl(int address)162     private static native int firstImpl(int address);
followingImpl(int address, int offset)163     private static native int followingImpl(int address, int offset);
lastImpl(int address)164     private static native int lastImpl(int address);
165 }
166