blob: e84e4386cb7467c58f801c594a4cd6b453d44fbc [file] [log] [blame]
/**
*******************************************************************************
* Copyright (C) 1996-2005, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
*******************************************************************************
*/
package com.ibm.icu4jni.text;
import java.text.CharacterIterator;
/**
* Collation element iterator JNI wrapper.
* Iterates over the collation elements of a data string.
* The iterator supports both forward and backwards full iteration, ie if
* backwards iteration is performed in the midst of a forward iteration, the
* result is undefined.
* To perform a backwards iteration in the midst of a forward iteration,
* reset() has to be called.
* This will shift the position to either the start or the last character in the
* data string depending on whether next() is called or previous().
* <pre>
* RuleBasedCollator coll = Collator.getInstance();
* CollationElementIterator iterator = coll.getCollationElementIterator("abc");
* int ce = 0;
* while (ce != CollationElementIterator.NULLORDER) {
* ce = iterator.next();
* }
* iterator.reset();
* while (ce != CollationElementIterator.NULLORDER) {
* ce = iterator.previous();
* }
* </pre>
* @author syn wee quek
* @stable ICU 2.4
*/
public final class CollationElementIterator {
// public data member -------------------------------------------
/**
* @stable ICU 2.4
*/
public static final int NULLORDER = 0xFFFFFFFF;
// public methods -----------------------------------------------
/**
* Reset the collation elements to their initial state.
* This will move the 'cursor' to the beginning of the text.
* @stable ICU 2.4
*/
public void reset() {
NativeCollation.reset(m_collelemiterator_);
}
/**
* Get the ordering priority of the next collation element in the text.
* A single character may contain more than one collation element.
* @return next collation elements ordering, or NULLORDER if the end of the
* text is reached.
* @stable ICU 2.4
*/
public int next() {
return NativeCollation.next(m_collelemiterator_);
}
/**
* Get the ordering priority of the previous collation element in the text.
* A single character may contain more than one collation element.
* @return previous collation element ordering, or NULLORDER if the end of
* the text is reached.
* @stable ICU 2.4
*/
public int previous() {
return NativeCollation.previous(m_collelemiterator_);
}
/**
* Get the maximum length of any expansion sequences that end with the
* specified comparison order.
* @param order collation order returned by previous or next.
* @return maximum size of the expansion sequences ending with the collation
* element or 1 if collation element does not occur at the end of
* any expansion sequence
* @stable ICU 2.4
*/
public int getMaxExpansion(int order) {
return NativeCollation.getMaxExpansion(m_collelemiterator_, order);
}
/**
* Set the text containing the collation elements.
* @param source text containing the collation elements.
* @stable ICU 2.4
*/
public void setText(String source) {
NativeCollation.setText(m_collelemiterator_, source);
}
// BEGIN android-added
public void setText(CharacterIterator source) {
NativeCollation.setText(m_collelemiterator_, source.toString());
}
// END android-added
/**
* Get the offset of the current source character.
* This is an offset into the text of the character containing the current
* collation elements.
* @return offset of the current source character.
* @stable ICU 2.4
*/
public int getOffset() {
return NativeCollation.getOffset(m_collelemiterator_);
}
/**
* Set the offset of the current source character.
* This is an offset into the text of the character to be processed.
* @param offset The desired character offset.
* @stable ICU 2.4
*/
public void setOffset(int offset) {
NativeCollation.setOffset(m_collelemiterator_, offset);
}
/**
* Gets the primary order of a collation order.
* @param order the collation order
* @return the primary order of a collation order.
* @stable ICU 2.4
*/
public static int primaryOrder(int order) {
return ((order & PRIMARY_ORDER_MASK_) >> PRIMARY_ORDER_SHIFT_) &
UNSIGNED_16_BIT_MASK_;
}
/**
* Gets the secondary order of a collation order.
* @param order the collation order
* @return the secondary order of a collation order.
* @stable ICU 2.4
*/
public static int secondaryOrder(int order) {
return (order & SECONDARY_ORDER_MASK_) >> SECONDARY_ORDER_SHIFT_;
}
/**
* Gets the tertiary order of a collation order.
* @param order the collation order
* @return the tertiary order of a collation order.
* @stable ICU 2.4
*/
public static int tertiaryOrder(int order) {
return order & TERTIARY_ORDER_MASK_;
}
// protected constructor ----------------------------------------
/**
* CollationElementIteratorJNI constructor.
* The only caller of this class should be
* RuleBasedCollator.getCollationElementIterator().
* @param collelemiteratoraddress address of C collationelementiterator
*/
CollationElementIterator(int collelemiteratoraddress) {
m_collelemiterator_ = collelemiteratoraddress;
}
// protected methods --------------------------------------------
/**
* Garbage collection.
* Close C collator and reclaim memory.
* @stable ICU 2.4
*/
@Override protected void finalize() throws Throwable {
try {
NativeCollation.closeElements(m_collelemiterator_);
} finally {
super.finalize();
}
}
// private data members -----------------------------------------
/**
* C collator
*/
private int m_collelemiterator_;
/**
* ICU constant primary order mask for collation elements
*/
private static final int PRIMARY_ORDER_MASK_ = 0xffff0000;
/**
* ICU constant secondary order mask for collation elements
*/
private static final int SECONDARY_ORDER_MASK_ = 0x0000ff00;
/**
* ICU constant tertiary order mask for collation elements
*/
private static final int TERTIARY_ORDER_MASK_ = 0x000000ff;
/**
* ICU constant primary order shift for collation elements
*/
private static final int PRIMARY_ORDER_SHIFT_ = 16;
/**
* ICU constant secondary order shift for collation elements
*/
private static final int SECONDARY_ORDER_SHIFT_ = 8;
/**
* Unsigned 16 bit mask
*/
private static final int UNSIGNED_16_BIT_MASK_ = 0x0000FFFF;
}