1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 2010, 2012 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 #define LIBPSPP_PXD_H 1
25 #include "data/case.h"
26 #include "libpspp/hmap.h"
35 struct pxd *pxd_open (const char *name, bool create);
36 void pxd_close (struct pxd *);
38 struct pxd_object *pxd_fetch (const struct pxd *, const struct pxd_id *);
39 void pxd_store (struct pxd *, const struct pxd_object *);
41 void pxd_get_root (const struct pxd *, struct pxd_id *);
42 bool pxd_swap_root (struct pxd *, const struct pxd_id *old_root,
43 struct pxd_object *new_root);
52 #define PXD_ID_FMT "%08"PRIx32"%08"PRIx32"%08"PRIx32"%08"PRIx32"%08"PRIx32
53 #define PXD_ID_ARGS(ID) \
59 #define PXD_ID_SCAN_ARGS(ID) \
67 pxd_id_equals (const struct pxd_id *a, const struct pxd_id *b)
69 return (a->opaque[0] == b->opaque[0]
70 && a->opaque[1] == b->opaque[1]
71 && a->opaque[2] == b->opaque[2]
72 && a->opaque[3] == b->opaque[3]
73 && a->opaque[4] == b->opaque[4]);
76 static inline uint32_t
77 pxd_id_hash (const struct pxd_id *id)
86 struct hmap_node hmap_node;
95 struct pxd_object *pxd_object_create (const struct pxd_id[], size_t,
96 const void *, size_t);
98 struct pxd_object *pxd_object_ref (const struct pxd_object *);
99 void pxd_object_unref (struct pxd_object *);
101 static inline const struct pxd_id *
102 pxd_object_id (const struct pxd_object *obj)
107 static inline unsigned int
108 pxd_object_get_n_links (const struct pxd_object *obj)
113 static inline const struct pxd_id *
114 pxd_object_get_link_id (const struct pxd_object *obj, unsigned int idx)
116 return &obj->links[idx];
119 static inline struct pxd_object *
120 pxd_object_get_link (const struct pxd_object *obj, unsigned int idx,
121 const struct pxd *pxd)
123 return pxd_fetch (pxd, pxd_object_get_link_id (obj, idx));
126 static inline unsigned int
127 pxd_object_size (const struct pxd_object *obj)
132 static inline const uint8_t *
133 pxd_object_data (const struct pxd_object *obj)
138 void *pxd_object_raw_data__ (const struct pxd_object *);
139 size_t pxd_object_raw_size__ (const struct pxd_object *);
141 /* Object builder. */
147 struct pxd_id *links;
148 unsigned int n_links, links_allocated;
151 unsigned int size, data_allocated;
154 void pxd_builder_init (struct pxd_builder *, struct pxd *);
155 void pxd_builder_destroy (struct pxd_builder *);
157 struct pxd_object *pxd_builder_commit (struct pxd_builder *);
159 void *pxd_builder_put_uninit (struct pxd_builder *, size_t);
160 void pxd_builder_put (struct pxd_builder *, const void *, size_t);
161 void pxd_builder_put_value (struct pxd_builder *,
162 const union value *, int width);
163 void pxd_builder_put_string (struct pxd_builder *, const char *);
164 void pxd_builder_put_interned_string (struct pxd_builder *, const char *);
165 void pxd_builder_put_bool (struct pxd_builder *, bool);
166 void pxd_builder_put_u8 (struct pxd_builder *, unsigned char);
167 void pxd_builder_put_u16 (struct pxd_builder *, unsigned short int);
168 void pxd_builder_put_u32 (struct pxd_builder *, unsigned int);
169 void pxd_builder_put_u64 (struct pxd_builder *, unsigned long long int);
170 void pxd_builder_put_s8 (struct pxd_builder *, signed char);
171 void pxd_builder_put_s16 (struct pxd_builder *, short int);
172 void pxd_builder_put_s32 (struct pxd_builder *, int);
173 void pxd_builder_put_s64 (struct pxd_builder *, long long int);
174 void pxd_builder_put_size_t (struct pxd_builder *, size_t);
175 void pxd_builder_put_casenumber (struct pxd_builder *, casenumber);
176 void pxd_builder_put_double (struct pxd_builder *, double);
178 void pxd_builder_put_link (struct pxd_builder *, struct pxd_object *);
184 struct pxd_object *obj;
185 const struct pxd *pxd;
190 void pxd_parser_init (struct pxd_parser *,
191 struct pxd_object *, const struct pxd *);
192 void pxd_parser_destroy (struct pxd_parser *);
194 const void *pxd_parser_get (struct pxd_parser *, size_t);
195 void pxd_parser_get_copy (struct pxd_parser *, void *, size_t);
196 void pxd_parser_get_value (struct pxd_parser *, union value *, int width);
197 char *pxd_parser_get_string (struct pxd_parser *);
198 const char *pxd_parser_get_interned_string (struct pxd_parser *);
199 bool pxd_parser_get_bool (struct pxd_parser *);
200 unsigned char pxd_parser_get_u8 (struct pxd_parser *);
201 unsigned short int pxd_parser_get_u16 (struct pxd_parser *);
202 unsigned int pxd_parser_get_u32 (struct pxd_parser *);
203 unsigned long long int pxd_parser_get_u64 (struct pxd_parser *);
204 signed char pxd_parser_get_s8 (struct pxd_parser *);
205 short int pxd_parser_get_s16 (struct pxd_parser *);
206 int pxd_parser_get_s32 (struct pxd_parser *);
207 long long int pxd_parser_get_s64 (struct pxd_parser *);
208 size_t pxd_parser_get_size_t (struct pxd_parser *);
209 casenumber pxd_parser_get_casenumber (struct pxd_parser *);
210 double pxd_parser_get_double (struct pxd_parser *);
211 struct pxd_object *pxd_parser_get_link (struct pxd_parser *);
215 #define PXD_ARRAY_LEVELS 10
216 #define PXD_ARRAY_BITS 5
218 struct pxd_array_builder
220 struct pxd_builder b;
223 void pxd_array_builder_init (struct pxd_array_builder *, struct pxd *);
224 void pxd_array_builder_destroy (struct pxd_array_builder *);
226 struct pxd_object *pxd_array_builder_commit (struct pxd_array_builder *);
228 void pxd_array_builder_add (struct pxd_array_builder *, struct pxd_object *);
234 const struct pxd *pxd;
235 struct pxd_object *obj;
238 void pxd_array_init (struct pxd_array *, struct pxd_object *,
240 void pxd_array_destroy (struct pxd_array *);
242 static inline unsigned long long int
243 pxd_array_size (const struct pxd_array *array)
245 return array->obj->n_links;
248 static inline struct pxd_object *
249 pxd_array_get (const struct pxd_array *array, unsigned long long int index)
251 return pxd_object_get_link (array->obj, index, array->pxd);
254 #endif /* libpspp/pxd.h */