1 /*
   2  * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /*
  27  *******************************************************************************
  28  * (C) Copyright IBM Corp. 1996-2005 - All Rights Reserved                     *
  29  *                                                                             *
  30  * The original version of this source code and documentation is copyrighted   *
  31  * and owned by IBM, These materials are provided under terms of a License     *
  32  * Agreement between IBM and Sun. This technology is protected by multiple     *
  33  * US and International patents. This notice and attribution to IBM may not    *
  34  * to removed.                                                                 *
  35  *******************************************************************************
  36  */
  37 
  38 package jdk.internal.icu.impl;
  39 
  40 import java.text.CharacterIterator;
  41 
  42 import jdk.internal.icu.text.UCharacterIterator;
  43 
  44 /**
  45  * This class is a wrapper around CharacterIterator and implements the
  46  * UCharacterIterator protocol
  47  * @author ram
  48  */
  49 
  50 public class CharacterIteratorWrapper extends UCharacterIterator {
  51 
  52     private CharacterIterator iterator;
  53 
  54     public CharacterIteratorWrapper(CharacterIterator iter){
  55         if(iter==null){
  56             throw new IllegalArgumentException();
  57         }
  58         iterator     = iter;
  59     }
  60 
  61     /**
  62      * @see UCharacterIterator#current()
  63      */
  64     public int current() {
  65         int c = iterator.current();
  66         if(c==CharacterIterator.DONE){
  67           return DONE;
  68         }
  69         return c;
  70     }
  71 
  72     /**
  73      * @see UCharacterIterator#getLength()
  74      */
  75     public int getLength() {
  76         return (iterator.getEndIndex() - iterator.getBeginIndex());
  77     }
  78 
  79     /**
  80      * @see UCharacterIterator#getIndex()
  81      */
  82     public int getIndex() {
  83         return iterator.getIndex();
  84     }
  85 
  86     /**
  87      * @see UCharacterIterator#next()
  88      */
  89     public int next() {
  90         int i = iterator.current();
  91         iterator.next();
  92         if(i==CharacterIterator.DONE){
  93           return DONE;
  94         }
  95         return i;
  96     }
  97 
  98     /**
  99      * @see UCharacterIterator#previous()
 100      */
 101     public int previous() {
 102         int i = iterator.previous();
 103         if(i==CharacterIterator.DONE){
 104             return DONE;
 105         }
 106         return i;
 107     }
 108 
 109     /**
 110      * @see UCharacterIterator#setIndex(int)
 111      */
 112     public void setIndex(int index) {
 113         iterator.setIndex(index);
 114     }
 115 
 116     /**
 117      * @see UCharacterIterator#getText(char[])
 118      */
 119     public int getText(char[] fillIn, int offset){
 120         int length =iterator.getEndIndex() - iterator.getBeginIndex();
 121         int currentIndex = iterator.getIndex();
 122         if(offset < 0 || offset + length > fillIn.length){
 123             throw new IndexOutOfBoundsException(Integer.toString(length));
 124         }
 125 
 126         for (char ch = iterator.first(); ch != CharacterIterator.DONE; ch = iterator.next()) {
 127             fillIn[offset++] = ch;
 128         }
 129         iterator.setIndex(currentIndex);
 130 
 131         return length;
 132     }
 133 
 134     /**
 135      * Creates a clone of this iterator.  Clones the underlying character iterator.
 136      * @see UCharacterIterator#clone()
 137      */
 138     public Object clone(){
 139         try {
 140             CharacterIteratorWrapper result = (CharacterIteratorWrapper) super.clone();
 141             result.iterator = (CharacterIterator)this.iterator.clone();
 142             return result;
 143         } catch (CloneNotSupportedException e) {
 144             return null; // only invoked if bad underlying character iterator
 145         }
 146     }
 147 }