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;