1// © 2017 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html#License
3package com.ibm.icu.impl;
4
5import java.text.CharacterIterator;
6
7/**
8 * Implement the Java CharacterIterator interface on a CharSequence.
9 * Intended for internal use by ICU only.
10 */
11public class CSCharacterIterator implements CharacterIterator {
12
13    private int index;
14    private CharSequence seq;
15
16
17    /**
18     * Constructor.
19     * @param text The CharSequence to iterate over.
20     */
21    public CSCharacterIterator(CharSequence text) {
22        if (text == null) {
23            throw new NullPointerException();
24        }
25        seq = text;
26        index = 0;
27    }
28
29    /** @{inheritDoc} */
30    @Override
31    public char first() {
32        index = 0;
33        return current();
34    }
35
36    /** @{inheritDoc} */
37    @Override
38    public char last() {
39        index = seq.length();
40        return previous();
41    }
42
43    /** @{inheritDoc} */
44    @Override
45    public char current() {
46        if (index == seq.length()) {
47            return DONE;
48        }
49        return seq.charAt(index);
50    }
51
52    /** @{inheritDoc} */
53    @Override
54    public char next() {
55        if (index < seq.length()) {
56            ++index;
57        }
58        return current();
59    }
60
61    /** @{inheritDoc} */
62    @Override
63    public char previous() {
64        if (index == 0) {
65            return DONE;
66        }
67        --index;
68        return current();
69    }
70
71    /** @{inheritDoc} */
72    @Override
73    public char setIndex(int position) {
74        if (position < 0 || position > seq.length()) {
75            throw new IllegalArgumentException();
76        }
77        index = position;
78        return current();
79    }
80
81    /** @{inheritDoc} */
82    @Override
83    public int getBeginIndex() {
84        return 0;
85    }
86
87    /** @{inheritDoc} */
88    @Override
89    public int getEndIndex() {
90        return seq.length();
91    }
92
93    /** @{inheritDoc} */
94    @Override
95    public int getIndex() {
96        return index;
97    }
98
99    /** @{inheritDoc} */
100    @Override
101    public Object clone() {
102        CSCharacterIterator copy = new CSCharacterIterator(seq);
103        copy.setIndex(index);
104        return copy;
105    }
106}
107