File: objtable.h

package info (click to toggle)
neko 1.8.1-6
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 2,116 kB
  • sloc: ansic: 16,707; makefile: 125; sh: 37; xml: 4
file content (79 lines) | stat: -rwxr-xr-x 2,202 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/* ************************************************************************ */
/*																			*/
/*  Neko Virtual Machine													*/
/*  Copyright (c)2005 Motion-Twin											*/
/*																			*/
/* This library is free software; you can redistribute it and/or			*/
/* modify it under the terms of the GNU Lesser General Public				*/
/* License as published by the Free Software Foundation; either				*/
/* version 2.1 of the License, or (at your option) any later version.		*/
/*																			*/
/* This library is distributed in the hope that it will be useful,			*/
/* but WITHOUT ANY WARRANTY; without even the implied warranty of			*/
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU		*/
/* Lesser General Public License or the LICENSE file for more details.		*/
/*																			*/
/* ************************************************************************ */
#ifndef __OBJTABLE_H
#define __OBJTABLE_H
#include "neko.h"

static INLINE void otable_init(objtable *t) {
	t->count = 0;
	t->cells = NULL;
}

static INLINE value *otable_find(objtable *t,field id) {
	int min;
	int max;
	int mid;
	objcell *c;
	field cid;
	min = 0;
	max = t->count;
	c = t->cells;
	while( min < max ) {
		mid = (min + max) >> 1;
		cid = c[mid].id;
		if( cid < id )
			min = mid + 1;
		else if( cid > id )
			max = mid;
		else
			return &c[mid].v;
	}
	return NULL;
}

static INLINE value otable_get(objtable *t,field id) {
	int min;
	int max;
	int mid;
	objcell *c;
	field cid;
	min = 0;
	max = t->count;
	c = t->cells;
	while( min < max ) {
		mid = (min + max) >> 1;
		cid = c[mid].id;
		if( cid < id )
			min = mid + 1;
		else if( cid > id )
			max = mid;
		else
			return c[mid].v;
	}
	return val_null;
}

void otable_replace(objtable *t, field id, value data);
int otable_remove(objtable *t, field id);
void otable_optimize(objtable *t);
#define otable_count(t)	(t)->count

void otable_copy(objtable *t, objtable *target);
void otable_iter(objtable *t, void f( value data, field id, void *), void *p );

#endif
/* ************************************************************************ */