258 lines
4.2 KiB
C++
258 lines
4.2 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
numset.hxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This class implements a sparse number set. The number are
|
||
|
stored in ascending order.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#if !defined(NUMBER_SET_DEFN)
|
||
|
|
||
|
#define NUMBER_SET_DEFN
|
||
|
|
||
|
#include "bigint.hxx"
|
||
|
#include "list.hxx"
|
||
|
|
||
|
#if defined ( _AUTOCHECK_ ) || defined( _EFICHECK_ )
|
||
|
#define IFSUTIL_EXPORT
|
||
|
#elif defined ( _IFSUTIL_MEMBER_ )
|
||
|
#define IFSUTIL_EXPORT __declspec(dllexport)
|
||
|
#else
|
||
|
#define IFSUTIL_EXPORT __declspec(dllimport)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
DECLARE_CLASS( NUMBER_SET );
|
||
|
|
||
|
class NUMBER_EXTENT : public OBJECT {
|
||
|
|
||
|
public:
|
||
|
|
||
|
DECLARE_CONSTRUCTOR( NUMBER_EXTENT );
|
||
|
|
||
|
BIG_INT Start;
|
||
|
BIG_INT Length;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
DEFINE_POINTER_TYPES(NUMBER_EXTENT);
|
||
|
|
||
|
class NUMBER_SET : public OBJECT {
|
||
|
|
||
|
public:
|
||
|
|
||
|
IFSUTIL_EXPORT
|
||
|
DECLARE_CONSTRUCTOR( NUMBER_SET );
|
||
|
|
||
|
VIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
~NUMBER_SET(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Initialize(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Add(
|
||
|
IN BIG_INT Number
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
AddStart(
|
||
|
IN BIG_INT Number
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
AddNext(
|
||
|
IN BIG_INT Number
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Add(
|
||
|
IN BIG_INT Start,
|
||
|
IN BIG_INT Length
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Add(
|
||
|
IN PCNUMBER_SET NumberSet
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
CheckAndAdd(
|
||
|
IN BIG_INT Number,
|
||
|
OUT PBOOLEAN Duplicate
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Remove(
|
||
|
IN BIG_INT Number
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
RemoveAll(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
CheckAndRemove(
|
||
|
IN BIG_INT Number,
|
||
|
OUT PBOOLEAN DoesExists
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Remove(
|
||
|
IN BIG_INT Start,
|
||
|
IN BIG_INT Length
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Remove(
|
||
|
IN PCNUMBER_SET NumberSet
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
BIG_INT
|
||
|
QueryCardinality(
|
||
|
) CONST;
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BIG_INT
|
||
|
QueryNumber(
|
||
|
IN BIG_INT Index
|
||
|
) CONST;
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
DoesIntersectSet(
|
||
|
IN BIG_INT Start,
|
||
|
IN BIG_INT Length
|
||
|
) CONST;
|
||
|
|
||
|
NONVIRTUAL
|
||
|
ULONG
|
||
|
QueryNumDisjointRanges(
|
||
|
) CONST;
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
VOID
|
||
|
QueryDisjointRange(
|
||
|
IN ULONG Index,
|
||
|
OUT PBIG_INT Start,
|
||
|
OUT PBIG_INT Length
|
||
|
) CONST;
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
QueryContainingRange(
|
||
|
IN BIG_INT Number,
|
||
|
OUT PBIG_INT Start,
|
||
|
OUT PBIG_INT Length
|
||
|
) CONST;
|
||
|
|
||
|
private:
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
Construct (
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
Destroy(
|
||
|
);
|
||
|
|
||
|
LIST _list;
|
||
|
BIG_INT _card;
|
||
|
PITERATOR _iterator;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
BIG_INT
|
||
|
NUMBER_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;
|
||
|
}
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
ULONG
|
||
|
NUMBER_SET::QueryNumDisjointRanges(
|
||
|
) CONST
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine computes the number of disjoint ranges contained
|
||
|
in this number set.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
The number of disjoint ranges contained in this number set.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return _list.QueryMemberCount();
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif // NUMBER_SET_DEFN
|