/* GENERATED SOURCE. DO NOT MODIFY. */
/*
******************************************************************************
* Copyright (C) 2004-2009, International Business Machines Corporation and   *
* others. All Rights Reserved.                                               *
******************************************************************************
*/

package android.icu.util;

import java.util.NoSuchElementException;

/**
 * <p>Class for enabling iteration over UResourceBundle objects.
 * Example of use:<br>
 * <pre>
 * ICUResourceBundleIterator iterator = resB.getIterator();
 * ICUResourceBundle temp;
 * while (iterator.hasNext()) {
 *    temp = iterartor.next();  
 *    int type = temp.getType();
 *    switch(type){
 *      case UResourceBundle.STRING:
 *          str = temp.getString();
 *          break;
 *      case UResourceBundle.INT:
 *          integer = temp.getInt();
 *          break;
 *     .....
 *    }
 *   // do something interesting with data collected
 * }
 * </pre>
 * @author ram
 * @hide Only a subset of ICU is exposed in Android
 * @hide All android.icu classes are currently hidden
 */
public class UResourceBundleIterator{
    private UResourceBundle bundle;
    private int index = 0;
    private int size = 0;
    /**
     * Construct a resource bundle iterator for the
     * given resource bundle
     * 
     * @param bndl The resource bundle to iterate over
     */
    public UResourceBundleIterator(UResourceBundle bndl){
        bundle = bndl;   
        size = bundle.getSize();
    }

    /**
     * Returns the next element of this iterator if this iterator object has at least one more element to provide
     * @return the UResourceBundle object
     * @throws NoSuchElementException If there does not exist such an element.
     */
    public UResourceBundle next()throws NoSuchElementException{
        if(index<size){
            return bundle.get(index++);
        }
        throw new NoSuchElementException();
    }
    /**
     * Returns the next String of this iterator if this iterator object has at least one more element to provide
     * @return the UResourceBundle object
     * @throws NoSuchElementException If there does not exist such an element.
     * @throws UResourceTypeMismatchException If resource has a type mismatch.
     */
    public String nextString()throws NoSuchElementException, UResourceTypeMismatchException{
        if(index<size){
            return bundle.getString(index++);
        }  
        throw new NoSuchElementException();
    }
    
    /**
     * Resets the internal context of a resource so that iteration starts from the first element.
     */
    public void reset(){
        //reset the internal context   
        index = 0;
    }
    
    /**
     * Checks whether the given resource has another element to iterate over.
     * @return TRUE if there are more elements, FALSE if there is no more elements
     */
    public boolean hasNext(){
        return index < size;   
    }
}