stats major rework, with addition of function support
[lttv.git] / ltt / branches / poly / lttv / lttv / iattribute.h
CommitLineData
9c312311 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Michel Dagenais
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
c47a6dc6 19/* FIXME : unnamed attributes not implemented */
bcc71139 20
dc877563 21#ifndef IATTRIBUTE_H
22#define IATTRIBUTE_H
23
24
25#include <glib-object.h>
308711e5 26#include <ltt/time.h>
dc877563 27
28/* The content of a data structure may be seen as an array of pairs of
29 attribute name and value. This simple model allows generic navigation
30 and access functions over a wide range of structures. The names are
31 represented by unique integer identifiers, GQuarks. */
32
c47a6dc6 33/* Please note that adding a value of type gobject that is non null does not
34 * increment the reference count of this object : the actual reference to
35 * the object is "given" to the attribute tree. When the gobject value
36 * is removed, the object is unreferenced. A value copy through
37 * lttv_iattribute_copy_value does increase the reference count of the
38 * gobject. */
39
dc877563 40typedef GQuark LttvAttributeName;
41
dc877563 42typedef enum _LttvAttributeType {
43 LTTV_INT, LTTV_UINT, LTTV_LONG, LTTV_ULONG, LTTV_FLOAT, LTTV_DOUBLE,
44 LTTV_TIME, LTTV_POINTER, LTTV_STRING, LTTV_GOBJECT, LTTV_NONE
45} LttvAttributeType;
46
47typedef union LttvAttributeValue {
48 int *v_int;
49 unsigned *v_uint;
50 long *v_long;
51 unsigned long *v_ulong;
52 float *v_float;
53 double *v_double;
308711e5 54 LttTime *v_time;
dc877563 55 gpointer *v_pointer;
56 char **v_string;
996acd92 57 GObject **v_gobject;
dc877563 58} LttvAttributeValue;
59
60
61/* GObject interface type macros */
62
63#define LTTV_IATTRIBUTE_TYPE (lttv_iattribute_get_type ())
64#define LTTV_IATTRIBUTE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_IATTRIBUTE_TYPE, LttvIAttribute))
65#define LTTV_IATTRIBUTE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_IATTRIBUTE_TYPE, LttvIAttributeClass))
66#define LTTV_IS_IATTRIBUTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_IATTRIBUTE_TYPE))
67#define LTTV_IS_IATTRIBUTE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_IATTRIBUTE_TYPE))
68#define LTTV_IATTRIBUTE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), LTTV_IATTRIBUTE_TYPE, LttvIAttributeClass))
69
70
71typedef struct _LttvIattribute LttvIAttribute; /* dummy object */
72typedef struct _LttvIAttributeClass LttvIAttributeClass;
73
74
75struct _LttvIAttributeClass {
76 GTypeInterface parent;
77
3e67c985 78 LttvIAttribute* (*new_attribute) (LttvIAttribute *self);
79
dc877563 80 unsigned int (*get_number) (LttvIAttribute *self);
81
82 gboolean (*named) (LttvIAttribute *self, gboolean *homogeneous);
83
84 LttvAttributeType (*get) (LttvIAttribute *self, unsigned i,
85 LttvAttributeName *name, LttvAttributeValue *v);
86
87 LttvAttributeType (*get_by_name) (LttvIAttribute *self,
88 LttvAttributeName name, LttvAttributeValue *v);
89
90 LttvAttributeValue (*add) (LttvIAttribute *self, LttvAttributeName name,
91 LttvAttributeType t);
92
93 void (*remove) (LttvIAttribute *self, unsigned i);
94
95 void (*remove_by_name) (LttvIAttribute *self,
96 LttvAttributeName name);
97
b445142a 98 LttvIAttribute* (*find_subdir) (LttvIAttribute *self,
dc877563 99 LttvAttributeName name);
100};
101
102
103GType lttv_iattribute_get_type(void);
104
105
106/* Total number of attributes */
107
108unsigned int lttv_iattribute_get_number(LttvIAttribute *self);
109
110
111/* Container type. Named (fields in struct or elements in a hash table)
112 or unnamed (elements in an array) attributes, homogeneous type or not. */
113
114gboolean lttv_iattribute_named(LttvIAttribute *self, gboolean *homogeneous);
115
116
117/* Get the i th attribute along with its type and a pointer to its value. */
118
119LttvAttributeType lttv_iattribute_get(LttvIAttribute *self, unsigned i,
120 LttvAttributeName *name, LttvAttributeValue *v);
121
122
123/* Get the named attribute in the table along with its type and a pointer to
124 its value. If the named attribute does not exist, the type is LTTV_NONE. */
125
126LttvAttributeType lttv_iattribute_get_by_name(LttvIAttribute *self,
127 LttvAttributeName name, LttvAttributeValue *v);
128
129
130/* Add an attribute, which must not exist. The name is an empty string for
131 containers with unnamed attributes. Its value is initialized to 0 or NULL
132 and its pointer returned. */
133
134LttvAttributeValue lttv_iattribute_add(LttvIAttribute *self,
135 LttvAttributeName name, LttvAttributeType t);
136
dc877563 137/* Remove an attribute */
138
139void lttv_iattribute_remove(LttvIAttribute *self, unsigned i);
140
141void lttv_iattribute_remove_by_name(LttvIAttribute *self,
142 LttvAttributeName name);
143
144
145/* Create an empty iattribute object and add it as an attribute under the
146 specified name, or return an existing iattribute attribute. If an
147 attribute of that name already exists but is not a GObject supporting the
148 iattribute interface, return NULL. */
149
b445142a 150LttvIAttribute* lttv_iattribute_find_subdir(LttvIAttribute *self,
dc877563 151 LttvAttributeName name);
152
153
154/* The remaining utility functions are not part of the LttvIAttribute
155 interface but operate on objects implementing it. */
156
157/* Find the named attribute in the table, which must be of the specified type.
158 If it does not exist, it is created with a default value of 0 (NULL for
159 pointer types). Since the address of the value is obtained, it may be
160 changed easily afterwards. The function returns false when the attribute
161 exists but is of incorrect type. */
162
163gboolean lttv_iattribute_find(LttvIAttribute *self, LttvAttributeName name,
164 LttvAttributeType t, LttvAttributeValue *v);
165
166
167/* Trees of attribute tables may be accessed using a hierarchical path with
168 components separated by /, like in filesystems */
169
170gboolean lttv_iattribute_find_by_path(LttvIAttribute *self, char *path,
171 LttvAttributeType t, LttvAttributeValue *v);
172
173
174/* Shallow and deep copies */
175
176void lttv_iattribute_copy_value(LttvAttributeType t, LttvAttributeValue dest,
177 LttvAttributeValue src);
178
179LttvIAttribute *lttv_iattribute_shallow_copy(LttvIAttribute *self);
180
181LttvIAttribute *lttv_iattribute_deep_copy(LttvIAttribute *self);
182
183#endif // IATTRIBUTE_H
This page took 0.044657 seconds and 4 git commands to generate.