File: dict.h

package info (click to toggle)
mercury 0.9-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 18,488 kB
  • ctags: 9,800
  • sloc: objc: 146,680; ansic: 51,418; sh: 6,436; lisp: 1,567; cpp: 1,040; perl: 854; makefile: 450; asm: 232; awk: 203; exp: 32; fortran: 3; csh: 1
file content (102 lines) | stat: -rw-r--r-- 2,637 bytes parent folder | download
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
** Copyright (C) 1997 The University of Melbourne.
** This file may only be copied under the terms of the GNU Library General
** Public License - see the file COPYING.LIB in the Mercury distribution.
**
** $Id: dict.h,v 1.3 1997/07/27 14:59:20 fjh Exp $
*/


#ifndef MB_DICT_H
#define	MB_DICT_H

/*
**	A simple abstract data type for a key-value dictionary.
**
**	Note that this type is ABSTRACT. Client code must not refer to
**	any types or fields prefixed with "p_" since they are private 
**	(part of the implementation, not of the interface) and may be
**	changed or removed if the implementation changes. ADTs in C
**	are never pretty.
**
**	Given how slow the current implementation is, you can be sure
**	it will change. 8^)
**
**	Note: The "_p" -suffix- denotes a pointer, not a private type or data.
*/

typedef int (*KeyComparison)(const void *, const void *);

typedef struct p_Dict_Item {
	void			*p_key;
	void			*p_val;
	struct p_Dict_Item	*p_next;
} p_Dict_Item;
	

typedef struct Dict {
	KeyComparison	p_key_cmp;
	p_Dict_Item	*p_items;
} Dict;

/*
** Create a new dictionary that uses a given comparison function.
** The comparsion function works like strcmp. Specifically, key_cmp(x1,x2)
** returns negative if x1 < x2, zero if x1==x2, positive if x1>x2.
** XXX: Should also pass in some sort of string to identify the dictionary?
*/
Dict
dict_new(KeyComparison key_cmp);

/*
** Return TRUE if a dictionary is empty, false otherwise.
*/
MB_Bool
dict_is_empty(Dict dict);

/*
** Insert key-value pair into dictionary.
*/
void
dict_insert(void *key, void *val, Dict *dict_p);

/*
** Lookup value corresponding to key. Returns TRUE if lookup succeeded,
** FALSE if it failed.
*/
MB_Bool
dict_lookup(void *key, Dict dict, void **val_p);

/*
** Delete key-value pair corresponding to key.
*/
void
dict_delete(void *key, Dict *dict_p);

/*
** Return the key comparison function used by a dictionary.
*/
KeyComparison
dict_key_compare(Dict dict);

/*
** Return the `first' key in the dictionary. In fact, this simply
** returns -any- key in the dictionary. This allows us to iterate
** over all elements in the dictionary. Procedure returns FALSE
** if there is no first key (dict is empty) and TRUE otherwise.
** The first key itself is returned through first_key_p.
*/
MB_Bool
dict_first_key(Dict dict, void **first_key_p);

/*
** In the given dictionary, returns the key following this_key.
** The next key is returned through next_key_p. Returns FALSE if
** there is no next key or this_key doesn't exist, TRUE otherwise.
*/
MB_Bool
dict_next_key(Dict dict, void *this_key, void **next_key_p);

#endif	/* MB_DICT_H */