12ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/* GENERATED SOURCE. DO NOT MODIFY. */
2f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
3f86f25d102340da66b9c7cb6b2d5ecdc0de43ecfFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
42ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/*
52ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller*******************************************************************************
62ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* Copyright (C) 2010-2014, International Business Machines
72ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* Corporation and others.  All Rights Reserved.
82ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller*******************************************************************************
92ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* UTF16CollationIterator.java, ported from utf16collationiterator.h/.cpp
102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller*
112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* C++ version created on: 2010oct27
122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller* created by: Markus W. Scherer
132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller*/
142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerpackage android.icu.impl.coll;
162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller/**
182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * UTF-16 collation element and character iterator.
192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Handles normalized UTF-16 text, with length or NUL-terminated.
202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller * Unnormalized text is handled by a subclass.
21836e6b40a94ec3fb7545a76cb072960442b7eee9Neil Fuller * @hide Only a subset of ICU is exposed in Android
222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller */
232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fullerpublic class UTF16CollationIterator extends CollationIterator {
242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /**
252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     * Partial constructor, see {@link CollationIterator#CollationIterator(CollationData)}.
262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller     */
272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public UTF16CollationIterator(CollationData d) {
282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        super(d);
292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public UTF16CollationIterator(CollationData d, boolean numeric, CharSequence s, int p) {
322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        super(d, numeric);
332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        seq = s;
342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        start = 0;
352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        pos = p;
362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        limit = s.length();
372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public boolean equals(Object other) {
412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if(!super.equals(other)) { return false; }
422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        UTF16CollationIterator o = (UTF16CollationIterator)other;
432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        // Compare the iterator state but not the text: Assume that the caller does that.
442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return (pos - start) == (o.pos - o.start);
452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public int hashCode() {
492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        assert false : "hashCode not designed";
502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return 42; // any arbitrary constant will do
512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
522ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
532ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
542ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public void resetToOffset(int newOffset) {
552ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        reset();
562ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        pos = start + newOffset;
572ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
582ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
592ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
602ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public int getOffset() {
612ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return pos - start;
622ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
632ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
642ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public void setText(boolean numeric, CharSequence s, int p) {
652ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        reset(numeric);
662ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        seq = s;
672ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        start = 0;
682ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        pos = p;
692ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        limit = s.length();
702ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
712ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
722ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
732ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public int nextCodePoint() {
742ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if(pos == limit) {
752ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return Collation.SENTINEL_CP;
762ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
772ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char c = seq.charAt(pos++);
782ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char trail;
792ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if(Character.isHighSurrogate(c) && pos != limit &&
802ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                Character.isLowSurrogate(trail = seq.charAt(pos))) {
812ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            ++pos;
822ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return Character.toCodePoint(c, trail);
832ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        } else {
842ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return c;
852ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
862ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
872ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
882ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
892ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    public int previousCodePoint() {
902ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if(pos == start) {
912ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return Collation.SENTINEL_CP;
922ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
932ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char c = seq.charAt(--pos);
942ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char lead;
952ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if(Character.isLowSurrogate(c) && pos != start &&
962ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                Character.isHighSurrogate(lead = seq.charAt(pos - 1))) {
972ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            --pos;
982ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return Character.toCodePoint(lead, c);
992ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        } else {
1002ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return c;
1012ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1022ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1032ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1042ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
1052ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected long handleNextCE32() {
1062ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if(pos == limit) {
1072ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            return NO_CP_AND_CE32;
1082ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1092ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char c = seq.charAt(pos++);
1102ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return makeCodePointAndCE32Pair(c, trie.getFromU16SingleLead(c));
1112ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1122ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1132ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
1142ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected char handleGetTrailSurrogate() {
1152ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if(pos == limit) { return 0; }
1162ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        char trail;
1172ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        if(Character.isLowSurrogate(trail = seq.charAt(pos))) { ++pos; }
1182ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        return trail;
1192ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1202ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1212ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    /* boolean foundNULTerminator(); */
1222ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1232ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
1242ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected void forwardNumCodePoints(int num) {
1252ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        while(num > 0 && pos != limit) {
1262ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            char c = seq.charAt(pos++);
1272ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            --num;
1282ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if(Character.isHighSurrogate(c) && pos != limit &&
1292ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    Character.isLowSurrogate(seq.charAt(pos))) {
1302ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                ++pos;
1312ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
1322ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1332ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1342ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1352ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    @Override
1362ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected void backwardNumCodePoints(int num) {
1372ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        while(num > 0 && pos != start) {
1382ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            char c = seq.charAt(--pos);
1392ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            --num;
1402ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            if(Character.isLowSurrogate(c) && pos != start &&
1412ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                    Character.isHighSurrogate(seq.charAt(pos-1))) {
1422ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller                --pos;
1432ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller            }
1442ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller        }
1452ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    }
1462ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller
1472ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected CharSequence seq;
1482ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected int start;
1492ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected int pos;
1502ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller    protected int limit;
1512ae130017183d2f66d55bf0ca51f8da3294644fdNeil Fuller}
152