Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
a2ce2c95669f2e4047aa788561c3076a086757a8
[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_type_cmp:
17  *
18  * Compares two datadesc types with the same semantic than strcmp.
19  *
20  * This comparison does not take the set headers into account (name and ID), 
21  * but only the payload (actual type description).
22  */
23 int gras_datadesc_type_cmp(const gras_datadesc_t *d1,
24                           const gras_datadesc_t *d2) {
25   int ret,cpt;
26   gras_dd_cat_struct_field_t *field1,*field2;
27
28
29   if (!d1 & & d2) return 1;
30   if (!d1 && !d2) return 0;
31   if ( d1 && !d2) return -1;
32
33   if (d1->size          != d2->size     )     return d1->size          > d2->size         ? 1 : -1;
34   if (d1->alignment     != d2->alignment)     return d1->alignment     > d2->alignment    ? 1 : -1;
35   if (d1->aligned_size  != d2->aligned_size)  return d1->aligned_siz e > d2->aligned_size ? 1 : -1;
36
37   if (d1->category_code != d2->category_code) return d1->category_code > d2->category_code ? 1 : -1;
38
39   if (d1->pre           != d2->pre)           return d1->pre           > d2->pre ? 1 : -1;
40   if (d1->post          != d2->post)          return d1->post          > d2->post ? 1 : -1;
41
42   switch (d1->category_code) {
43   case e_gras_datadesc_type_cat_scalar:
44     if (d1->category.scalar_data.encoding != d2->category.scalar_data.encoding)
45       return d1->category.scalar_data.encoding > d2->category.scalar_data.encoding ? 1 : -1 ;
46     break;
47     
48   case e_gras_datadesc_type_cat_struct:
49     if (d1->category.struct_data.field_count != d2->category.struct_data.field_count) 
50       return d1->category.struct_data.field_count > d2->category.struct_data.field_count ? 1 : -1;
51     
52     if (gras_dynar_length(d1->category.struct_data.fields) != 
53         gras_dynar_length(d2->category.struct_data.fields))
54       return gras_dynar_length(d1->category.struct_data.fields) >
55         gras_dynar_length(d2->category.struct_data.fields) ?
56         1 : -1;
57     
58     gras_dynar_foreach(d1->category.struct_data.fields, cpt, field1) {
59       
60       gras_dynar_get(d2->category.struct_data.fields, cpt, field2);
61       ret = gras_datadesc_type_cmp(field1,field2);
62       if (ret)
63         return ret;
64       
65     }
66     break;
67     
68   case e_gras_datadesc_type_cat_union:
69     if (d1->category.union_data.field_count != d2->category.union_data.field_count) 
70       return d1->category.union_data.field_count > d2->category.union_data.field_count ? 1 : -1;
71     
72     if (gras_dynar_length(d1->category.union_data.fields) != 
73         gras_dynar_length(d2->category.union_data.fields))
74       return gras_dynar_length(d1->category.union_data.fields) >
75              gras_dynar_length(d2->category.union_data.fields) ?
76         1 : -1;
77     
78     gras_dynar_foreach(d1->category.union_data.fields, cpt, field1) {
79       
80       gras_dynar_get(d2->category.union_data.fields, cpt, field2);
81       ret = gras_datadesc_type_cmp(field1,field2);
82       if (ret)
83         return ret;
84       
85     }
86     break;
87     
88     
89   case e_gras_datadesc_type_cat_ref:
90     if (d1->category.ref_data.discriminant != d2->category.ref_data.discriminant) 
91       return d1->category.ref_data.discriminant > d2->category.ref_data.discriminant ? 1 : -1;
92     
93     if (d1->category.ref_data.code != d2->category.ref_data.code) 
94       return d1->category.ref_data.code > d2->category.ref_data.code ? 1 : -1;
95     break;
96     
97   case e_gras_datadesc_type_cat_array:
98     if (d1->category.array_data.code != d2->category.array_data.code) 
99       return d1->category.array_data.code > d2->category.array_data.code ? 1 : -1;
100     
101     if (d1->category.array_data.fixed_size != d2->category.array_data.fixed_size) 
102       return d1->category.array_data.fixed_size > d2->category.array_data.fixed_size ? 1 : -1;
103     
104     if (d1->category.array_data.dynamic_size != d2->category.array_data.dynamic_size) 
105       return d1->category.array_data.dynamic_size > d2->category.array_data.dynamic_size ? 1 : -1;
106     
107     break;
108     
109   case e_gras_datadesc_type_cat_ignored:
110     /* That's ignored... */
111   default:
112     /* two stupidly created ddt are equally stupid ;) */
113     break;
114   }
115   return 0;
116   
117 }
118
119 gras_error_t gras_datadesc_cpy(gras_datadesc_t *type, void *src, void **dst) {
120   
121 }