151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved.
351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it
651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as
751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation.  Oracle designates this
851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided
951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code.
1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT
1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that
1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code).
1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version
1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation,
1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any
2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions.
2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/*
2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The original version of this source code and documentation
3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is copyrighted and owned by Taligent, Inc., a wholly-owned
3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * subsidiary of IBM. These materials are provided under terms
3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of a License Agreement between Taligent and Sun. This technology
3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is protected by multiple US and International patents.
3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This notice and attribution to Taligent may not be removed.
3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Taligent is a registered trademark of Taligent, Inc.
3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.text;
4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/**
4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>StringCharacterIterator</code> implements the
4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>CharacterIterator</code> protocol for a <code>String</code>.
4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>StringCharacterIterator</code> class iterates over the
4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * entire <code>String</code>.
4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski *
4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see CharacterIterator
5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */
5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic final class StringCharacterIterator implements CharacterIterator
5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{
5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private String text;
5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int begin;
5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int end;
5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    // invariant: begin <= pos <= end
5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    private int pos;
5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs an iterator with an initial index of 0.
6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public StringCharacterIterator(String text)
6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this(text, 0);
6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs an iterator with the specified initial index.
7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  text   The String to be iterated over
7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  pos    Initial iterator position
7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public StringCharacterIterator(String text, int pos)
7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    this(text, 0, text.length(), pos);
7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Constructs an iterator over the given range of the given string, with the
8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * index set at the specified position.
8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  text   The String to be iterated over
8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  begin  Index of the first character
8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  end    Index of the character following the last character
8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  pos    Initial iterator position
8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public StringCharacterIterator(String text, int begin, int end, int pos) {
8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (text == null)
9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NullPointerException();
9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.text = text;
9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (begin < 0 || begin > end || end > text.length())
9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("Invalid substring range");
9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (pos < begin || pos > end)
9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("Invalid position");
9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.begin = begin;
10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.end = end;
10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.pos = pos;
10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Reset this iterator to point to a new string.  This package-visible
10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * method is used by other java.text classes that want to avoid allocating
10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * new StringCharacterIterator objects every time their setText method
10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * is called.
10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     *
11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param  text   The String to be iterated over
11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @since 1.2
11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public void setText(String text) {
11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (text == null)
11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new NullPointerException();
11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.text = text;
11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.begin = 0;
11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.end = text.length();
11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        this.pos = 0;
12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.first() for String.
12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#first
12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public char first()
12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        pos = begin;
12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return current();
13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.last() for String.
13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#last
13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public char last()
13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (end != begin) {
13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            pos = end - 1;
14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        } else {
14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            pos = end;
14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return current();
14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     }
14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.setIndex() for String.
14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#setIndex
14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public char setIndex(int p)
15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    if (p < begin || p > end)
15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new IllegalArgumentException("Invalid index");
15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        pos = p;
15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return current();
15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.current() for String.
16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#current
16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public char current()
16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (pos >= begin && pos < end) {
16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return text.charAt(pos);
16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        else {
16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return DONE;
16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.next() for String.
17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#next
17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public char next()
17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (pos < end - 1) {
17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            pos++;
18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return text.charAt(pos);
18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        else {
18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            pos = end;
18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return DONE;
18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.previous() for String.
19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#previous
19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public char previous()
19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (pos > begin) {
19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            pos--;
19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return text.charAt(pos);
19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        else {
19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return DONE;
20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.getBeginIndex() for String.
20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#getBeginIndex
20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getBeginIndex()
20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return begin;
21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.getEndIndex() for String.
21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#getEndIndex
21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getEndIndex()
21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return end;
21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Implements CharacterIterator.getIndex() for String.
22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @see CharacterIterator#getIndex
22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int getIndex()
22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return pos;
22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Compares the equality of two StringCharacterIterator objects.
23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @param obj the StringCharacterIterator object to be compared with.
23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return true if the given obj is the same as this
23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * StringCharacterIterator object; false otherwise.
23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public boolean equals(Object obj)
23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (this == obj)
23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return true;
24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!(obj instanceof StringCharacterIterator))
24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return false;
24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        StringCharacterIterator that = (StringCharacterIterator) obj;
24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (hashCode() != that.hashCode())
24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return false;
24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (!text.equals(that.text))
24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return false;
24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        if (pos != that.pos || begin != that.begin || end != that.end)
25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return false;
25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return true;
25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Computes a hashcode for this iterator.
25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return A hash code
25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public int hashCode()
25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        return text.hashCode() ^ pos ^ begin ^ end;
26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    /**
26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * Creates a copy of this iterator.
26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     * @return A copy of this
26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski     */
26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    public Object clone()
26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    {
26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        try {
27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            StringCharacterIterator other
27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            = (StringCharacterIterator) super.clone();
27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            return other;
27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        catch (CloneNotSupportedException e) {
27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski            throw new InternalError();
27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski        }
27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski    }
27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski
27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski}
280