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.

237 lines
4.9 KiB

  1. /**************************************************************************\
  2. *
  3. * Copyright (c) 1999 Microsoft Corporation
  4. *
  5. * Module Name:
  6. *
  7. * LargeInt.hpp
  8. *
  9. * Abstract:
  10. *
  11. * Large Integer Wrapper
  12. *
  13. * Created:
  14. *
  15. * 4/26/1999 Mike Hillberg
  16. *
  17. \**************************************************************************/
  18. #ifndef _LARGEINT_HPP
  19. #define _LARGEINT_HPP
  20. template <class TXLargeInteger, class TSubType, class TQuadType>
  21. // Either LARGE_INTEGER/LONG/LONGLONG or ULARGE_INTEGER/ULONG/ULONGLONG
  22. class TXLargeIntegerWrapper
  23. {
  24. public:
  25. TXLargeIntegerWrapper()
  26. {
  27. QuadPart = 0;
  28. }
  29. TXLargeIntegerWrapper( const TXLargeIntegerWrapper &xliWrapper )
  30. {
  31. QuadPart = xliWrapper.QuadPart;
  32. }
  33. TXLargeIntegerWrapper( const TXLargeInteger xli )
  34. {
  35. QuadPart = xli.QuadPart;
  36. }
  37. TXLargeIntegerWrapper( const int i )
  38. {
  39. QuadPart = i;
  40. }
  41. TXLargeIntegerWrapper( const ULONG ul )
  42. {
  43. LowPart = ul;
  44. HighPart = 0;
  45. }
  46. TXLargeIntegerWrapper( const UINT ui )
  47. {
  48. LowPart = ui;
  49. HighPart = 0;
  50. }
  51. TXLargeIntegerWrapper( const LONG l )
  52. {
  53. QuadPart = static_cast<TSubType>(l); // Sign-extend
  54. }
  55. TXLargeIntegerWrapper( const TQuadType q )
  56. {
  57. QuadPart = q;
  58. }
  59. public:
  60. TXLargeIntegerWrapper &operator=( const TXLargeIntegerWrapper xli )
  61. {
  62. QuadPart = xli.QuadPart;
  63. return(*this);
  64. }
  65. public:
  66. BOOL operator==( const TXLargeIntegerWrapper xli ) const
  67. {
  68. return( QuadPart == xli.QuadPart );
  69. }
  70. BOOL operator!=( const TXLargeIntegerWrapper xli ) const
  71. {
  72. return( QuadPart != xli.QuadPart );
  73. }
  74. BOOL operator<( const TXLargeIntegerWrapper xli ) const
  75. {
  76. return( QuadPart < xli.QuadPart );
  77. }
  78. BOOL operator<=( const TXLargeIntegerWrapper xli ) const
  79. {
  80. return( QuadPart <= xli.QuadPart );
  81. }
  82. BOOL operator>( const TXLargeIntegerWrapper xli ) const
  83. {
  84. return( QuadPart > xli.QuadPart );
  85. }
  86. BOOL operator>=( TXLargeIntegerWrapper xli ) const
  87. {
  88. return( QuadPart >= xli.QuadPart );
  89. }
  90. TXLargeIntegerWrapper operator-() const
  91. {
  92. TXLargeIntegerWrapper ret;
  93. ret.QuadPart = -QuadPart;
  94. return( ret );
  95. }
  96. public:
  97. TXLargeIntegerWrapper operator+( TXLargeIntegerWrapper xli )
  98. {
  99. TXLargeIntegerWrapper ret;
  100. ret.QuadPart = QuadPart + xli.QuadPart;
  101. return(ret);
  102. }
  103. TXLargeIntegerWrapper& operator+=( TXLargeIntegerWrapper xli )
  104. {
  105. QuadPart += xli.QuadPart;
  106. return(*this);
  107. }
  108. TXLargeIntegerWrapper& operator++( ) // prefix
  109. {
  110. ++QuadPart;
  111. return(*this);
  112. }
  113. TXLargeIntegerWrapper operator++(int) // postfix
  114. {
  115. TQuadType QuadPartReturn = QuadPart++;
  116. return(QuadPartReturn);
  117. }
  118. TXLargeIntegerWrapper operator-( TXLargeIntegerWrapper xli )
  119. {
  120. TXLargeIntegerWrapper ret;
  121. ret.QuadPart = QuadPart - xli.QuadPart;
  122. return(ret);
  123. }
  124. TXLargeIntegerWrapper& operator-=( TXLargeIntegerWrapper xli )
  125. {
  126. QuadPart -= xli.QuadPart;
  127. return(*this);
  128. }
  129. TXLargeIntegerWrapper& operator--( ) // prefix
  130. {
  131. --QuadPart;
  132. return(*this);
  133. }
  134. TXLargeIntegerWrapper operator--(int) // postfix
  135. {
  136. TQuadType QuadPartReturn = QuadPart--;
  137. return(QuadPartReturn);
  138. }
  139. public:
  140. TXLargeIntegerWrapper& operator*( TXLargeIntegerWrapper xli )
  141. {
  142. TXLargeIntegerWrapper ret;
  143. ret.QuadPart = QuadPart * xli.QuadPart;
  144. return(ret);
  145. }
  146. TXLargeIntegerWrapper& operator*=( TXLargeIntegerWrapper xli )
  147. {
  148. QuadPart *= xli.QuadPart;
  149. return( *this );
  150. }
  151. public:
  152. TXLargeInteger* operator&()
  153. {
  154. return( reinterpret_cast<TXLargeInteger*>(this) );
  155. }
  156. public:
  157. operator ULARGE_INTEGER() const
  158. {
  159. ULARGE_INTEGER uli;
  160. uli.HighPart = HighPart;
  161. uli.LowPart = LowPart;
  162. return( uli );
  163. }
  164. operator LARGE_INTEGER() const
  165. {
  166. LARGE_INTEGER li;
  167. li.HighPart = HighPart;
  168. li.LowPart = LowPart;
  169. return( li );
  170. }
  171. public:
  172. typedef DWORD typeLowPart;
  173. typedef TSubType typeHighPart;
  174. typedef TQuadType typeQuadPart;
  175. typedef TXLargeInteger typeWholePart;
  176. union
  177. {
  178. struct
  179. {
  180. typeLowPart LowPart;
  181. typeHighPart HighPart;
  182. };
  183. typeQuadPart QuadPart;
  184. };
  185. };
  186. typedef TXLargeIntegerWrapper<LARGE_INTEGER, LONG, LONGLONG> CLargeInteger;
  187. typedef TXLargeIntegerWrapper<ULARGE_INTEGER, ULONG, ULONGLONG> CULargeInteger;
  188. #endif // #ifndef _LARGEINT_HPP