/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package java.text; import libcore.icu.CollationElementIteratorICU; /** * Created by a {@code RuleBasedCollator} to iterate through a string. The * result of each iteration is a 32-bit collation element that defines the * ordering priority of the next character or sequence of characters in the * source string. *
* For illustration, consider the following in Spanish: *
* "ca": the first collation element is collation_element('c') and second * collation element is collation_element('a'). *
* Since "ch" in Spanish sorts as one entity, the example below returns one * collation element for the two characters 'c' and 'h': *
* "cha": the first collation element is collation_element('ch') and the second * one is collation_element('a'). *
* In German, since the character '\u0086' is a composed character of 'a' * and 'e', the iterator returns two collation elements for the single character * '\u0086': *
* "\u0086b": the first collation element is collation_element('a'), the * second one is collation_element('e'), and the third collation element is * collation_element('b'). * *
Note that calls to {@code next} and {@code previous} can not be mixed. * To change iteration direction, {@code reset}, {@code setOffset} or {@code setText} * must be called to reset the iterator. If a change of direction is done without one * of these calls, the result is undefined. */ public final class CollationElementIterator { /** * This constant is returned by the iterator in the methods * {@code next()} and {@code previous()} when the end or the * beginning of the source string has been reached, and there are no more * valid collation elements to return. */ public static final int NULLORDER = -1; private CollationElementIteratorICU icuIterator; CollationElementIterator(CollationElementIteratorICU iterator) { this.icuIterator = iterator; } /** * Returns the maximum length of any expansion sequence that ends with the * specified collation element. Returns {@code 1} if there is no expansion * with this collation element as the last element. * * @param order * a collation element that has been previously obtained from a * call to either the {@link #next()} or {@link #previous()} * method. */ public int getMaxExpansion(int order) { return this.icuIterator.getMaxExpansion(order); } /** * Returns the character offset in the source string corresponding to the * next collation element. This value could be any of: *
* If the {@code RuleBasedCollator} used by this iterator has had its * attributes changed, calling {@code reset()} reinitializes the iterator to * use the new attributes. */ public void reset() { this.icuIterator.reset(); } /** * Returns the secondary order of the specified collation element, i.e. the * 16th to 23th bits, inclusive. This value is unsigned. * * @param order * the element of the collator. */ public static final short secondaryOrder(int order) { return (short) CollationElementIteratorICU.secondaryOrder(order); } /** * Points the iterator at the collation element associated with the * character in the source string which is found at the supplied offset. * After this call completes, an invocation of the {@link #next()} method * will return this collation element. *
* If {@code newOffset} corresponds to a character which is part of a * sequence that maps to a single collation element then the iterator is * adjusted to the start of that sequence. As a result of this, any * subsequent call made to {@code getOffset()} may not return the same value * set by this method. *
* If the decomposition mode is on, and offset is in the middle of a * decomposable range of source text, the iterator may not return a correct * result for the next forwards or backwards iteration. The user must ensure * that the offset is not in the middle of a decomposable range. * * @param newOffset * the character offset into the original source string to set. * Note that this is not an offset into the corresponding * sequence of collation elements. */ public void setOffset(int newOffset) { this.icuIterator.setOffset(newOffset); } /** * Sets a new source string iterator for iteration, and resets the offset to * the beginning of the text. * * @param source * the new source string iterator for iteration. */ public void setText(CharacterIterator source) { this.icuIterator.setText(source); } /** * Sets a new source string for iteration, and resets the offset to the * beginning of the text. * * @param source * the new source string for iteration. */ public void setText(String source) { this.icuIterator.setText(source); } /** * Returns the tertiary order of the specified collation element, i.e. the * last 8 bits. This value is unsigned. * * @param order * the element of the collation. */ public static final short tertiaryOrder(int order) { return (short) CollationElementIteratorICU.tertiaryOrder(order); } }