ut0byte.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /**********************************************************************
  2. Utilities for byte operations
  3. (c) 1994, 1995 Innobase Oy
  4. Created 1/20/1994 Heikki Tuuri
  5. ***********************************************************************/
  6. #ifndef ut0byte_h
  7. #define ut0byte_h
  8. #include "univ.i"
  9. /* Type definition for a 64-bit unsigned integer, which works also
  10. in 32-bit machines. NOTE! Access the fields only with the accessor
  11. functions. This definition appears here only for the compiler to
  12. know the size of a dulint. */
  13. typedef struct dulint_struct dulint;
  14. struct dulint_struct{
  15. ulint high; /* most significant 32 bits */
  16. ulint low; /* least significant 32 bits */
  17. };
  18. /* Zero value for a dulint */
  19. extern dulint ut_dulint_zero;
  20. /* Maximum value for a dulint */
  21. extern dulint ut_dulint_max;
  22. /***********************************************************
  23. Creates a 64-bit dulint out of two ulints. */
  24. UNIV_INLINE
  25. dulint
  26. ut_dulint_create(
  27. /*=============*/
  28. /* out: created dulint */
  29. ulint high, /* in: high-order 32 bits */
  30. ulint low); /* in: low-order 32 bits */
  31. /***********************************************************
  32. Gets the high-order 32 bits of a dulint. */
  33. UNIV_INLINE
  34. ulint
  35. ut_dulint_get_high(
  36. /*===============*/
  37. /* out: 32 bits in ulint */
  38. dulint d); /* in: dulint */
  39. /***********************************************************
  40. Gets the low-order 32 bits of a dulint. */
  41. UNIV_INLINE
  42. ulint
  43. ut_dulint_get_low(
  44. /*==============*/
  45. /* out: 32 bits in ulint */
  46. dulint d); /* in: dulint */
  47. /***********************************************************
  48. Tests if a dulint is zero. */
  49. UNIV_INLINE
  50. ibool
  51. ut_dulint_is_zero(
  52. /*==============*/
  53. /* out: TRUE if zero */
  54. dulint a); /* in: dulint */
  55. /***********************************************************
  56. Compares two dulints. */
  57. UNIV_INLINE
  58. int
  59. ut_dulint_cmp(
  60. /*==========*/
  61. /* out: -1 if a < b, 0 if a == b,
  62. 1 if a > b */ 
  63. dulint a, /* in: dulint */
  64. dulint b); /* in: dulint */
  65. /***********************************************************
  66. Calculates the max of two dulints. */
  67. UNIV_INLINE
  68. dulint
  69. ut_dulint_get_max(
  70. /*==============*/
  71. /* out: max(a, b) */
  72. dulint a, /* in: dulint */
  73. dulint b); /* in: dulint */
  74. /***********************************************************
  75. Calculates the min of two dulints. */
  76. UNIV_INLINE
  77. dulint
  78. ut_dulint_get_min(
  79. /*==============*/
  80. /* out: min(a, b) */
  81. dulint a, /* in: dulint */
  82. dulint b); /* in: dulint */
  83. /***********************************************************
  84. Adds a ulint to a dulint. */
  85. UNIV_INLINE
  86. dulint
  87. ut_dulint_add(
  88. /*==========*/
  89. /* out: sum a + b */
  90. dulint a, /* in: dulint */
  91. ulint b); /* in: ulint */
  92. /***********************************************************
  93. Subtracts a ulint from a dulint. */
  94. UNIV_INLINE
  95. dulint
  96. ut_dulint_subtract(
  97. /*===============*/
  98. /* out: a - b */
  99. dulint a, /* in: dulint */
  100. ulint b); /* in: ulint, b <= a */
  101. /***********************************************************
  102. Subtracts a dulint from another. NOTE that the difference must be positive
  103. and smaller that 4G. */
  104. UNIV_INLINE
  105. ulint
  106. ut_dulint_minus(
  107. /*============*/
  108. /* out: a - b */
  109. dulint a, /* in: dulint; NOTE a must be >= b and at most
  110. 2 to power 32 - 1 greater */
  111. dulint b); /* in: dulint */
  112. /************************************************************
  113. Rounds a dulint downward to a multiple of a power of 2. */
  114. UNIV_INLINE
  115. dulint
  116. ut_dulint_align_down(
  117. /*=================*/
  118. /* out: rounded value */
  119. dulint   n,         /* in: number to be rounded */
  120. ulint    align_no);   /* in: align by this number which must be a
  121. power of 2 */
  122. /************************************************************
  123. Rounds a dulint upward to a multiple of a power of 2. */
  124. UNIV_INLINE
  125. dulint
  126. ut_dulint_align_up(
  127. /*===============*/
  128. /* out: rounded value */
  129. dulint   n,         /* in: number to be rounded */
  130. ulint    align_no);   /* in: align by this number which must be a
  131. power of 2 */
  132. /***********************************************************
  133. Increments a dulint variable by 1. */
  134. #define UT_DULINT_INC(D)
  135. {
  136. if ((D).low == 0xFFFFFFFF) {
  137. (D).high = (D).high + 1;
  138. (D).low = 0;
  139. } else {
  140. (D).low = (D).low + 1;
  141. }
  142. }
  143. /***********************************************************
  144. Tests if two dulints are equal. */
  145. #define UT_DULINT_EQ(D1, D2) (((D1).low == (D2).low)
  146. && ((D1).high == (D2).high))
  147. /****************************************************************
  148. Sort function for dulint arrays. */
  149. void
  150. ut_dulint_sort(dulint* arr, dulint* aux_arr, ulint low, ulint high);
  151. /*===============================================================*/
  152. /************************************************************
  153. The following function calculates the value of an integer n rounded
  154. to the least product of align_no which is >= n. align_no has to be a
  155. power of 2. */
  156. UNIV_INLINE
  157. ulint
  158. ut_calc_align(
  159. /*==========*/
  160. /* out: rounded value */
  161. ulint    n,             /* in: number to be rounded */
  162. ulint    align_no);     /* in: align by this number */
  163. /************************************************************
  164. The following function calculates the value of an integer n rounded
  165. to the biggest product of align_no which is <= n. align_no has to be a
  166. power of 2. */
  167. UNIV_INLINE
  168. ulint
  169. ut_calc_align_down(
  170. /*===============*/
  171. /* out: rounded value */
  172. ulint    n,           /* in: number to be rounded */
  173. ulint    align_no); /* in: align by this number */
  174. /*************************************************************
  175. The following function rounds up a pointer to the nearest aligned address. */
  176. UNIV_INLINE
  177. void*
  178. ut_align(
  179. /*=====*/
  180. /* out: aligned pointer */
  181. void*   ptr,            /* in: pointer */
  182. ulint   align_no);      /* in: align by this number */
  183. /*************************************************************
  184. The following function rounds down a pointer to the nearest
  185. aligned address. */
  186. UNIV_INLINE
  187. void*
  188. ut_align_down(
  189. /*==========*/
  190. /* out: aligned pointer */
  191. void*   ptr,            /* in: pointer */
  192. ulint   align_no);      /* in: align by this number */
  193. /*********************************************************************
  194. Gets the nth bit of a ulint. */
  195. UNIV_INLINE
  196. ibool
  197. ut_bit_get_nth(
  198. /*===========*/
  199. /* out: TRUE if nth bit is 1; 0th bit is defined to
  200. be the least significant */
  201. ulint a, /* in: ulint */
  202. ulint n); /* in: nth bit requested */
  203. /*********************************************************************
  204. Sets the nth bit of a ulint. */
  205. UNIV_INLINE
  206. ulint
  207. ut_bit_set_nth(
  208. /*===========*/
  209. /* out: the ulint with the bit set as requested */
  210. ulint a, /* in: ulint */
  211. ulint n, /* in: nth bit requested */
  212. ibool val); /* in: value for the bit to set */
  213. #ifndef UNIV_NONINL
  214. #include "ut0byte.ic"
  215. #endif
  216. #endif