/*
*******************************************************************************
* Copyright (C) 1998-1999, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*/

#include "unicode/uchriter.h"

UCharCharacterIterator::UCharCharacterIterator(const UChar* text,
                           int32_t textLength)
  : CharacterIterator(),
  text(text),
  pos(0),
  begin(0),
  end(textLength)
{
}

UCharCharacterIterator::UCharCharacterIterator(const UCharCharacterIterator& that)
: CharacterIterator(that),
  text(that.text),
  pos(that.pos),
  begin(that.begin),
  end(that.end)
{
}

UCharCharacterIterator&
UCharCharacterIterator::operator=(const UCharCharacterIterator&   that)
{
    text = that.text;
    pos = that.pos;
    begin = that.begin;
    end = that.end;
    return *this;
}

UCharCharacterIterator::~UCharCharacterIterator()
{}

bool_t
UCharCharacterIterator::operator==(const CharacterIterator& that) const
{
    if (this == &that)
        return TRUE;
    
    if (getDynamicClassID() != that.getDynamicClassID())
        return FALSE;

    UCharCharacterIterator&    realThat = (UCharCharacterIterator&)that;

    return text == realThat.text
        && pos == realThat.pos
        && begin == realThat.begin
        && end == realThat.end;
}

int32_t
UCharCharacterIterator::hashCode() const
{
    return pos ^ begin ^ end;
}

CharacterIterator*
UCharCharacterIterator::clone() const
{
    return new UCharCharacterIterator(*this);
}

UChar
UCharCharacterIterator::first()
{
    pos = begin;
    return text[pos];
}

UChar
UCharCharacterIterator::last()
{
    pos = end - 1;
    return text[pos];
}

UChar
UCharCharacterIterator::setIndex(UTextOffset pos)
{
    // should check "pos" here and return an error code, but changing this
    // function would have significant impact across TIFC, so we decided to hold off
    this->pos = pos;
    return text[pos];
}

UChar
UCharCharacterIterator::current() const
{
    if (pos >= begin && pos < end)
        return text[pos];
    else
        return CharacterIterator::DONE;
}

UChar
UCharCharacterIterator::next()
{
    if (pos < end - 1)
    {
        pos += 1;
        return text[pos];
    }
    else
    {
        pos = end;
        return CharacterIterator::DONE;
    }
}

UChar
UCharCharacterIterator::previous()
{
    if (pos > begin)
        return text[--pos];
    else
        return DONE;
}

UTextOffset
UCharCharacterIterator::startIndex() const
{
    return begin;
}

UTextOffset
UCharCharacterIterator::endIndex() const
{
    return end;
}

UTextOffset
UCharCharacterIterator::getIndex() const
{
    return pos;
}

void UCharCharacterIterator::setText(const UChar* newText,
                                     int32_t      newTextLength)
{
    text = newText;
    begin = 0;
    end = newTextLength;
    pos = begin;
}

void
UCharCharacterIterator::getText(UnicodeString& result)
{
    result = UnicodeString(text, end);
}

char UCharCharacterIterator::fgClassID = 0;
