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"