mirror of https://github.com/tongzx/nt5src
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.
275 lines
7.2 KiB
275 lines
7.2 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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
|