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.
 
 
 
 
 
 

251 lines
6.3 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;
};