146 lines
2.6 KiB
C++
146 lines
2.6 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
spaset.hxx
|
|
|
|
Abstract:
|
|
|
|
This class implements a sparse number set with huge (<= ULONG) number
|
|
of elements. The numset.cxx implementation uses too much memory when
|
|
the number of elements is in the 100,000 range. The numbers stored are
|
|
not in any particular order and this implementation only supports a
|
|
subset of set operations.
|
|
|
|
Author:
|
|
|
|
Daniel Chan (danielch) 01-29-97
|
|
|
|
--*/
|
|
|
|
#if !defined(SPARSE_SET_DEFN)
|
|
|
|
#define SPARSE_SET_DEFN
|
|
|
|
#include "bigint.hxx"
|
|
|
|
#if defined ( _AUTOCHECK_ )
|
|
#define IFSUTIL_EXPORT
|
|
#elif defined ( _IFSUTIL_MEMBER_ )
|
|
#define IFSUTIL_EXPORT __declspec(dllexport)
|
|
#else
|
|
#define IFSUTIL_EXPORT __declspec(dllimport)
|
|
#endif
|
|
|
|
CONST USHORT SPA_SET_HASH_TABLE_SIZE = 256;
|
|
CONST ULONG SPA_SET_HASH_ELEMENT_INC = 50;
|
|
|
|
|
|
DECLARE_CLASS( SPARSE_SET );
|
|
|
|
typedef struct _HASH_ELEMENT {
|
|
|
|
BIG_INT elementCount; // number of elements in elements
|
|
BIG_INT maxElementCount; // max. number of elements in element
|
|
PBIG_INT elements; // pointer to an array of BIG_INTs
|
|
};
|
|
|
|
|
|
DEFINE_TYPE( _HASH_ELEMENT, HASH_ELEMENT );
|
|
|
|
class SPARSE_SET : public OBJECT {
|
|
|
|
public:
|
|
|
|
IFSUTIL_EXPORT
|
|
DECLARE_CONSTRUCTOR( SPARSE_SET );
|
|
|
|
VIRTUAL
|
|
IFSUTIL_EXPORT
|
|
~SPARSE_SET(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
IFSUTIL_EXPORT
|
|
BOOLEAN
|
|
Initialize(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
IFSUTIL_EXPORT
|
|
BOOLEAN
|
|
CheckAndAdd(
|
|
IN BIG_INT Number,
|
|
OUT PBOOLEAN Duplicate DEFAULT NULL
|
|
);
|
|
|
|
NONVIRTUAL
|
|
IFSUTIL_EXPORT
|
|
BOOLEAN
|
|
RemoveAll(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
IFSUTIL_EXPORT
|
|
BOOLEAN
|
|
CheckAndRemove(
|
|
IN BIG_INT Number,
|
|
OUT PBOOLEAN DoesExists DEFAULT NULL
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BIG_INT
|
|
QueryCardinality(
|
|
) CONST;
|
|
|
|
NONVIRTUAL
|
|
IFSUTIL_EXPORT
|
|
VOID
|
|
DumpHashTable(
|
|
);
|
|
|
|
private:
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Construct (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Destroy(
|
|
);
|
|
|
|
PHASH_ELEMENT _hashTable;
|
|
BIG_INT _card;
|
|
|
|
};
|
|
|
|
|
|
INLINE
|
|
BIG_INT
|
|
SPARSE_SET::QueryCardinality(
|
|
) CONST
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine computes the number of elements in the set.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
The number of elements in the set.
|
|
|
|
--*/
|
|
{
|
|
return _card;
|
|
}
|
|
|
|
#endif // SPARSE_SET_DEFN
|