|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1998.
//
// File: Compare.hxx
//
// Contents: Comparator class for property sets.
//
// Classes: CComparePropSets
//
// History: 07-Jun-92 KyleP Created
//
//--------------------------------------------------------------------------
#pragma once
typedef BOOL (* FRel)(PROPVARIANT const &, PROPVARIANT const &); typedef BOOL (* FPRel)(BYTE const *, BYTE const *); typedef int (* FCmp)(PROPVARIANT const &, PROPVARIANT const &); typedef int (* FPCmp)(BYTE const *, BYTE const *);
typedef int (* FDBCmp)(BYTE const *, ULONG, BYTE const *, ULONG);
class CComparators { public:
static FCmp GetComparator( VARENUM vt ); static FRel GetRelop( VARENUM vt, ULONG rel ); static FPCmp GetPointerComparator( PROPVARIANT const & v1, PROPVARIANT const & v2 ); static FPRel GetPointerRelop( PROPVARIANT const & v1, PROPVARIANT const & v2, ULONG rel );
static FDBCmp GetDBComparator( DBTYPEENUM vt );
private:
//
// There is one SComparators structure for each base variant type.
// They are accessed off aVariantComarators by VT_xxx. Within
// the SComparators structure relops are accessed by PRxxx.
//
struct SComparators { FCmp comparator; FPCmp pointercomparator; FRel relops[9]; FPRel pointerrelops[9]; };
struct SDBComparators { FDBCmp dbcomparator; FDBCmp dbvectorcomparator; };
static ULONG const _iDBStart; static SDBComparators const _aDBComparators[]; static ULONG const _cDBComparators;
static ULONG const _iDBStart2; static SDBComparators const _aDBComparators2[]; static ULONG const _cDBComparators2;
static ULONG const _iDBStart3; static SDBComparators const _aDBComparators3[]; static ULONG const _cDBComparators3;
static DBTYPEENUM _RationalizeDBByRef( DBTYPEENUM vt );
static ULONG const _iStart; static SComparators const _aVariantComparators[]; static ULONG const _cVariantComparators;
static ULONG const _iStart2; static SComparators const _aVariantComparators2[]; static ULONG const _cVariantComparators2;
static ULONG const _iStart3; static SComparators const _aVariantComparators3[]; static ULONG const _cVariantComparators3;
static FRel const _aVectorComparators[]; static ULONG const _cVectorComparators; static FRel const _aVectorComparatorsAll[]; static ULONG const _cVectorComparatorsAll; static FRel const _aVectorComparatorsAny[]; static ULONG const _cVectorComparatorsAny; };
extern CComparators VariantCompare;
//+-------------------------------------------------------------------------
//
// Class: CComparePropSets
//
// Purpose: Compares two property sets for purposes of sorting.
//
// Interface:
//
// History: 07-Jun-92 KyleP Created
//
//--------------------------------------------------------------------------
class CSortSet; class CColumnSet;
class CComparePropSets : INHERIT_UNWIND { INLINE_UNWIND( CComparePropSets )
public:
inline CComparePropSets();
inline ~CComparePropSets();
void Init( int cCols, CSortSet const * psort, int aColIndex[] ); void Init( CColumnSet const & cols );
inline BOOL IsEmpty();
int Compare( PROPVARIANT ** row1, PROPVARIANT ** row2 );
BOOL IsLT( PROPVARIANT ** row1, PROPVARIANT ** row2 );
BOOL IsGT( PROPVARIANT ** row1, PROPVARIANT ** row2 );
BOOL IsEQ( PROPVARIANT ** row1, PROPVARIANT ** row2 );
private:
void _UpdateCompare( UINT iCol, VARENUM vt );
struct SColCompare { int _iCol; // Index of column into row.
ULONG _dir; // Direction
ULONG _pt; // Property type (matches fns below)
//
// LE/GE are a bit of a misnomer. If the sort order for a column
// is reversed ( large to small ) then LE is really GE and
// vice-versa.
//
FCmp _comp; int _DirMult; // -1 if directions reversed.
};
UINT _cColComp; SColCompare * _aColComp; };
//+-------------------------------------------------------------------------
//
// Member: CComparePropSets::CComparePropSets, public
//
// Synopsis: Construct a property set comparator.
//
// History: 16-Jun-92 KyleP Created
//
//--------------------------------------------------------------------------
inline CComparePropSets::CComparePropSets() : _aColComp( 0 ), _cColComp( 0 ) { }
//+-------------------------------------------------------------------------
//
// Member: CComparePropSets::~CComparePropSets, public
//
// Synopsis: Destroy a property set comparator.
//
// History: 16-Jun-92 KyleP Created
//
//--------------------------------------------------------------------------
inline CComparePropSets::~CComparePropSets() { delete _aColComp; }
//+-------------------------------------------------------------------------
//
// Member: CComparePropSets::IsEmpty, public
//
// Returns: TRUE if there is no property set to compare.
//
// History: 16-Jun-92 Author Comment
//
//--------------------------------------------------------------------------
inline BOOL CComparePropSets::IsEmpty() { return( _aColComp == 0 ); }
inline BOOL isVector(VARTYPE vt) { return 0 != ( vt & VT_VECTOR ); }
inline BOOL isVector(PROPVARIANT const & v) { return isVector( v.vt ); }
inline BOOL isArray(VARTYPE vt) { return 0 != ( vt & VT_ARRAY ); }
inline BOOL isArray(PROPVARIANT const & v) { return isArray( v.vt ); }
inline BOOL isVectorOrArray(VARTYPE vt) { return 0 != ( vt & (VT_ARRAY|VT_VECTOR) ); }
inline BOOL isVectorOrArray(PROPVARIANT const & v) { return isVectorOrArray( v.vt ); }
inline BOOL isVectorRelop(ULONG relop) { return relop & (PRAny | PRAll); }
inline BOOL isRelopAny(ULONG relop) { return relop & PRAny; }
inline BOOL isRelopAll(ULONG relop) { return relop & PRAll; }
inline VARENUM getBaseType(PROPVARIANT const &v) { return (VARENUM) (VT_TYPEMASK & v.vt); }
inline ULONG getBaseRelop(ULONG relop) { return relop & ~(PRAny | PRAll); }
BOOL VT_VARIANT_LT( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VARIANT_LE( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VARIANT_GE( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VARIANT_GT( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VARIANT_EQ( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VARIANT_NE( PROPVARIANT const & v1, PROPVARIANT const & v2 );
#if 0
BOOL VT_VECTOR_LT( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VECTOR_LE( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VECTOR_GT( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VECTOR_GE( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VECTOR_EQ( PROPVARIANT const & v1, PROPVARIANT const & v2 ); BOOL VT_VECTOR_NE( PROPVARIANT const & v1, PROPVARIANT const & v2 ); #endif
|