• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 /*
5 *******************************************************************************
6 * Copyright (C) 2010-2014, International Business Machines
7 * Corporation and others.  All Rights Reserved.
8 *******************************************************************************
9 * UTF16CollationIterator.java, ported from utf16collationiterator.h/.cpp
10 *
11 * C++ version created on: 2010oct27
12 * created by: Markus W. Scherer
13 */
14 
15 package ohos.global.icu.impl.coll;
16 
17 /**
18  * UTF-16 collation element and character iterator.
19  * Handles normalized UTF-16 text, with length or NUL-terminated.
20  * Unnormalized text is handled by a subclass.
21  * @hide exposed on OHOS
22  */
23 public class UTF16CollationIterator extends CollationIterator {
24     /**
25      * Partial constructor, see {@link CollationIterator#CollationIterator(CollationData)}.
26      */
UTF16CollationIterator(CollationData d)27     public UTF16CollationIterator(CollationData d) {
28         super(d);
29     }
30 
UTF16CollationIterator(CollationData d, boolean numeric, CharSequence s, int p)31     public UTF16CollationIterator(CollationData d, boolean numeric, CharSequence s, int p) {
32         super(d, numeric);
33         seq = s;
34         start = 0;
35         pos = p;
36         limit = s.length();
37     }
38 
39     @Override
equals(Object other)40     public boolean equals(Object other) {
41         if(!super.equals(other)) { return false; }
42         UTF16CollationIterator o = (UTF16CollationIterator)other;
43         // Compare the iterator state but not the text: Assume that the caller does that.
44         return (pos - start) == (o.pos - o.start);
45     }
46 
47     @Override
hashCode()48     public int hashCode() {
49         assert false : "hashCode not designed";
50         return 42; // any arbitrary constant will do
51     }
52 
53     @Override
resetToOffset(int newOffset)54     public void resetToOffset(int newOffset) {
55         reset();
56         pos = start + newOffset;
57     }
58 
59     @Override
getOffset()60     public int getOffset() {
61         return pos - start;
62     }
63 
setText(boolean numeric, CharSequence s, int p)64     public void setText(boolean numeric, CharSequence s, int p) {
65         reset(numeric);
66         seq = s;
67         start = 0;
68         pos = p;
69         limit = s.length();
70     }
71 
72     @Override
nextCodePoint()73     public int nextCodePoint() {
74         if(pos == limit) {
75             return Collation.SENTINEL_CP;
76         }
77         char c = seq.charAt(pos++);
78         char trail;
79         if(Character.isHighSurrogate(c) && pos != limit &&
80                 Character.isLowSurrogate(trail = seq.charAt(pos))) {
81             ++pos;
82             return Character.toCodePoint(c, trail);
83         } else {
84             return c;
85         }
86     }
87 
88     @Override
previousCodePoint()89     public int previousCodePoint() {
90         if(pos == start) {
91             return Collation.SENTINEL_CP;
92         }
93         char c = seq.charAt(--pos);
94         char lead;
95         if(Character.isLowSurrogate(c) && pos != start &&
96                 Character.isHighSurrogate(lead = seq.charAt(pos - 1))) {
97             --pos;
98             return Character.toCodePoint(lead, c);
99         } else {
100             return c;
101         }
102     }
103 
104     @Override
handleNextCE32()105     protected long handleNextCE32() {
106         if(pos == limit) {
107             return NO_CP_AND_CE32;
108         }
109         char c = seq.charAt(pos++);
110         return makeCodePointAndCE32Pair(c, trie.getFromU16SingleLead(c));
111     }
112 
113     @Override
handleGetTrailSurrogate()114     protected char handleGetTrailSurrogate() {
115         if(pos == limit) { return 0; }
116         char trail;
117         if(Character.isLowSurrogate(trail = seq.charAt(pos))) { ++pos; }
118         return trail;
119     }
120 
121     /* boolean foundNULTerminator(); */
122 
123     @Override
forwardNumCodePoints(int num)124     protected void forwardNumCodePoints(int num) {
125         while(num > 0 && pos != limit) {
126             char c = seq.charAt(pos++);
127             --num;
128             if(Character.isHighSurrogate(c) && pos != limit &&
129                     Character.isLowSurrogate(seq.charAt(pos))) {
130                 ++pos;
131             }
132         }
133     }
134 
135     @Override
backwardNumCodePoints(int num)136     protected void backwardNumCodePoints(int num) {
137         while(num > 0 && pos != start) {
138             char c = seq.charAt(--pos);
139             --num;
140             if(Character.isLowSurrogate(c) && pos != start &&
141                     Character.isHighSurrogate(seq.charAt(pos-1))) {
142                 --pos;
143             }
144         }
145     }
146 
147     protected CharSequence seq;
148     protected int start;
149     protected int pos;
150     protected int limit;
151 }
152