/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_container_XEnumeration_idl__ 
#define __com_sun_star_container_XEnumeration_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_container_NoSuchElementException_idl__ 
#include <com/sun/star/container/NoSuchElementException.idl> 
#endif 
 
#ifndef __com_sun_star_lang_WrappedTargetException_idl__ 
#include <com/sun/star/lang/WrappedTargetException.idl> 
#endif 
 
 
//============================================================================= 
 
module com {  module sun {  module star {  module container {  
 
//============================================================================= 
 
/** provides functionality to enumerate the contents of a container.
	
	<p>An object that implements the <type>XEnumeration</type> interface
	generates a series of elements, one at a time. Successive calls to
	the <code>XEnumeration::nextElement</code> method return successive 
	elements of the series.  </p>

	<p>For example (Java), to print all elements of a vector <var>aVect</var>: 
	</p>

	<listing>
	for ( XEnumeration xEnum = aVect.elements() ; 
	xEnum.hasMoreElements() ; ) 
	{
	System.out.println( xEnum.nextElement() );
	}
	</listing>
	
	
	<p> If the object changed, the behavior of the enumeration is 
	not specified. This is not a remote interface.  </p>
 */
published interface XEnumeration: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** tests whether this enumeration contains more elements.
	 */
	boolean hasMoreElements(); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns      
			the next element of this enumeration.  
				 
		@throws  NoSuchElementException   
			if no more elements exist. 
				 
		@throws  com::sun::star::lang::WrappedTargetException  
			If the implementation has internal reasons for exceptions,  
			then wrap these in a <type scope="com::sun::star::lang">WrappedTargetException</type> 
			exception.
	 */
	any nextElement() 
			raises( com::sun::star::container::NoSuchElementException, 
					com::sun::star::lang::WrappedTargetException ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
