Preliminary add of header files
[lttv.git] / ltt / branches / poly / lttv / attribute.h
CommitLineData
c5d77517 1#ifndef ATTRIBUTE_H
2#define ATTRIBUTE_H
3
4
5#include <glib.h>
6#include <time.h>
7
8/* Attributes are used to store any value identified by a key. They are
9 typically used to store state information or accumulated statistics for
10 some object. Each value is accessed through a multi-component key, which
11 resembles hierarchical pathnames in filesystems.
12
13 The attributes may store integers, doubles or time values, in which case
14 the values are created upon first access of a key and with a default
15 value of 0. Pointer values are also available with a default value of NULL
16 and must thus be set explicitely to user managed (statically or dynamically
17 allocated) memory. */
18
19
20typedef guint32 lttv_string_id;
21
22typedef GArray _lttv_key;
23
24typedef _lttv_key lttv_key;
25
26typedef struct timespec lttv_time;
27
28
29typedef struct _lttv_attributes {
30 GHashTable *ints;
31 GHashTable *times;
32 GHashTable *doubles;
33 GHashTable *pointers;
34} lttv_attributes;
35
36
37/* A unique integer identifier represents each different string
38 used as a key component. A single copy of each different string is
39 stored but its usage count is incremented each time the corresponding id
40 is returned by lttv_string_id_from_string. The usage count is decremented
41 each time an id is released. */
42
43lttv_string_id lttv_string_id_from_string(const char *s);
44
45void lttv_string_id_release(lttv_string_id i);
46
47const char *lttv_string_id_to_string(lttv_string_id i);
48
49
50/* Keys are created and subsequently filled with key components */
51
52lttv_key *lttv_key_new();
53
54void lttv_key_destroy(lttv_key *k);
55
56/* macro to access/replace a the i th component of key k */
57
58#define lttv_key_index(k,i) _lttv_key_index(k,i)
59
60
61/* Append a new component */
62
63void lttv_key_append(lttv_key *k, lttv_string_id i);
64
65
66/* Number of components in a key */
67
68unsigned int lttv_key_number(lttv_key *k);
69
70
71/* It is also possible to create a key directly from a pathname,
72 key components separated by /, (e.g., "/hooks/options/before"). */
73
74lttv_key *lttv_key_new_pathname(const char *pathname);
75
76
77/* Create a new set of attributes */
78
79lttv_attributes *lttv_attributes_new();
80
81
82/* Destroy the set of attributes including all the memory allocated
83 internally for it (copies of keys, and integer, double and time
84 values...). */
85
86void lttv_attributes_destroy(lttv_attributes *a);
87
88
89/* Total number of attributes in a lttv_attributes. */
90
91unsigned int lttv_attributes_number(lttv_attributes *a);
92
93
94/* Obtain a pointer to the value of the corresponding type associated with
95 the specified key. New values are created on demand with 0 as initial
96 value. These values are freed when the attributes set is destroyed. */
97
98int *lttv_attributes_get_integer(lttv_attributes *a, lttv_key *k);
99
100lttv_time *lttv_attributes_get_time(lttv_attributes *a, lttv_key *k);
101
102double *lttv_attributes_get_double(lttv_attributes *a, lttv_key *k);
103
104
105/* Set or get the pointer value associated with the specified key.
106 NULL is returned if no pointer was set for the key. */
107
108void *lttv_attributes_get_pointer(lttv_attributes *a, lttv_key *k);
109
110void lttv_attributes_set_pointer(lttv_attributes *a, lttv_key *k, void *p);
111
112void *lttv_attributes_get_pointer_pathname(lttv_attributes *a, char *pn);
113
114void lttv_attributes_set_pointer_pathname(lttv_attributes *a,char *pn,void *p);
115
116
117typedef int (*lttv_key_select)(lttv_key *in, lttv_key *out, void *user_data);
118
119typedef enum _lttv_key_select_action
120{ LTTV_KEEP, LTTV_KEEP_EQUAL, LTTV_KEEP_SMALLER, LTTV_KEEP_GREATER, LTTV_IGNORE
121} lttv_key_select_action;
122
123typedef struct _lttv_key_select_spec_data
124{
125 unsigned length;
126 lttv_key_select_action *spec;
127 lttv_key *match;
128} lttv_key_select_spec_data;
129
130int lttv_key_select_spec(lttv_key *in, lttv_key *out, void *user_data);
131
132lttv_attributes *lttv_attributes_select(lttv_attributes *a, lttv_key_select f,
133 void *user_data);
134
135
136/* Sometimes the attributes must be accessed in bulk, sorted in different
137 ways. For this purpose they may be converted to arrays and sorted
138 multiple times. The keys used in the array belong to the lttv_attributes
139 object from which the array was obtained and are freed when it is
140 destroyed. Each element in the array is an lttv_attribute, a structure
141 containing the key, the value type, and a union containing a value of
142 that type. Multiple attributes with equal keys may be possible in some
143 implementations if their type differs. */
144
145
146typedef enum _lttv_attribute_type
147{ LTTV_INTEGER, LTTV_TIME, LTTV_DOUBLE, LTTV_POINTER }
148lttv_attribute_type;
149
150typedef union _lttv_value_any
151{ int i;
152 lttv_time t;
153 double d;
154 void *p;
155} lttv_value_any;
156
157typedef struct _lttv_attribute {
158 lttv_key *key;
159 lttv_attribute_type t;
160 lttv_value_any v;
161} lttv_attribute;
162
163
164/* User defined function used to compare keys in the sort. It returns
165 a negative value if a < b, 0 if a = b, and a positive if a > b. */
166
167typedef int (*lttv_key_compare)(lttv_key *a, lttv_key *b, void *user_data);
168
169int lttv_key_compare_priority(lttv_key *a, lttv_key *b, void *compare_data);
170
171
172/* Obtain all the attributes in an array */
173
174lttv_attribute *lttv_attributes_array_get(lttv_attributes *a);
175
176lttv_attribute *lttv_attribute_array_destroy(lttv_attribute *a);
177
178void lttv_attribute_array_sort(lttv_attribute *a, unsigned size,
179 lttv_key_compare f, void *user_data);
180
181#endif // ATTRIBUTE_H
This page took 0.027526 seconds and 4 git commands to generate.