276 lines
7.2 KiB
C++
276 lines
7.2 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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
|