218 lines
5.8 KiB
C++
218 lines
5.8 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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();
|
||
|
}
|