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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. The dynamically allocated array
  3. (c) 1996 Innobase Oy
  4. Created 2/5/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef dyn0dyn_h
  7. #define dyn0dyn_h
  8. #include "univ.i"
  9. #include "ut0lst.h"
  10. #include "mem0mem.h"
  11. typedef struct dyn_block_struct dyn_block_t;
  12. typedef dyn_block_t dyn_array_t;
  13. /* Initial 'payload' size in bytes in a dynamic array block */
  14. #define DYN_ARRAY_DATA_SIZE 1024
  15. /*************************************************************************
  16. Initializes a dynamic array. */
  17. UNIV_INLINE
  18. dyn_array_t*
  19. dyn_array_create(
  20. /*=============*/
  21. /* out: initialized dyn array */
  22. dyn_array_t* arr); /* in: pointer to a memory buffer of
  23. size sizeof(dyn_array_t) */
  24. /****************************************************************
  25. Frees a dynamic array. */
  26. UNIV_INLINE
  27. void
  28. dyn_array_free(
  29. /*===========*/
  30. dyn_array_t* arr); /* in: dyn array */
  31. /*************************************************************************
  32. Makes room on top of a dyn array and returns a pointer to a buffer in it.
  33. After copying the elements, the caller must close the buffer using
  34. dyn_array_close. */
  35. UNIV_INLINE
  36. byte*
  37. dyn_array_open(
  38. /*===========*/
  39. /* out: pointer to the buffer */
  40. dyn_array_t* arr, /* in: dynamic array */
  41. ulint size); /* in: size in bytes of the buffer */
  42. /*************************************************************************
  43. Closes the buffer returned by dyn_array_open. */
  44. UNIV_INLINE
  45. void
  46. dyn_array_close(
  47. /*============*/
  48. dyn_array_t* arr, /* in: dynamic array */
  49. byte* ptr); /* in: buffer space from ptr up was not used */
  50. /*************************************************************************
  51. Makes room on top of a dyn array and returns a pointer to
  52. the added element. The caller must copy the element to
  53. the pointer returned. */
  54. UNIV_INLINE
  55. void*
  56. dyn_array_push(
  57. /*===========*/
  58. /* out: pointer to the element */
  59. dyn_array_t* arr, /* in: dynamic array */
  60. ulint size); /* in: size in bytes of the element */
  61. /****************************************************************
  62. Returns pointer to an element in dyn array. */
  63. UNIV_INLINE
  64. void*
  65. dyn_array_get_element(
  66. /*==================*/
  67. /* out: pointer to element */
  68. dyn_array_t* arr, /* in: dyn array */
  69. ulint pos); /* in: position of element as bytes 
  70. from array start */
  71. /****************************************************************
  72. Returns the size of stored data in a dyn array. */
  73. UNIV_INLINE
  74. ulint
  75. dyn_array_get_data_size(
  76. /*====================*/
  77. /* out: data size in bytes */
  78. dyn_array_t* arr); /* in: dyn array */
  79. /****************************************************************
  80. Gets the first block in a dyn array. */
  81. UNIV_INLINE
  82. dyn_block_t*
  83. dyn_array_get_first_block(
  84. /*======================*/
  85. dyn_array_t* arr); /* in: dyn array */
  86. /****************************************************************
  87. Gets the last block in a dyn array. */
  88. UNIV_INLINE
  89. dyn_block_t*
  90. dyn_array_get_last_block(
  91. /*=====================*/
  92. dyn_array_t* arr); /* in: dyn array */
  93. /************************************************************************
  94. Gets the next block in a dyn array. */
  95. UNIV_INLINE
  96. dyn_block_t*
  97. dyn_array_get_next_block(
  98. /*=====================*/
  99. /* out: pointer to next, NULL if end of list */
  100. dyn_array_t* arr, /* in: dyn array */
  101. dyn_block_t* block); /* in: dyn array block */
  102. /************************************************************************
  103. Gets the number of used bytes in a dyn array block. */
  104. UNIV_INLINE
  105. ulint
  106. dyn_block_get_used(
  107. /*===============*/
  108. /* out: number of bytes used */
  109. dyn_block_t* block); /* in: dyn array block */
  110. /************************************************************************
  111. Gets pointer to the start of data in a dyn array block. */
  112. UNIV_INLINE
  113. byte*
  114. dyn_block_get_data(
  115. /*===============*/
  116. /* out: pointer to data */
  117. dyn_block_t* block); /* in: dyn array block */
  118. /************************************************************************
  119. Gets the next block in a dyn array. */
  120. UNIV_INLINE
  121. dyn_block_t*
  122. dyn_block_get_next(
  123. /*===============*/
  124. /* out: pointer to next, NULL if end of list */
  125. dyn_block_t* block); /* in: dyn array block */
  126. /************************************************************
  127. Pushes n bytes to a dyn array. */
  128. UNIV_INLINE
  129. void
  130. dyn_push_string(
  131. /*============*/
  132. dyn_array_t* arr, /* in: dyn array */
  133. byte* str, /* in: string to write */
  134. ulint len); /* in: string length */
  135. /*#################################################################*/
  136. /* NOTE! Do not use the fields of the struct directly: the definition
  137. appears here only for the compiler to know its size! */
  138. struct dyn_block_struct{
  139. mem_heap_t* heap; /* in the first block this is != NULL 
  140. if dynamic allocation has been needed */
  141. ulint used; /* number of data bytes used in this block */
  142. byte data[DYN_ARRAY_DATA_SIZE];
  143. /* storage for array elements */
  144. UT_LIST_BASE_NODE_T(dyn_block_t) base;
  145. /* linear list of dyn blocks: this node is
  146. used only in the first block */
  147. UT_LIST_NODE_T(dyn_block_t) list;
  148. /* linear list node: used in all blocks */
  149. #ifdef UNIV_DEBUG
  150. ulint buf_end;/* only in the debug version: if dyn array is
  151. opened, this is the buffer end offset, else
  152. this is 0 */
  153. ulint magic_n;
  154. #endif
  155. };
  156. #ifndef UNIV_NONINL
  157. #include "dyn0dyn.ic"
  158. #endif
  159. #endif