1 /* Array and structure constructors
2 Copyright (C) 2009, 2010
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
24 #include "constructor.h"
28 node_free (splay_tree_value value
)
30 gfc_constructor
*c
= (gfc_constructor
*)value
;
33 gfc_free_expr (c
->expr
);
36 gfc_free_iterator (c
->iterator
, 1);
38 mpz_clear (c
->offset
);
44 static gfc_constructor
*
45 node_copy (splay_tree_node node
, void *base
)
47 gfc_constructor
*c
, *src
= (gfc_constructor
*)node
->value
;
49 c
= XCNEW (gfc_constructor
);
50 c
->base
= (gfc_constructor_base
)base
;
51 c
->expr
= gfc_copy_expr (src
->expr
);
52 c
->iterator
= gfc_copy_iterator (src
->iterator
);
53 c
->where
= src
->where
;
54 c
->n
.component
= src
->n
.component
;
56 mpz_init_set (c
->offset
, src
->offset
);
63 node_copy_and_insert (splay_tree_node node
, void *base
)
65 int n
= mpz_get_si (((gfc_constructor
*)node
->value
)->offset
);
66 gfc_constructor_insert ((gfc_constructor_base
*)base
,
67 node_copy (node
, base
), n
);
73 gfc_constructor_get (void)
75 gfc_constructor
*c
= XCNEW (gfc_constructor
);
80 mpz_init_set_si (c
->offset
, 0);
85 gfc_constructor_base
gfc_constructor_get_base (void)
87 return splay_tree_new (splay_tree_compare_ints
, NULL
, node_free
);
92 gfc_constructor_copy (gfc_constructor_base base
)
94 gfc_constructor_base new_base
;
99 new_base
= gfc_constructor_get_base ();
100 splay_tree_foreach (base
, node_copy_and_insert
, &new_base
);
107 gfc_constructor_free (gfc_constructor_base base
)
110 splay_tree_delete (base
);
115 gfc_constructor_append (gfc_constructor_base
*base
, gfc_constructor
*c
)
119 offset
= (int)(splay_tree_max (*base
)->key
) + 1;
121 return gfc_constructor_insert (base
, c
, offset
);
126 gfc_constructor_append_expr (gfc_constructor_base
*base
,
127 gfc_expr
*e
, locus
*where
)
129 gfc_constructor
*c
= gfc_constructor_get ();
134 return gfc_constructor_append (base
, c
);
139 gfc_constructor_insert (gfc_constructor_base
*base
, gfc_constructor
*c
, int n
)
141 splay_tree_node node
;
144 *base
= splay_tree_new (splay_tree_compare_ints
, NULL
, node_free
);
147 mpz_set_si (c
->offset
, n
);
149 node
= splay_tree_insert (*base
, (splay_tree_key
) n
, (splay_tree_value
) c
);
152 return (gfc_constructor
*)node
->value
;
157 gfc_constructor_insert_expr (gfc_constructor_base
*base
,
158 gfc_expr
*e
, locus
*where
, int n
)
160 gfc_constructor
*c
= gfc_constructor_get ();
165 return gfc_constructor_insert (base
, c
, n
);
170 gfc_constructor_lookup (gfc_constructor_base base
, int offset
)
172 splay_tree_node node
;
177 node
= splay_tree_lookup (base
, (splay_tree_key
) offset
);
179 return (gfc_constructor
*) node
->value
;
186 gfc_constructor_lookup_expr (gfc_constructor_base base
, int offset
)
188 gfc_constructor
*c
= gfc_constructor_lookup (base
, offset
);
189 return c
? c
->expr
: NULL
;
194 gfc_constructor_expr_foreach (gfc_constructor
*ctor ATTRIBUTE_UNUSED
,
195 int(*f
)(gfc_expr
*) ATTRIBUTE_UNUSED
)
202 gfc_constructor_swap (gfc_constructor
*ctor ATTRIBUTE_UNUSED
,
203 int n ATTRIBUTE_UNUSED
, int m ATTRIBUTE_UNUSED
)
211 gfc_constructor_first (gfc_constructor_base base
)
215 splay_tree_node node
= splay_tree_min (base
);
216 return node
? (gfc_constructor
*) node
->value
: NULL
;
224 gfc_constructor_next (gfc_constructor
*ctor
)
228 splay_tree_node node
= splay_tree_successor (ctor
->base
,
229 mpz_get_si (ctor
->offset
));
230 return node
? (gfc_constructor
*) node
->value
: NULL
;