Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[Messaging]
[simgrid.git] / src / gras / DataDesc / datadesc_private.h
1 /* $Id$ */
2
3 /* datadesc - describing the data to exchange                               */
4
5 /* module's private interface masked even to other parts of GRAS.           */
6
7 /* Authors: Olivier Aumage, Martin Quinson                                  */
8 /* Copyright (C) 2003, 2004 the GRAS posse.                                 */
9
10 /* This program is free software; you can redistribute it and/or modify it
11    under the terms of the license (GNU LGPL) which comes with this package. */
12
13 #ifndef GRAS_DATADESC_PRIVATE_H
14 #define GRAS_DATADESC_PRIVATE_H
15
16 #include "gras_private.h"
17 #include "DataDesc/datadesc_interface.h"
18
19 /**
20  * aligned:
21  * 
22  * Align the data v on the boundary a.
23  */
24 #define aligned(v, a) (((v) + (a - 1)) & ~(a - 1))
25
26 extern gras_set_t *gras_datadesc_set_local;
27
28 /*******************************************
29  * Descriptions of all known architectures *
30  *******************************************/
31
32 #define gras_arch_count 1
33 typedef enum {
34   gras_ddt_scalar_char      = 0,
35   gras_ddt_scalar_short     = 1,
36   gras_ddt_scalar_int       = 2,
37   gras_ddt_scalar_long      = 3,
38   gras_ddt_scalar_long_long = 4,
39
40   gras_ddt_scalar_pdata     = 5,
41   gras_ddt_scalar_pfunc     = 6,
42
43   gras_ddt_scalar_float     = 7,
44   gras_ddt_scalar_double    = 8
45 } gras_ddt_scalar_type_t;
46
47 typedef struct {
48   const char *name;
49
50   int endian;
51
52   int sizeof_scalars[9]; /* char,short,int,long,long_long,
53                             pdata,pfunc,
54                             float,double */
55 } gras_arch_sizes_t;
56
57 extern const gras_arch_sizes_t gras_arch_sizes[gras_arch_count];
58
59
60 /**********************************************************/
61 /* Actual definitions of the stuff in the type descriptor */
62 /**********************************************************/
63
64 /**
65  * e_gras_datadesc_type_category:
66  *
67  * Defines all possible type categories
68  */
69 typedef enum e_gras_datadesc_type_category {
70         e_gras_datadesc_type_cat_undefined = 0,
71
72         e_gras_datadesc_type_cat_scalar = 1,
73         e_gras_datadesc_type_cat_struct = 2,
74         e_gras_datadesc_type_cat_union = 3,
75         e_gras_datadesc_type_cat_ref = 4,       /* ref to an uniq element */
76         e_gras_datadesc_type_cat_array = 5,
77         e_gras_datadesc_type_cat_ignored = 6,
78
79         e_gras_datadesc_type_cat_invalid = 7
80 } gras_datadesc_type_category_t;
81
82
83 /*------------------------------------------------*/
84 /* definitions of specific data for each category */
85 /*------------------------------------------------*/
86 /**
87  * s_gras_dd_cat_field:
88  *
89  * Fields of struct and union
90  */
91 typedef struct s_gras_dd_cat_field {
92
93   char                        *name;
94   long int                     offset[gras_arch_count]; /* only for struct */
95   int                          code;
96   
97   gras_datadesc_type_cb_void_t pre;
98   gras_datadesc_type_cb_void_t post;
99
100 } gras_dd_cat_field_t;
101
102 void gras_dd_cat_field_free(void *f);
103
104 /**
105  * gras_dd_cat_scalar_t:
106  *
107  * Specific fields of a scalar
108  */
109 enum e_gras_dd_scalar_encoding {
110   e_gras_dd_scalar_encoding_undefined = 0,
111   
112   e_gras_dd_scalar_encoding_uint,
113   e_gras_dd_scalar_encoding_sint,
114   e_gras_dd_scalar_encoding_float,
115   
116   e_gras_dd_scalar_encoding_invalid 
117 };
118 typedef struct s_gras_dd_cat_scalar {
119   enum e_gras_dd_scalar_encoding encoding;
120 } gras_dd_cat_scalar_t;
121
122 /**
123  * gras_dd_cat_struct_t:
124  *
125  * Specific fields of a struct
126  */
127 typedef struct s_gras_dd_cat_struct {
128   gras_dynar_t *fields; /* elm type = gras_dd_cat_field_t */
129 } gras_dd_cat_struct_t;
130
131 /**
132  * gras_dd_cat_union_t:
133  *
134  * Specific fields of a union
135  */
136 typedef struct s_gras_dd_cat_union {
137   gras_datadesc_type_cb_int_t selector;
138   gras_dynar_t *fields; /* elm type = gras_dd_cat_field_t */
139 } gras_dd_cat_union_t;
140
141 /**
142  * gras_dd_cat_ref_t:
143  *
144  * Specific fields of a reference
145  */
146 typedef struct s_gras_dd_cat_ref {
147   int                           code;
148
149   /* callback used to return the referenced type number  */
150   gras_datadesc_type_cb_int_t   selector;
151 } gras_dd_cat_ref_t;
152
153
154 /**
155  * gras_dd_cat_array_t:
156  *
157  * Specific fields of an array
158  */
159 typedef struct s_gras_dd_cat_array {
160   int                           code;
161
162   /* element_count < 0 means dynamically defined */
163   long int                        fixed_size;
164
165   /* callback used to return the dynamic length */
166   gras_datadesc_type_cb_int_t dynamic_size;
167 } gras_dd_cat_array_t;
168
169 /**
170  * gras_dd_cat_ignored_t:
171  *
172  * Specific fields of an ignored field
173  */
174 typedef struct s_gras_dd_cat_ignored {
175   void                          *default_value;
176   void_f_pvoid_t                *free_func;
177 } gras_dd_cat_ignored_t;
178
179
180 /**
181  * u_gras_datadesc_category:
182  *
183  * Specific data to each possible category
184  */
185 union u_gras_datadesc_category {
186         void                  *undefined_data;
187         gras_dd_cat_scalar_t   scalar_data;
188         gras_dd_cat_struct_t   struct_data;
189         gras_dd_cat_union_t    union_data;
190         gras_dd_cat_ref_t      ref_data;
191         gras_dd_cat_array_t    array_data;
192         gras_dd_cat_ignored_t  ignored_data;
193 };
194
195
196 /****************************************/
197 /* The holy grail: type descriptor type */
198 /****************************************/
199 /**
200  * s_gras_datadesc_type:
201  *
202  * Type descriptor.
203  */
204 struct s_gras_datadesc_type {
205   /* headers for the data set */
206   unsigned int                         code;
207   char                                *name;
208   unsigned int                         name_len;
209         
210   /* payload */
211   long int                             size[gras_arch_count];
212   
213   long int                             alignment[gras_arch_count];
214   long int                             aligned_size[gras_arch_count];
215   
216   enum  e_gras_datadesc_type_category  category_code;
217   union u_gras_datadesc_category       category;
218   
219   gras_datadesc_type_cb_void_t         pre;
220   gras_datadesc_type_cb_void_t         post;
221 };
222
223 /***************************
224  * Type creation functions *
225  ***************************/
226 gras_error_t 
227 gras_datadesc_declare_scalar(const char                       *name,
228                              gras_ddt_scalar_type_t           type,
229                              enum e_gras_dd_scalar_encoding   encoding,
230                              gras_datadesc_type_cb_void_t     cb,
231                              gras_datadesc_type_t           **dst);
232
233 /* Do not use it on a registered type ! */
234 void gras_ddt_free(gras_datadesc_type_t **type);
235
236 /****************************************************
237  * Callback persistant state constructor/destructor *
238  ****************************************************/
239 gras_error_t
240 gras_dd_cbps_new(gras_dd_cbps_t **dst);
241 void
242 gras_dd_cbps_free(gras_dd_cbps_t **state);
243
244 /***************
245  * Convertions *
246  ***************/
247 gras_error_t
248 gras_dd_convert_elm(gras_datadesc_type_t *type,
249                     int r_arch, 
250                     void *src, void *dst);
251
252 #endif /* GRAS_DATADESC_PRIVATE_H */