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