Leaked source code of windows server 2003
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.

114 lines
4.4 KiB

  1. //
  2. // RANGE.H
  3. //
  4. // 2-20-96: (EricAn)
  5. // Hacked from the Route66 source tree, eliminated stuff we don't use.
  6. // Original copyright below - where did this thing come from?
  7. // 8-96: Functions added to facilitate finding of "anti" lists
  8. //
  9. // -*- C -*-
  10. //--------------------------------------------------------------------------------------
  11. //
  12. // Module: range.h
  13. //
  14. // Description: Definition of a class to manipulate range lists
  15. // (e.g. 1-6,7,10-11,19,24,33-40 ...)
  16. //
  17. // Copyright Microsoft Corporation 1995, All Rights Reserved
  18. //
  19. //--------------------------------------------------------------------------------------
  20. #include "imnxport.h"
  21. #ifndef _RANGE_H
  22. #define _RANGE_H
  23. //
  24. // Copyright 1992 Software Innovations, Inc
  25. // All Rights Reserved
  26. //
  27. // $Source: D:\CLASS\INCLUDE\range.h-v $
  28. // $Author: martin $
  29. // $Date: 92/07/15 04:56:38 $
  30. // $Revision: 1.1 $
  31. //
  32. // a CRangeList is a dynamic array of these...
  33. typedef struct {
  34. ULONG low;
  35. ULONG high;
  36. } RangeType;
  37. class CRangeList : public IRangeList
  38. {
  39. public:
  40. CRangeList();
  41. ~CRangeList();
  42. // IUnknown Methods
  43. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject);
  44. ULONG STDMETHODCALLTYPE AddRef(void);
  45. ULONG STDMETHODCALLTYPE Release(void);
  46. // IRangeList Methods
  47. HRESULT STDMETHODCALLTYPE Clear(void) { m_numRanges = 0; return S_OK; };
  48. HRESULT STDMETHODCALLTYPE IsInRange(const ULONG value); // is `value' in one of the ranges
  49. // in this CRangeList?
  50. HRESULT STDMETHODCALLTYPE Min(ULONG *pulMin); // return the minimum in-range value
  51. HRESULT STDMETHODCALLTYPE Max(ULONG *pulMax); // return the maximum in-range value
  52. HRESULT STDMETHODCALLTYPE Save(LPBYTE *ppbDestination, ULONG *pulSizeOfDestination);
  53. HRESULT STDMETHODCALLTYPE Load(LPBYTE pbSource, const ULONG ulSizeOfSource);
  54. // void AddRange(const char *);
  55. // a string in the form "low-high,..."
  56. // or just "value,..."
  57. HRESULT STDMETHODCALLTYPE AddRange(const ULONG low, const ULONG high);
  58. HRESULT STDMETHODCALLTYPE AddSingleValue(const ULONG value);
  59. HRESULT STDMETHODCALLTYPE AddRangeList(const IRangeList *prl);
  60. HRESULT STDMETHODCALLTYPE DeleteRange(const ULONG low, const ULONG high);
  61. HRESULT STDMETHODCALLTYPE DeleteSingleValue(const ULONG value);
  62. HRESULT STDMETHODCALLTYPE DeleteRangeList(const IRangeList *prl);
  63. // finds the range "value" is in and returns the min/max of that
  64. HRESULT STDMETHODCALLTYPE MinOfRange(const ULONG value, ULONG *pulMinOfRange);
  65. HRESULT STDMETHODCALLTYPE MaxOfRange(const ULONG value, ULONG *pulMaxOfRange);
  66. // Outputs the rangelist to an IMAP message set string
  67. HRESULT STDMETHODCALLTYPE RangeToIMAPString(LPSTR *ppszDestination,
  68. LPDWORD pdwLengthOfDestination);
  69. // next() returns the smallest in-range value greater than `current', or -1
  70. HRESULT STDMETHODCALLTYPE Next(const ULONG current, ULONG *pulNext);
  71. // prev() returns the largest in-range value less than `current', or -1
  72. HRESULT STDMETHODCALLTYPE Prev(const ULONG current, ULONG *pulPrev);
  73. HRESULT STDMETHODCALLTYPE Cardinality(ULONG *pulCardinality); // return the cardinality of the set of
  74. // in-range values
  75. HRESULT STDMETHODCALLTYPE CardinalityFrom(const ULONG ulStartPoint,
  76. ULONG *pulCardinalityFrom); // Return the cardinality of the set of
  77. // in-range values starting after ulStartPoint
  78. private:
  79. BOOL Expand();
  80. int BinarySearch(const ULONG value) const;
  81. void ShiftLeft(int low, int distance);
  82. void ShiftRight(int low, int distance);
  83. void SubsumeDown(int&);
  84. void SubsumeUpwards(const int);
  85. HRESULT AddRangeType(const RangeType range);
  86. HRESULT DeleteRangeType(const RangeType range);
  87. signed long m_lRefCount;
  88. protected:
  89. int m_numRanges; // number of ranges in the rangeTable
  90. int m_rangeTableSize; // range table has room for this many ranges
  91. RangeType *m_rangeTable; // the array of ranges
  92. };
  93. #endif // _RANGE_H