Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
cosmetics
[simgrid.git] / src / gras / DataDesc / ddt_use.c
1 /* $Id$ */
2
3 /* ddt_use - use of datatypes structs (public)                              */
4
5 /* Authors: Olivier Aumage, Martin Quinson                                  */
6 /* Copyright (C) 2003, 2004 the GRAS posse.                                 */
7
8 /* This program is free software; you can redistribute it and/or modify it
9    under the terms of the license (GNU LGPL) which comes with this package. */
10
11 #include "DataDesc/datadesc_private.h"
12
13 //GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(use,DataDesc);
14
15 /**
16  * gras_datadesc_get_id_from_name:
17  * Returns: -1 in case of error.
18  *
19  * Retrieve the ID of a previously declared datatype from its name.
20  */
21 long int
22 gras_datadesc_get_id_from_name(const char *name) {
23   gras_error_t errcode;
24   gras_datadesc_type_t *type;
25
26   errcode = gras_ddt_get_by_name(name,&type);
27   if (errcode != no_error)
28     return -1;
29   return type->code;
30 }
31
32 /**
33  * gras_datadesc_type_cmp:
34  *
35  * Compares two datadesc types with the same semantic than strcmp.
36  *
37  * This comparison does not take the set headers into account (name and ID), 
38  * but only the payload (actual type description).
39  */
40 int gras_datadesc_type_cmp(const gras_datadesc_type_t *d1,
41                            const gras_datadesc_type_t *d2) {
42   int ret,cpt;
43   gras_dd_cat_field_t *field1,*field2;
44   gras_datadesc_type_t *field_desc_1,*field_desc_2;
45
46
47   if (!d1 && d2) return 1;
48   if (!d1 && !d2) return 0;
49   if ( d1 && !d2) return -1;
50
51   if (d1->size          != d2->size     )     return d1->size          > d2->size         ? 1 : -1;
52   if (d1->alignment     != d2->alignment)     return d1->alignment     > d2->alignment    ? 1 : -1;
53   if (d1->aligned_size  != d2->aligned_size)  return d1->aligned_size  > d2->aligned_size ? 1 : -1;
54
55   if (d1->category_code != d2->category_code) return d1->category_code > d2->category_code ? 1 : -1;
56
57   if (d1->pre           != d2->pre)           return d1->pre           > d2->pre ? 1 : -1;
58   if (d1->post          != d2->post)          return d1->post          > d2->post ? 1 : -1;
59
60   switch (d1->category_code) {
61   case e_gras_datadesc_type_cat_scalar:
62     if (d1->category.scalar_data.encoding != d2->category.scalar_data.encoding)
63       return d1->category.scalar_data.encoding > d2->category.scalar_data.encoding ? 1 : -1 ;
64     break;
65     
66   case e_gras_datadesc_type_cat_struct:    
67     if (gras_dynar_length(d1->category.struct_data.fields) != 
68         gras_dynar_length(d2->category.struct_data.fields))
69       return gras_dynar_length(d1->category.struct_data.fields) >
70         gras_dynar_length(d2->category.struct_data.fields) ?
71         1 : -1;
72     
73     gras_dynar_foreach(d1->category.struct_data.fields, cpt, field1) {
74       
75       gras_dynar_get(d2->category.struct_data.fields, cpt, field2);
76       gras_ddt_get_by_code(field1->code,&field_desc_1); /* FIXME: errcode ignored */
77       gras_ddt_get_by_code(field2->code,&field_desc_2);
78       ret = gras_datadesc_type_cmp(field_desc_1,field_desc_2);
79       if (ret)
80         return ret;
81       
82     }
83     break;
84     
85   case e_gras_datadesc_type_cat_union:
86     if (d1->category.union_data.field_count != d2->category.union_data.field_count) 
87       return d1->category.union_data.field_count > d2->category.union_data.field_count ? 1 : -1;
88     
89     if (gras_dynar_length(d1->category.union_data.fields) != 
90         gras_dynar_length(d2->category.union_data.fields))
91       return gras_dynar_length(d1->category.union_data.fields) >
92              gras_dynar_length(d2->category.union_data.fields) ?
93         1 : -1;
94     
95     gras_dynar_foreach(d1->category.union_data.fields, cpt, field1) {
96       
97       gras_dynar_get(d2->category.union_data.fields, cpt, field2);
98       gras_ddt_get_by_code(field1->code,&field_desc_1); /* FIXME: errcode ignored */
99       gras_ddt_get_by_code(field2->code,&field_desc_2);
100       ret = gras_datadesc_type_cmp(field_desc_1,field_desc_2);
101       if (ret)
102         return ret;
103       
104     }
105     break;
106     
107     
108   case e_gras_datadesc_type_cat_ref:
109     if (d1->category.ref_data.discriminant != d2->category.ref_data.discriminant) 
110       return d1->category.ref_data.discriminant > d2->category.ref_data.discriminant ? 1 : -1;
111     
112     if (d1->category.ref_data.code != d2->category.ref_data.code) 
113       return d1->category.ref_data.code > d2->category.ref_data.code ? 1 : -1;
114     break;
115     
116   case e_gras_datadesc_type_cat_array:
117     if (d1->category.array_data.code != d2->category.array_data.code) 
118       return d1->category.array_data.code > d2->category.array_data.code ? 1 : -1;
119     
120     if (d1->category.array_data.fixed_size != d2->category.array_data.fixed_size) 
121       return d1->category.array_data.fixed_size > d2->category.array_data.fixed_size ? 1 : -1;
122     
123     if (d1->category.array_data.dynamic_size != d2->category.array_data.dynamic_size) 
124       return d1->category.array_data.dynamic_size > d2->category.array_data.dynamic_size ? 1 : -1;
125     
126     break;
127     
128   case e_gras_datadesc_type_cat_ignored:
129     /* That's ignored... */
130   default:
131     /* two stupidly created ddt are equally stupid ;) */
132     break;
133   }
134   return 0;
135   
136 }
137
138 /**
139  * gras_datadesc_cpy:
140  *
141  * Copy the data pointed by src and described by type to a new location, and store a pointer to it in dst.
142  *
143  */
144 gras_error_t gras_datadesc_cpy(gras_datadesc_type_t *type, void *src, void **dst) {
145   RAISE_UNIMPLEMENTED;
146 }
147
148 /**
149  * gras_datadesc_send:
150  *
151  * Copy the data pointed by src and described by type to the socket
152  *
153  */
154 gras_error_t gras_datadesc_send(gras_socket_t *sock, gras_datadesc_type_t *type, void *src) {
155
156   RAISE_UNIMPLEMENTED;
157 }
158
159 /**
160  * gras_datadesc_recv:
161  *
162  * Get an instance of the datatype described by @type from the @socket, and store a pointer to it in @dst
163  *
164  */
165 gras_error_t
166 gras_datadesc_recv(gras_socket_t *sock, gras_datadesc_type_t *type, void **dst) {
167   RAISE_UNIMPLEMENTED;
168 }