1// Copyright (C) 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4**********************************************************************
5*   Copyright (C) 1999-2011, International Business Machines
6*   Corporation and others.  All Rights Reserved.
7**********************************************************************
8*/
9
10#include "unicode/chariter.h"
11
12U_NAMESPACE_BEGIN
13
14ForwardCharacterIterator::~ForwardCharacterIterator() {}
15ForwardCharacterIterator::ForwardCharacterIterator()
16: UObject()
17{}
18ForwardCharacterIterator::ForwardCharacterIterator(const ForwardCharacterIterator &other)
19: UObject(other)
20{}
21
22
23CharacterIterator::CharacterIterator()
24: textLength(0), pos(0), begin(0), end(0) {
25}
26
27CharacterIterator::CharacterIterator(int32_t length)
28: textLength(length), pos(0), begin(0), end(length) {
29    if(textLength < 0) {
30        textLength = end = 0;
31    }
32}
33
34CharacterIterator::CharacterIterator(int32_t length, int32_t position)
35: textLength(length), pos(position), begin(0), end(length) {
36    if(textLength < 0) {
37        textLength = end = 0;
38    }
39    if(pos < 0) {
40        pos = 0;
41    } else if(pos > end) {
42        pos = end;
43    }
44}
45
46CharacterIterator::CharacterIterator(int32_t length, int32_t textBegin, int32_t textEnd, int32_t position)
47: textLength(length), pos(position), begin(textBegin), end(textEnd) {
48    if(textLength < 0) {
49        textLength = 0;
50    }
51    if(begin < 0) {
52        begin = 0;
53    } else if(begin > textLength) {
54        begin = textLength;
55    }
56    if(end < begin) {
57        end = begin;
58    } else if(end > textLength) {
59        end = textLength;
60    }
61    if(pos < begin) {
62        pos = begin;
63    } else if(pos > end) {
64        pos = end;
65    }
66}
67
68CharacterIterator::~CharacterIterator() {}
69
70CharacterIterator::CharacterIterator(const CharacterIterator &that) :
71ForwardCharacterIterator(that),
72textLength(that.textLength), pos(that.pos), begin(that.begin), end(that.end)
73{
74}
75
76CharacterIterator &
77CharacterIterator::operator=(const CharacterIterator &that) {
78    ForwardCharacterIterator::operator=(that);
79    textLength = that.textLength;
80    pos = that.pos;
81    begin = that.begin;
82    end = that.end;
83    return *this;
84}
85
86// implementing first[32]PostInc() directly in a subclass should be faster
87// but these implementations make subclassing a little easier
88UChar
89CharacterIterator::firstPostInc(void) {
90    setToStart();
91    return nextPostInc();
92}
93
94UChar32
95CharacterIterator::first32PostInc(void) {
96    setToStart();
97    return next32PostInc();
98}
99
100U_NAMESPACE_END
101