Source code of Windows XP (NT5)
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, 1991 - 1992.
//
// File: ANDCUR.CXX
//
// Contents: And Cursor
//
// Classes: CAndCursor
//
// History: 24-May-91 BartoszM Created.
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "andncur.hxx"
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::CAndNotCursor, public
//
// Synopsis: Create a cursor that takes the wids from the first child and
// returns only the ones that do not occur in the second child
//
// Arguments: [pSourceCur] -- the first child cursor
// [pFilterCur] -- the second child cursor
//
// Notes: All cursors must come from the same index
// and the same property
//
// History: 22-Apr-92 AmyA Created
//
//----------------------------------------------------------------------------
CAndNotCursor::CAndNotCursor( XCursor & curSource, XCursor & curFilter ) : _curSource( curSource ), _curFilter( curFilter ) { _iid = _curSource->IndexId(); _pid = _curSource->Pid();
_wid = _curSource->WorkId();
FindDisjunction();
END_CONSTRUCTION( CAndNotCursor ); }
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::~CAndNotCursor, public
//
// Synopsis: Delete the cursor together with children
//
// History: 22-Apr-92 AmyA Created
//
//----------------------------------------------------------------------------
CAndNotCursor::~CAndNotCursor( ) { }
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::WorkId, public
//
// Synopsis: Get current work id.
//
// History: 22-Apr-92 AmyA Created
//
//----------------------------------------------------------------------------
WORKID CAndNotCursor::WorkId() { return _wid; }
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::NextWorkID, public
//
// Synopsis: Move to next work id
//
// Returns: The next work id of the source that is not in the filter.
//
// History: 23-Apr-92 AmyA Created
//
//----------------------------------------------------------------------------
WORKID CAndNotCursor::NextWorkId() { _wid = _curSource->NextWorkId(); FindDisjunction(); return _wid; }
void CAndNotCursor::RatioFinished (ULONG& denom, ULONG& num) { _curSource->RatioFinished (denom, num); }
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::HitCount, public
//
// Synopsis: Returns HitCount of the source cursor.
//
// Requires: _wid set to any of the current wid's
//
// Returns: HitCount of the source cursor.
//
// History: 23-Apr-92 AmyA Created
//
//----------------------------------------------------------------------------
ULONG CAndNotCursor::HitCount() { return _curSource->HitCount(); }
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::Rank, public
//
// Synopsis: Returns Rank of the source cursor.
//
// Requires: _wid set to any of the current wid's
//
// Returns: Rank of the source cursor.
//
// History: 23-Apr-92 AmyA Created
//
//----------------------------------------------------------------------------
LONG CAndNotCursor::Rank() { return _curSource->Rank(); }
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::FindDisjunction, private
//
// Synopsis: Find the first work id that occurs in the source cursor but
// not in the filter cursor.
//
// Requires: _wid set to any of the current wid's and _widFilter to be set
// to either a wid in _curFilter or widInvalid.
//
// Modifies: [_wid] to point to disjunction or to widInvalid and _widFilter
// to be greater than _wid or to be widInvalid.
//
// History: 23-Apr-92 AmyA Created
//
// Notes: If cursors are in disjunction, no change results
//
//----------------------------------------------------------------------------
void CAndNotCursor::FindDisjunction () { register WORKID widFilter = _curFilter->WorkId();
while ( _wid != widInvalid ) { while ( widFilter < _wid ) widFilter = _curFilter->NextWorkId();
if ( _wid != widFilter ) // Found a disjunction
return;
_wid = _curSource->NextWorkId(); // the current wid must occur in
// both cursors, so try again.
} }
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::Hit, public
//
// Synopsis: Hits source if filter IsEmpty()
//
// History: 07-Sep-92 MikeHew Created
//
// Notes: Hit() should not be called more than once
//
//----------------------------------------------------------------------------
LONG CAndNotCursor::Hit() { if ( _curFilter->IsEmpty() ) { return _curSource->Hit(); } else { return rankInvalid; } }
//+---------------------------------------------------------------------------
//
// Member: CAndNotCursor::NextHit, public
//
// Synopsis: NextHits source
//
// History: 07-Sep-92 MikeHew Created
//
// Notes: NextHit() should not be called either Hit() or NextHit()
// have returned rankInvalid
//
//----------------------------------------------------------------------------
LONG CAndNotCursor::NextHit() { return _curSource->NextHit(); }
|