1 /******************************************************
2 The dynamically allocated array
6 Created 2/5/1996 Heikki Tuuri
7 *******************************************************/
16 typedef struct dyn_block_struct dyn_block_t
;
17 typedef dyn_block_t dyn_array_t
;
20 /* This is the initial 'payload' size of a dynamic array;
21 this must be > MLOG_BUF_MARGIN + 30! */
22 #define DYN_ARRAY_DATA_SIZE 512
24 /*************************************************************************
25 Initializes a dynamic array. */
30 /* out: initialized dyn array */
31 dyn_array_t
* arr
); /* in: pointer to a memory buffer of
32 size sizeof(dyn_array_t) */
33 /****************************************************************
34 Frees a dynamic array. */
39 dyn_array_t
* arr
); /* in: dyn array */
40 /*************************************************************************
41 Makes room on top of a dyn array and returns a pointer to a buffer in it.
42 After copying the elements, the caller must close the buffer using
48 /* out: pointer to the buffer */
49 dyn_array_t
* arr
, /* in: dynamic array */
50 ulint size
); /* in: size in bytes of the buffer; MUST be
51 smaller than DYN_ARRAY_DATA_SIZE! */
52 /*************************************************************************
53 Closes the buffer returned by dyn_array_open. */
58 dyn_array_t
* arr
, /* in: dynamic array */
59 byte
* ptr
); /* in: buffer space from ptr up was not used */
60 /*************************************************************************
61 Makes room on top of a dyn array and returns a pointer to
62 the added element. The caller must copy the element to
63 the pointer returned. */
68 /* out: pointer to the element */
69 dyn_array_t
* arr
, /* in: dynamic array */
70 ulint size
); /* in: size in bytes of the element */
71 /****************************************************************
72 Returns pointer to an element in dyn array. */
75 dyn_array_get_element(
76 /*==================*/
77 /* out: pointer to element */
78 dyn_array_t
* arr
, /* in: dyn array */
79 ulint pos
); /* in: position of element as bytes
81 /****************************************************************
82 Returns the size of stored data in a dyn array. */
85 dyn_array_get_data_size(
86 /*====================*/
87 /* out: data size in bytes */
88 dyn_array_t
* arr
); /* in: dyn array */
89 /****************************************************************
90 Gets the first block in a dyn array. */
93 dyn_array_get_first_block(
94 /*======================*/
95 dyn_array_t
* arr
); /* in: dyn array */
96 /****************************************************************
97 Gets the last block in a dyn array. */
100 dyn_array_get_last_block(
101 /*=====================*/
102 dyn_array_t
* arr
); /* in: dyn array */
103 /************************************************************************
104 Gets the next block in a dyn array. */
107 dyn_array_get_next_block(
108 /*=====================*/
109 /* out: pointer to next, NULL if end of list */
110 dyn_array_t
* arr
, /* in: dyn array */
111 dyn_block_t
* block
); /* in: dyn array block */
112 /************************************************************************
113 Gets the number of used bytes in a dyn array block. */
118 /* out: number of bytes used */
119 dyn_block_t
* block
); /* in: dyn array block */
120 /************************************************************************
121 Gets pointer to the start of data in a dyn array block. */
126 /* out: pointer to data */
127 dyn_block_t
* block
); /* in: dyn array block */
128 /************************************************************
129 Pushes n bytes to a dyn array. */
134 dyn_array_t
* arr
, /* in: dyn array */
135 const byte
* str
, /* in: string to write */
136 ulint len
); /* in: string length */
138 /*#################################################################*/
140 /* NOTE! Do not use the fields of the struct directly: the definition
141 appears here only for the compiler to know its size! */
142 struct dyn_block_struct
{
143 mem_heap_t
* heap
; /* in the first block this is != NULL
144 if dynamic allocation has been needed */
145 ulint used
; /* number of data bytes used in this block */
146 byte data
[DYN_ARRAY_DATA_SIZE
];
147 /* storage for array elements */
148 UT_LIST_BASE_NODE_T(dyn_block_t
) base
;
149 /* linear list of dyn blocks: this node is
150 used only in the first block */
151 UT_LIST_NODE_T(dyn_block_t
) list
;
152 /* linear list node: used in all blocks */
154 ulint buf_end
;/* only in the debug version: if dyn array is
155 opened, this is the buffer end offset, else
163 #include "dyn0dyn.ic"