16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1998-2012, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "utypeinfo.h"  // for 'typeid' to work
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchriter.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utf16.h"
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ustr_imp.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUOBJECT_DEFINE_RTTI_IMPLEMENTATION(UCharCharacterIterator)
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::UCharCharacterIterator()
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  : CharacterIterator(),
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  text(0)
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // never default construct!
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr,
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               int32_t length)
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0),
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  text(textPtr)
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr,
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               int32_t length,
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               int32_t position)
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0, position),
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  text(textPtr)
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr,
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               int32_t length,
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               int32_t textBegin,
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               int32_t textEnd,
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               int32_t position)
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0, textBegin, textEnd, position),
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  text(textPtr)
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::UCharCharacterIterator(const UCharCharacterIterator& that)
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org: CharacterIterator(that),
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  text(that.text)
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator&
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::operator=(const UCharCharacterIterator& that) {
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CharacterIterator::operator=(that);
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    text = that.text;
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return *this;
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::~UCharCharacterIterator() {
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::operator==(const ForwardCharacterIterator& that) const {
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (this == &that) {
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return TRUE;
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (typeid(*this) != typeid(that)) {
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCharCharacterIterator&    realThat = (UCharCharacterIterator&)that;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return text == realThat.text
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        && textLength == realThat.textLength
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        && pos == realThat.pos
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        && begin == realThat.begin
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        && end == realThat.end;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::hashCode() const {
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ustr_hashUCharsN(text, textLength) ^ pos ^ begin ^ end;
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCharacterIterator*
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::clone() const {
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return new UCharCharacterIterator(*this);
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::first() {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = begin;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos < end) {
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return text[pos];
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::firstPostInc() {
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = begin;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos < end) {
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return text[pos++];
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::last() {
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = end;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos > begin) {
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return text[--pos];
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::setIndex(int32_t position) {
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(position < begin) {
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = begin;
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(position > end) {
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = end;
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = position;
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos < end) {
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return text[pos];
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::current() const {
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos >= begin && pos < end) {
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return text[pos];
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::next() {
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos + 1 < end) {
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return text[++pos];
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* make current() return DONE */
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = end;
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::nextPostInc() {
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos < end) {
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return text[pos++];
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::hasNext() {
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(pos < end ? TRUE : FALSE);
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::previous() {
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos > begin) {
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return text[--pos];
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::hasPrevious() {
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(pos > begin ? TRUE : FALSE);
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar32
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::first32() {
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = begin;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos < end) {
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t i = pos;
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_NEXT(text, i, end, c);
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return c;
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar32
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::first32PostInc() {
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = begin;
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos < end) {
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_NEXT(text, pos, end, c);
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return c;
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar32
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::last32() {
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = end;
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos > begin) {
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_PREV(text, begin, pos, c);
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return c;
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar32
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::setIndex32(int32_t position) {
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(position < begin) {
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        position = begin;
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(position > end) {
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        position = end;
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(position < end) {
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_SET_CP_START(text, begin, position);
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t i = this->pos = position;
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_NEXT(text, i, end, c);
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return c;
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        this->pos = position;
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar32
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::current32() const {
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos >= begin && pos < end) {
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_GET(text, begin, pos, end, c);
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return c;
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar32
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::next32() {
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos < end) {
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_FWD_1(text, pos, end);
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(pos < end) {
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t i = pos;
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar32 c;
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U16_NEXT(text, i, end, c);
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return c;
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* make current() return DONE */
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = end;
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return DONE;
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar32
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::next32PostInc() {
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos < end) {
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_NEXT(text, pos, end, c);
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return c;
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUChar32
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::previous32() {
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos > begin) {
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U16_PREV(text, begin, pos, c);
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return c;
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DONE;
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::move(int32_t delta, CharacterIterator::EOrigin origin) {
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(origin) {
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case kStart:
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = begin + delta;
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case kCurrent:
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos += delta;
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case kEnd:
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = end + delta;
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos < begin) {
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = begin;
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(pos > end) {
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = end;
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return pos;
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint32_t
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::move32(int32_t delta, CharacterIterator::EOrigin origin) {
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // this implementation relies on the "safe" version of the UTF macros
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // (or the trustworthiness of the caller)
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch(origin) {
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case kStart:
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = begin;
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(delta > 0) {
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U16_FWD_N(text, pos, end, delta);
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case kCurrent:
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(delta > 0) {
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U16_FWD_N(text, pos, end, delta);
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U16_BACK_N(text, begin, pos, -delta);
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    case kEnd:
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = end;
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(delta < 0) {
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U16_BACK_N(text, begin, pos, -delta);
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default:
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        break;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return pos;
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UCharCharacterIterator::setText(const UChar* newText,
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t      newTextLength) {
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    text = newText;
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(newText == 0 || newTextLength < 0) {
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        newTextLength = 0;
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    end = textLength = newTextLength;
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = begin = 0;
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUCharCharacterIterator::getText(UnicodeString& result) {
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = UnicodeString(text, textLength);
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
366