/**************************************************************
 * 
 * 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 __FRAMEWORK_CLASSES_CHECKEDITERATOR_HXX_
#define __FRAMEWORK_CLASSES_CHECKEDITERATOR_HXX_

//_________________________________________________________________________________________________________________
//	my own includes
//_________________________________________________________________________________________________________________

#include <macros/debug.hxx>

//_________________________________________________________________________________________________________________
//	interface includes
//_________________________________________________________________________________________________________________

//_________________________________________________________________________________________________________________
//	other includes
//_________________________________________________________________________________________________________________
#include <sal/types.h>

#ifndef __SGI_STL_ITERATOR
#include <iterator>
#endif

//_________________________________________________________________________________________________________________
//	namespace
//_________________________________________________________________________________________________________________

namespace framework{

//_________________________________________________________________________________________________________________
//	exported const
//_________________________________________________________________________________________________________________

//_________________________________________________________________________________________________________________
//	exported definitions
//_________________________________________________________________________________________________________________

/*-************************************************************************************************************//**
	@short          implement a iterator which support 2 end states!
	@descr			For our search methods we need a "walking" iterator object with special functionality!
					We must check for 3 different states of an iterator - normal position, exact end, after end.
					It's necessary to detect if we have not found a entry and must return our default or
					default already returned and we must break loop!
					see using in class FilterCache too for further informations!

	@Attention		If your wish to debug this inline code ...
					under windows and msdev you can use "set ENVCFLAGS=/Ob0" to do that!

	@implements		-
	@base			-

	@devstatus		ready to use
	@threadsafe		no
*//*-*************************************************************************************************************/

template< class TContainer >
class CheckedIterator
{
	//-------------------------------------------------------------------------------------------------------------
	//	public methods
	//-------------------------------------------------------------------------------------------------------------

	public:

		//---------------------------------------------------------------------------------------------------------
		// constructor / destructor
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		standard constructor
			@descr		Set default values on members.
						We set it internal to E_UNKNOWN to detect uninitialized instances of this class.
						If we found one - we know: "We must call initialize first!"

			@seealso	-

			@param		-
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		inline CheckedIterator()
                :   m_eEndState ( E_UNKNOWN )
                ,   m_pContainer( NULL      )
		{
		}

		//---------------------------------------------------------------------------------------------------------
		// interface methods
		//---------------------------------------------------------------------------------------------------------

		/*-****************************************************************************************************//**
			@short		initialize instance with valid container
			@descr		Set new container at an instance of this class. The other member will set automatically!
						m_pPosition = first element in container
						m_eEndState = BEFOREEND

			@seealso	-

            @param      "rContainer", must be a valid reference to an existing container.
			@return		-

			@onerror	An assertion is thrown.
		*//*-*****************************************************************************************************/

        inline void initialize( const TContainer& rContainer )
		{
			// Check incoming parameter. We don't accept all!
            LOG_ASSERT2( &rContainer==NULL      , "CheckedIterator::initialize()", "Invalid parameter detected!"                        )
			LOG_ASSERT2( m_eEndState!=E_UNKNOWN	, "CheckedIterator::initialize()", "Instance already initialized! Don't do it again."	)

			if( m_eEndState == E_UNKNOWN )
			{
				// Set new container and update other member.
                m_pContainer = &rContainer          ;
                m_eEndState  = E_BEFOREEND          ;
                m_pPosition  = m_pContainer->begin();
			}
		}

		/*-****************************************************************************************************//**
			@short		set internal states to E_END
			@descr		Sometimes we need a "walking" check-iterator which is initialized with the END-state!
						We need it to return one default value if no other ones exist ...

			@seealso	using in class FilterCache!

			@param		-
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		inline void setEnd()
		{
            m_pContainer = NULL  ;
            m_eEndState  = E_END ;
		}

		/*-****************************************************************************************************//**
			@short		set internal states to E_AFTEREND
			@descr		Sometimes we need a "walking" check-iterator which is initialized with AFTEREND-state!
						We need it if we don't have a container but must prevent us against further searching!

			@seealso	using in class FilterCache!

			@param		-
			@return		-

			@onerror	-
		*//*-*****************************************************************************************************/

		inline void setAfterEnd()
		{
            m_pContainer = NULL       ;
            m_eEndState  = E_AFTEREND ;
		}

        /*-****************************************************************************************************//**
            @short      reset this iterator
            @descr      It must be called on an already initialized iterator.
                        Means the member m_pContainer must be valid. Otherwhise the reaction
                        isn't defined.

            @param      -
            @return     -

            @onerror    -
        *//*-*****************************************************************************************************/

        inline void reset()
        {
            m_eEndState  = E_UNKNOWN;
            m_pContainer = NULL;
        }

		/*-****************************************************************************************************//**
			@short		step to next element in container.
			@descr		If end of container is reached we change our internal "m_eEndState".
						If end reached for first time; we set it to E_END;
						If you step to next element again; we set it to E_AFTEREND.
						So you have a chance to differ between "exact end" and "after end"!

			@seealso	method isEnd()
			@seealso	method isAfterEnd()

			@param		-
			@return		A reference to our changed object himself.

			@onerror	-
		*//*-*****************************************************************************************************/

		inline CheckedIterator& operator++()
		{
			// Warn programmer if he forget to initailize object!
            LOG_ASSERT2( m_pContainer==NULL, "CheckedIterator::operator++()", "Object not initialized!" )
			// Step to next element if any exist or set our end states.
			switch( m_eEndState )
			{
				case E_BEFOREEND:	{
                                        ++m_pPosition;
                                        // If iterator reaching end ... set right state!
                                        if( m_pPosition == m_pContainer->end() )
										{
											m_eEndState = E_END;
										}
									}
									break;
				case E_END		:	{
                                        // Set state only ... iterator already points to end of container!
										m_eEndState = E_AFTEREND;
									}
									break;
			}
			return *this;
		}

		/*-****************************************************************************************************//**
			@short		return true if internal iterator was not initialized before
			@descr		These will be true, if use start a new search by using these iterator mechanism!

			@seealso	class FilterCache

			@param		-
			@return		True if internalk state E_UNKNOWN - false otherwise.

			@onerror	-
		*//*-*****************************************************************************************************/

		inline sal_Bool isUninitialized()
		{
			return( m_eEndState == E_UNKNOWN );
		}

		/*-****************************************************************************************************//**
			@short		return true if internal iterator reached end of container
			@descr		These will be true if you step to the end of internal container.

			@seealso	method isAfterEnd()

			@param		-
			@return		True if end reached; false otherwise.

			@onerror	-
		*//*-*****************************************************************************************************/

		inline sal_Bool isEnd()
		{
			// Is true if one end state is set!
			return	(
						( m_eEndState == E_END		)	||
						( m_eEndState == E_AFTEREND	)
					);
		}

		/*-****************************************************************************************************//**
			@short		return true if you call operator++ again and end already reached
			@descr		These indicate, that end already reached but you call operator++ again and again!

			@seealso	method isEnd()

			@param		-
			@return		True if end multiple reached; false otherwise.

			@onerror	-
		*//*-*****************************************************************************************************/

		inline sal_Bool isAfterEnd()
		{
			// Is true only, if special end state is set!
			return( m_eEndState == E_AFTEREND );
		}

		/*-****************************************************************************************************//**
			@short		support readonly access to container entry
			@descr		Use it to get the value of current container item.

			@seealso	-

			@param		-
			@return		A reference to value of container entry.

			@onerror	-
		*//*-*****************************************************************************************************/

		inline typename TContainer::const_iterator getEntry()
		{
			// Warn programmer if he forget to initialize these object ...
            LOG_ASSERT2( m_pContainer==NULL, "CheckedIterator::getEntry()", "Object not initialized!" )
			// or try to read a non existing element!
            LOG_ASSERT2( m_eEndState!=E_BEFOREEND, "CheckedIterator::getEntry()", "Wrong using of class detected!" )

            return m_pPosition;
		}

	//-------------------------------------------------------------------------------------------------------------
	//	private member
	//-------------------------------------------------------------------------------------------------------------

	private:

		// These enum defines our four states for an iterator position in curent container.
		enum EEndState
		{
			E_UNKNOWN	,
			E_BEFOREEND	,
			E_END		,
			E_AFTEREND
		};

        const TContainer*           m_pContainer    ;   // pointer to current container
        EEndState                   m_eEndState     ;   // "position state" of iterator!
        typename TContainer::const_iterator  m_pPosition     ;   // point to actual element in container
};

}		//	namespace framework

#endif	//	#ifndef __FRAMEWORK_CLASSES_CHECKEDITERATOR_HXX_
