//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1991 - 1992.
//
//  File:   LIST.HXX
//
//  Contents:   Parametrized list class
//
//  Classes:    CList
//
//  History:    4-Apr-91   BartoszM Created.
//              22-May-92  BartoszM Replaced with doubly linked list
//
//----------------------------------------------------------------------------

#pragma once

#include "index.hxx"

//+---------------------------------------------------------------------------
//
//  Class:      CIndexList
//
//  Purpose:    Linked list of indexes
//
//  History:    4-Apr-91   BartoszM    Created.
//
//----------------------------------------------------------------------------

const LONGLONG eSigIndexList = 0x5453494c58444e49i64;   // "INDXLIST"

class CIndexList: public CDoubleList
{
    friend class CIndexIter;

public:

    CIndexList(): _sigIndexList(eSigIndexList),
                  _countWl(0), _count(0), _sizeIndex(0) {}

    unsigned Count () const { return _count; }

    unsigned CountWlist () const { return _countWl; }

    unsigned IndexSize () const { return _sizeIndex; }

    CIndex* GetTop() { return (CIndex *) _Top(); }

    void Add ( CIndex* p );

    CIndex* Remove ( INDEXID iid );

    inline CIndex* RemoveTop ( void );

    void Push ( CIndex* pIndex ) {
        _Push ( pIndex );
        _count++;
        _sizeIndex += pIndex->Size();
    }

#ifdef CIEXTMODE
    void        CiExtDump(void *ciExtSelf);
#endif

private:

    const LONGLONG _sigIndexList; 
    unsigned    _count;
    unsigned    _countWl;
    unsigned    _sizeIndex;
};


//+---------------------------------------------------------------------------
//
//  Class:      CForIndexIter
//
//  Purpose:    Iterator over an index list
//
//  History:    4-Apr-91   BartoszM    Created.
//
//----------------------------------------------------------------------------

class CForIndexIter : public CForwardIter
{
public:

    CForIndexIter ( CIndexList& list ) : CForwardIter(list) {}

    CIndex* operator->() { return (CIndex*) _pLinkCur; }
    CIndex* GetIndex() { return (CIndex*) _pLinkCur; }
};

//+---------------------------------------------------------------------------
//
//  Class:      CForIndexIter
//
//  Purpose:    Iterator over an index list
//
//  History:    4-Apr-91   BartoszM    Created.
//
//----------------------------------------------------------------------------

class CBackIndexIter : public CBackwardIter
{
public:

    CBackIndexIter ( CIndexList& list ) : CBackwardIter(list) {}

    CIndex* operator->() { return (CIndex*) _pLinkCur; }
    CIndex* GetIndex() { return (CIndex*) _pLinkCur; }
};

//+---------------------------------------------------------------------------
//
//  Member:     CIndexList::RemoveTop, public
//
//  History:    04-Apr-91   BartoszM       Created.
//
//----------------------------------------------------------------------------

inline CIndex* CIndexList::RemoveTop ( void )
{
    ciDebugOut (( DEB_ITRACE, "IndexList::RemoveTop\n" ));

    CIndex* pIndex = (CIndex*) _Pop();
    if ( pIndex && pIndex->IsWordlist() )
        _countWl--;
    return pIndex;
}