/*++

Copyright (c) 1990  Microsoft Corporation

Module Name:

	arrayit.hxx

Abstract:

	This module contains the declaration for the ARRAY_ITERATOR class. 
	ARRAY_ITERATOR is a concrete implementation derived from the abstarct
	ITERATOR class. It is used to 'read' (iterate) over an ARRAY object.
	It has no public constructor and therefore can only be queried from an
	ARRAY object. It is the client's responsibility to detsroy 
	ARRAY_ITERATORs when they are done. ARRAY_ITERATORs maintain the currency
	for reading an ARRAY in order.

Environment:

	ULIB, User Mode

--*/

#if ! defined( _ARRAY_ITERATOR_ )

#define _ARRAY_ITERATOR_

#include "iterator.hxx"

//
//	Forward references
//

DECLARE_CLASS( ARRAY );
DECLARE_CLASS( ARRAY_ITERATOR );


class ARRAY_ITERATOR : public ITERATOR {

    friend ARRAY;

	public:

		VIRTUAL
		~ARRAY_ITERATOR(
			);

        VIRTUAL
        VOID
        Reset(
            );

		VIRTUAL
		POBJECT
		GetCurrent(
			);

		VIRTUAL
		POBJECT
		GetNext(
			);

		VIRTUAL
		POBJECT
		GetPrevious(
			);

        NONVIRTUAL
        ULONG
        QueryCurrentIndex(
            );

	protected:

        DECLARE_CAST_MEMBER_FUNCTION( ARRAY_ITERATOR );
		DECLARE_CONSTRUCTOR( ARRAY_ITERATOR );

        NONVIRTUAL
        BOOLEAN
        Initialize(
            IN OUT  PARRAY  Array
            );

        NONVIRTUAL
        VOID
        Construct(
            );

    private:

        PARRAY  _Array;         //  Array
        ULONG   _CurrentIndex;  //  Current index

};


INLINE
ULONG
ARRAY_ITERATOR::QueryCurrentIndex(
    )
/*++

Routine Description:

    Obtains the current index

Arguments:

    None

Return Value:

    ULONG   -   The current index

--*/

{
    return _CurrentIndex;
}
#endif // _ARRAY_ITERATOR_