mruby/c VM Source Code release 4.0.0
Loading...
Searching...
No Matches
keyvalue.c
Go to the documentation of this file.
1
48
49/***** Feature test switches ************************************************/
50/***** System headers *******************************************************/
51//@cond
52#include "vm_config.h"
53#include <stdlib.h>
54#include <string.h>
55//@endcond
56
57/***** Local headers ********************************************************/
58#include "mrubyc.h"
59
60/***** Constat values *******************************************************/
61#if !defined(MRBC_KV_SIZE_INIT)
62#define MRBC_KV_SIZE_INIT 2
63#endif
64#if !defined(MRBC_KV_SIZE_INCREMENT)
65#define MRBC_KV_SIZE_INCREMENT 5
66#endif
67
68/***** Macros ***************************************************************/
69/***** Typedefs *************************************************************/
70/***** Function prototypes **************************************************/
71/***** Local variables ******************************************************/
72/***** Global variables *****************************************************/
73/***** Signal catching functions ********************************************/
74/***** Local functions ******************************************************/
75//================================================================
82static int binary_search(mrbc_kv_handle *kvh, mrbc_sym sym_id)
83{
84 int left = 0;
85 int right = kvh->n_stored - 1;
86 if( right < 0 ) return -1;
87
88 while( left < right ) {
89 int mid = (left + right) / 2;
90 if( kvh->data[mid].sym_id < sym_id ) {
91 left = mid + 1;
92 } else {
93 right = mid;
94 }
95 }
96
97 return left;
98}
99
100
101/***** Global functions *****************************************************/
102
103//================================================================
110mrbc_kv_handle * mrbc_kv_new(struct VM *vm, int size)
111{
112 mrbc_kv_handle *kvh = mrbc_alloc(vm, sizeof(mrbc_kv_handle));
113
114 mrbc_kv_init_handle( vm, kvh, size );
115
116 return kvh;
117}
118
119
120//================================================================
128int mrbc_kv_init_handle(struct VM *vm, mrbc_kv_handle *kvh, int size)
129{
130 kvh->data_size = size;
131 kvh->n_stored = 0;
132
133 if( size == 0 ) {
134 // save VM address temporary.
135 kvh->vm = vm;
136
137 } else {
138 // Allocate data buffer.
139 kvh->data = mrbc_alloc(vm, sizeof(mrbc_kv) * size);
140
141#if defined(MRBC_DEBUG)
142 memcpy( kvh->data->obj_mark_, "KV", 2 );
143#endif
144 }
145
146 return 0;
147}
148
149
150//================================================================
156{
158 mrbc_raw_free(kvh);
159}
160
161
162//================================================================
168{
169 if( kvh->data_size == 0 ) return;
170
171 mrbc_kv_clear(kvh);
172 kvh->data_size = 0;
173 mrbc_raw_free(kvh->data);
174}
175
176
177#if defined(MRBC_ALLOC_VMID)
178//================================================================
183void mrbc_kv_clear_vm_id(mrbc_kv_handle *kvh)
184{
185 if( kvh->data_size == 0 ) return;
186
187 mrbc_kv *p1 = kvh->data;
188 const mrbc_kv *p2 = p1 + kvh->n_stored;
189
190 mrbc_set_vm_id( p1, 0 );
191
192 while( p1 < p2 ) {
193 mrbc_clear_vm_id(&p1->value);
194 p1++;
195 }
196}
197#endif
198
199
200//================================================================
208{
209 if( size <= 0 ) size = 1;
210
211 mrbc_kv *data = mrbc_raw_realloc(kvh->data, sizeof(mrbc_kv) * size);
212
213 kvh->data = data;
214 kvh->data_size = size;
215
216 return 0;
217}
218
219
220//================================================================
229{
230 int idx = binary_search(kvh, sym_id);
231 if( idx < 0 ) {
232 idx = 0;
233 goto INSERT_VALUE;
234 }
235
236 // replace value ?
237 if( kvh->data[idx].sym_id == sym_id ) {
238 mrbc_decref( &kvh->data[idx].value );
239 kvh->data[idx].value = *set_val;
240 return 0;
241 }
242
243 if( kvh->data[idx].sym_id < sym_id ) {
244 idx++;
245 }
246
247 INSERT_VALUE:
248 // need alloc?
249 if( kvh->data_size == 0 ) {
250 kvh->data = mrbc_alloc(kvh->vm, sizeof(mrbc_kv) * MRBC_KV_SIZE_INIT);
252
253#if defined(MRBC_DEBUG)
254 memcpy( kvh->data->obj_mark_, "KV", 2 );
255#endif
256
257 // need resize?
258 } else if( kvh->n_stored >= kvh->data_size ) {
260 }
261
262 // need move data?
263 if( idx < kvh->n_stored ) {
264 int size = sizeof(mrbc_kv) * (kvh->n_stored - idx);
265 memmove( &kvh->data[idx+1], &kvh->data[idx], size );
266 }
267
268 kvh->data[idx].sym_id = sym_id;
269 kvh->data[idx].value = *set_val;
270 kvh->n_stored++;
271
272 return 0;
273}
274
275
276
277//================================================================
285{
286 int idx = binary_search(kvh, sym_id);
287 if( idx < 0 ) return NULL;
288 if( kvh->data[idx].sym_id != sym_id ) return NULL;
289
290 return &kvh->data[idx].value;
291}
292
293
294#if 0
295//================================================================
303int mrbc_kv_append(mrbc_kv_handle *kvh, mrbc_sym sym_id, mrbc_value *set_val)
304{
305 // need alloc?
306 if( kvh->data_size == 0 ) {
307 kvh->data = mrbc_alloc(kvh->vm, sizeof(mrbc_kv) * MRBC_KV_SIZE_INIT);
309
310#if defined(MRBC_DEBUG)
311 memcpy( kvh->data->obj_mark_, "KV", 2 );
312#endif
313
314 // need resize?
315 } else if( kvh->n_stored >= kvh->data_size ) {
317 }
318
319 kvh->data[kvh->n_stored].sym_id = sym_id;
320 kvh->data[kvh->n_stored].value = *set_val;
321 kvh->n_stored++;
322
323 return 0;
324}
325
326
327
328static int compare_key( const void *kv1, const void *kv2 )
329{
330 return ((mrbc_kv *)kv1)->sym_id - ((mrbc_kv *)kv2)->sym_id;
331}
332
333//================================================================
339int mrbc_kv_reorder(mrbc_kv_handle *kvh)
340{
341 if( kvh->data_size == 0 ) return 0;
342
343 qsort( kvh->data, kvh->n_stored, sizeof(mrbc_kv), compare_key );
344
345 return 0;
346}
347#endif
348
349
350//================================================================
358{
359 int idx = binary_search(kvh, sym_id);
360 if( idx < 0 ) return 0;
361 if( kvh->data[idx].sym_id != sym_id ) return 0;
362
363 mrbc_decref( &kvh->data[idx].value );
364 kvh->n_stored--;
365 memmove( kvh->data + idx, kvh->data + idx + 1,
366 sizeof(mrbc_kv) * (kvh->n_stored - idx) );
367
368 return 0;
369}
370
371
372
373//================================================================
379{
380 mrbc_kv *p1 = kvh->data;
381 const mrbc_kv *p2 = p1 + kvh->n_stored;
382 while( p1 < p2 ) {
383 mrbc_decref(&p1->value);
384 p1++;
385 }
386
387 kvh->n_stored = 0;
388}
389
390
391//================================================================
398{
400
401 while( mrbc_kv_i_has_next( &ite ) ) {
402 mrbc_kv *kv = mrbc_kv_i_next( &ite );
403 mrbc_incref( &kv->value );
404 mrbc_kv_set( dst, kv->sym_id, &kv->value );
405 }
406}
void * mrbc_raw_realloc(void *ptr, unsigned int size)
Definition alloc.c:806
void mrbc_raw_free(void *ptr)
Definition alloc.c:707
struct RObject mrbc_value
Value object. Default version.
#define MRBC_KV_SIZE_INIT
Definition keyvalue.c:62
void mrbc_kv_delete(mrbc_kv_handle *kvh)
Definition keyvalue.c:155
int mrbc_kv_resize(mrbc_kv_handle *kvh, int size)
Definition keyvalue.c:207
void mrbc_kv_dup(const mrbc_kv_handle *src, mrbc_kv_handle *dst)
Definition keyvalue.c:397
static int binary_search(mrbc_kv_handle *kvh, mrbc_sym sym_id)
Definition keyvalue.c:82
mrbc_kv_handle * mrbc_kv_new(struct VM *vm, int size)
Definition keyvalue.c:110
int mrbc_kv_init_handle(struct VM *vm, mrbc_kv_handle *kvh, int size)
Definition keyvalue.c:128
void mrbc_kv_delete_data(mrbc_kv_handle *kvh)
Definition keyvalue.c:167
#define MRBC_KV_SIZE_INCREMENT
Definition keyvalue.c:65
void mrbc_kv_clear(mrbc_kv_handle *kvh)
Definition keyvalue.c:378
int mrbc_kv_remove(mrbc_kv_handle *kvh, mrbc_sym sym_id)
Definition keyvalue.c:357
mrbc_value * mrbc_kv_get(mrbc_kv_handle *kvh, mrbc_sym sym_id)
Definition keyvalue.c:284
int mrbc_kv_set(mrbc_kv_handle *kvh, mrbc_sym sym_id, mrbc_value *set_val)
Definition keyvalue.c:228
static mrbc_kv * mrbc_kv_i_next(mrbc_kv_iterator *ite)
Definition keyvalue.h:159
struct RKeyValueHandle mrbc_kv_handle
Key-Value handle.
static int mrbc_kv_i_has_next(const mrbc_kv_iterator *ite)
Definition keyvalue.h:143
struct RKeyValue mrbc_kv
Key-Value data.
struct RKeyValueIterator mrbc_kv_iterator
Key-Value iterator.
static mrbc_kv_iterator mrbc_kv_iterator_new(const mrbc_kv_handle *h)
Definition keyvalue.h:122
Include at once the necessary header files.
uint16_t n_stored
num of stored.
Definition keyvalue.h:55
struct VM * vm
pointer to VM (if data_size == 0)
Definition keyvalue.h:58
mrbc_kv * data
pointer to allocated memory.
Definition keyvalue.h:57
uint16_t data_size
data buffer size.
Definition keyvalue.h:54
mrbc_sym sym_id
symbol ID as key.
Definition keyvalue.h:43
mrbc_value value
stored value.
Definition keyvalue.h:44
Virtual Machine.
Definition vm.h:150
static void mrbc_decref(mrbc_value *v)
Definition value.h:561
static void mrbc_incref(mrbc_value *v)
Definition value.h:546
int16_t mrbc_sym
mruby/c symbol ID
Definition value.h:62
Global configuration of mruby/c VM's.