Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: IdxLst.cxx
//
// Contents: Index list.
//
// Classes: CIndexList
//
// History: 04-Apr-92 BartoszM Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "idxlst.hxx"
#include "index.hxx"
//+---------------------------------------------------------------------------
//
// Member: CIndexList::Add, public
//
// Arguments: [pIndex] -- index pointer
//
// History: 04-Apr-91 BartoszM Created.
//
// Notes: It is a circular list, wordlist are forward from the root,
// persistent indexes, from big to small, backward from
// the root.
//
//----------------------------------------------------------------------------
void CIndexList::Add ( CIndex* pIndex ) { ciDebugOut (( DEB_ITRACE, "IndexList::Add %x\n", pIndex->GetId() ));
// wordlists to the right
if ( pIndex->IsWordlist() ) { Push (pIndex); _countWl++; } else { unsigned size = pIndex->Size();
// walk the list backwards from root
for ( CBackIndexIter iter(*this); !AtEnd(iter); BackUp(iter) ) { if ( iter->IsWordlist() || iter->Size() <= size ) { pIndex->InsertAfter(iter.GetIndex()); _count++; _sizeIndex += pIndex->Size(); return; } }
// reached the end
ciAssert( AtEnd(iter) ); Push (pIndex); } }
//+---------------------------------------------------------------------------
//
// Member: CIndexList::Remove, public
//
// Arguments: [iid] -- index id
//
// Returns: pointer to the removed index
//
// History: 04-Apr-91 BartoszM Created.
//
//----------------------------------------------------------------------------
CIndex* CIndexList::Remove ( INDEXID iid ) { ciDebugOut (( DEB_ITRACE, "IndexList::Remove %x\n", iid ));
if ( IsEmpty() ) return 0;
for ( CForIndexIter iter(*this); !AtEnd(iter); Advance(iter) ) { ciDebugOut((DEB_CAT,"\t%x [%d]\n", iter->GetId(), iter->Size()));
if ( iter->GetId() == iid ) { iter->Unlink(); _count--; _sizeIndex -= iter->Size();
Win4Assert( (_count == 0 && _sizeIndex == 0) || (_count > 0 && _sizeIndex > 0) );
if ( iter->IsWordlist() ) _countWl--; break; } }
if ( AtEnd(iter) ) return( 0 ); else return iter.GetIndex(); }
|