Windows2003-3790/inetcore/outlookexpress/inetcomm/imnxport/range.h
2020-09-30 16:53:55 +02:00

115 lines
4.4 KiB
C++

//
// RANGE.H
//
// 2-20-96: (EricAn)
// Hacked from the Route66 source tree, eliminated stuff we don't use.
// Original copyright below - where did this thing come from?
// 8-96: Functions added to facilitate finding of "anti" lists
//
// -*- C -*-
//--------------------------------------------------------------------------------------
//
// Module: range.h
//
// Description: Definition of a class to manipulate range lists
// (e.g. 1-6,7,10-11,19,24,33-40 ...)
//
// Copyright Microsoft Corporation 1995, All Rights Reserved
//
//--------------------------------------------------------------------------------------
#include "imnxport.h"
#ifndef _RANGE_H
#define _RANGE_H
//
// Copyright 1992 Software Innovations, Inc
// All Rights Reserved
//
// $Source: D:\CLASS\INCLUDE\range.h-v $
// $Author: martin $
// $Date: 92/07/15 04:56:38 $
// $Revision: 1.1 $
//
// a CRangeList is a dynamic array of these...
typedef struct {
ULONG low;
ULONG high;
} RangeType;
class CRangeList : public IRangeList
{
public:
CRangeList();
~CRangeList();
// IUnknown Methods
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject);
ULONG STDMETHODCALLTYPE AddRef(void);
ULONG STDMETHODCALLTYPE Release(void);
// IRangeList Methods
HRESULT STDMETHODCALLTYPE Clear(void) { m_numRanges = 0; return S_OK; };
HRESULT STDMETHODCALLTYPE IsInRange(const ULONG value); // is `value' in one of the ranges
// in this CRangeList?
HRESULT STDMETHODCALLTYPE Min(ULONG *pulMin); // return the minimum in-range value
HRESULT STDMETHODCALLTYPE Max(ULONG *pulMax); // return the maximum in-range value
HRESULT STDMETHODCALLTYPE Save(LPBYTE *ppbDestination, ULONG *pulSizeOfDestination);
HRESULT STDMETHODCALLTYPE Load(LPBYTE pbSource, const ULONG ulSizeOfSource);
// void AddRange(const char *);
// a string in the form "low-high,..."
// or just "value,..."
HRESULT STDMETHODCALLTYPE AddRange(const ULONG low, const ULONG high);
HRESULT STDMETHODCALLTYPE AddSingleValue(const ULONG value);
HRESULT STDMETHODCALLTYPE AddRangeList(const IRangeList *prl);
HRESULT STDMETHODCALLTYPE DeleteRange(const ULONG low, const ULONG high);
HRESULT STDMETHODCALLTYPE DeleteSingleValue(const ULONG value);
HRESULT STDMETHODCALLTYPE DeleteRangeList(const IRangeList *prl);
// finds the range "value" is in and returns the min/max of that
HRESULT STDMETHODCALLTYPE MinOfRange(const ULONG value, ULONG *pulMinOfRange);
HRESULT STDMETHODCALLTYPE MaxOfRange(const ULONG value, ULONG *pulMaxOfRange);
// Outputs the rangelist to an IMAP message set string
HRESULT STDMETHODCALLTYPE RangeToIMAPString(LPSTR *ppszDestination,
LPDWORD pdwLengthOfDestination);
// next() returns the smallest in-range value greater than `current', or -1
HRESULT STDMETHODCALLTYPE Next(const ULONG current, ULONG *pulNext);
// prev() returns the largest in-range value less than `current', or -1
HRESULT STDMETHODCALLTYPE Prev(const ULONG current, ULONG *pulPrev);
HRESULT STDMETHODCALLTYPE Cardinality(ULONG *pulCardinality); // return the cardinality of the set of
// in-range values
HRESULT STDMETHODCALLTYPE CardinalityFrom(const ULONG ulStartPoint,
ULONG *pulCardinalityFrom); // Return the cardinality of the set of
// in-range values starting after ulStartPoint
private:
BOOL Expand();
int BinarySearch(const ULONG value) const;
void ShiftLeft(int low, int distance);
void ShiftRight(int low, int distance);
void SubsumeDown(int&);
void SubsumeUpwards(const int);
HRESULT AddRangeType(const RangeType range);
HRESULT DeleteRangeType(const RangeType range);
signed long m_lRefCount;
protected:
int m_numRanges; // number of ranges in the rangeTable
int m_rangeTableSize; // range table has room for this many ranges
RangeType *m_rangeTable; // the array of ranges
};
#endif // _RANGE_H