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.
251 lines
6.5 KiB
251 lines
6.5 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) 1991-1992, Microsoft Corporation.
|
|
//
|
|
// File: RECOGNIZ.HXX
|
|
//
|
|
// Contents: Expression to cursor converter
|
|
//
|
|
// Classes: CScanRst
|
|
//
|
|
// History: 16-Sep-94 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
class CRestriction;
|
|
class CNodeRestriction;
|
|
|
|
enum DetectorType
|
|
{
|
|
DetSingleKey,
|
|
DetRange,
|
|
DetPrefix
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CDetector
|
|
//
|
|
// Purpose: The detector of keys
|
|
//
|
|
// History: 01-Oct-94 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
class CDetector
|
|
{
|
|
public:
|
|
CDetector ( const CKey& key ) : _key(key) {}
|
|
virtual ~CDetector() {}
|
|
virtual BOOL Match ( const CKeyBuf& key ) const = 0;
|
|
virtual DetectorType Type() const = 0;
|
|
const CKey* GetKey () const { return &_key; }
|
|
virtual const CKey* GetSecondKey () const { return 0; }
|
|
BOOL PidMatch ( PROPID pid ) const
|
|
{
|
|
return _key.Pid() == pidAll || _key.Pid() == pid;
|
|
}
|
|
protected:
|
|
const CKey& _key;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CKeyDetector
|
|
//
|
|
// Purpose: Detects a single key
|
|
//
|
|
// History: 01-Oct-94 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
class CKeyDetector: public CDetector
|
|
{
|
|
public:
|
|
CKeyDetector ( const CKey& key ) : CDetector (key) { }
|
|
BOOL Match ( const CKeyBuf& key ) const;
|
|
DetectorType Type () const;
|
|
private:
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CKeyRangeDetector
|
|
//
|
|
// Purpose: Detects a range of keys
|
|
//
|
|
// History: 01-Oct-94 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
class CKeyRangeDetector: public CDetector
|
|
{
|
|
public:
|
|
|
|
CKeyRangeDetector ( const CKey& keyStart, const CKey& keyEnd )
|
|
: CDetector (keyStart), _keyEnd(keyEnd)
|
|
{ }
|
|
|
|
BOOL Match ( const CKeyBuf& key ) const;
|
|
DetectorType Type () const;
|
|
const CKey* GetSecondKey () const { return &_keyEnd; }
|
|
private:
|
|
const CKey& _keyEnd;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CKeyPrefixDetector
|
|
//
|
|
// Purpose: Detects a range of keys sharing the same prefix
|
|
//
|
|
// History: 01-Oct-94 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
class CKeyPrefixDetector: public CDetector
|
|
{
|
|
public:
|
|
|
|
CKeyPrefixDetector ( const CKey& key )
|
|
: CDetector (key)
|
|
{
|
|
_keyEnd.FillMax (key);
|
|
}
|
|
|
|
BOOL Match ( const CKeyBuf& key ) const;
|
|
DetectorType Type () const;
|
|
|
|
private:
|
|
CKey _keyEnd;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CRegionHit
|
|
//
|
|
// Purpose: Combine filter region with occurrence
|
|
//
|
|
// History: 06-Oct-94 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
class CRegionHit: public CDoubleLink
|
|
{
|
|
public:
|
|
CRegionHit ( const FILTERREGION& region, OCCURRENCE occ )
|
|
: _region(region), _occ(occ)
|
|
{}
|
|
const FILTERREGION& Region () const { return _region; }
|
|
OCCURRENCE Occurrence () const { return _occ; }
|
|
// int Compare ( const CRegionHit& reg ) const;
|
|
private:
|
|
|
|
FILTERREGION _region;
|
|
OCCURRENCE _occ;
|
|
};
|
|
|
|
class CRegionList: public CDoubleList
|
|
{
|
|
public:
|
|
~CRegionList();
|
|
void Insert ( CRegionHit* pHit );
|
|
};
|
|
|
|
|
|
// class CForFooIter : public CForwardIter
|
|
// {
|
|
// public:
|
|
//
|
|
// CForFooIter ( CFooList& list ) : CForwardIter(list) {}
|
|
//
|
|
// CFoo* operator->() { return (CFoo*) _pLinkCur; }
|
|
// CFoo* GetFoo() { return (CFoo*) _pLinkCur; }
|
|
// };
|
|
|
|
class CRegionIter: public CForwardIter
|
|
{
|
|
public:
|
|
CRegionIter (CRegionList& list): CForwardIter(list) {}
|
|
CRegionHit* operator->() { return (CRegionHit*) _pLinkCur; }
|
|
CRegionHit* GetRegionHit () { return (CRegionHit*) _pLinkCur; }
|
|
};
|
|
|
|
class CRegionBackIter: public CBackwardIter
|
|
{
|
|
public:
|
|
CRegionBackIter (CRegionList& list): CBackwardIter(list) {}
|
|
CRegionHit* operator->() { return (CRegionHit*) _pLinkCur; }
|
|
CRegionHit* GetRegionHit () { return (CRegionHit*) _pLinkCur; }
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: Compare
|
|
//
|
|
// Synopsis: Compares filter regions
|
|
//
|
|
// History: 29-Sep-94 BartoszM Created.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
inline BOOL Compare ( const FILTERREGION& reg1, const FILTERREGION& reg2 )
|
|
{
|
|
if (reg1.idChunk == reg2.idChunk)
|
|
{
|
|
return ( reg1.cwcStart - reg2.cwcStart );
|
|
}
|
|
else
|
|
return reg1.idChunk - reg2.idChunk;
|
|
}
|
|
|
|
|
|
DECL_DYNSTACK(CDetectorArray, CDetector);
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CRecognizer
|
|
//
|
|
// Purpose: The recognizer of keys
|
|
//
|
|
// History: 30-Sep-94 BartoszM Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CRecognizer: INHERIT_UNWIND
|
|
{
|
|
DECLARE_UNWIND
|
|
public:
|
|
CRecognizer ();
|
|
~CRecognizer ();
|
|
void MakeDetectors ( const CRestriction* pRst );
|
|
|
|
int Count () const { return _aDetector.Count(); }
|
|
BOOL Match ( const CKeyBuf& key );
|
|
void Record ( const FILTERREGION& region, OCCURRENCE occ );
|
|
|
|
CRegionList& GetRegionList ( int i ) const
|
|
{
|
|
Win4Assert ( i >= 0 );
|
|
Win4Assert ( i < Count() );
|
|
return _aRegionList [i];
|
|
}
|
|
|
|
int FindDet (DetectorType type, const CKey* pKey, const CKey* pKey2 = 0) const;
|
|
|
|
private:
|
|
|
|
void AddKey ( const CKey* pKey );
|
|
void AddRange ( const CKey* pKeyStart, const CKey* pKeyEnd );
|
|
void AddKeyArray ( const CKeyArray& keyArray, BOOL isRange );
|
|
void AddPrefix ( const CKey* pKey );
|
|
|
|
void ScanRst ( const CRestriction* pRst );
|
|
void ScanNode ( const CNodeRestriction* pRst );
|
|
void ScanLeaf ( const CRestriction* pRst );
|
|
|
|
int _iDet;
|
|
CDetectorArray _aDetector;
|
|
|
|
// array of lists corresponding to detectors
|
|
CRegionList* _aRegionList;
|
|
};
|
|
|
|
|