* call.c (z_candidate::template_decl): Rename from template.
[official-gcc.git] / libbanshee / engine / term-var.c
blob9b8e2059871739cc367b24615239e6d9e7a0a091
1 /*
2 * Copyright (c) 2000-2001
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the University nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
31 #include <stdio.h>
32 #include <regions.h>
33 #include <assert.h>
34 #include "ufind.h"
35 #include "term-var.h"
37 DECLARE_UFIND(tv_elt,gen_e)
39 DEFINE_UFIND(tv_elt,gen_e)
41 DEFINE_LIST(term_var_list,term_var)
43 struct term_var
45 #ifdef NONSPEC
46 sort_kind sort;
47 #endif
48 int type;
49 stamp st;
50 gen_e_list pending;
51 const char *name;
52 tv_elt elt;
55 static term_var make_var(region r, const char *name, stamp st)
57 term_var result = ralloc(r, struct term_var);
58 gen_e info = (gen_e) result;
60 result->type = VAR_TYPE;
61 result->st = st;
62 result->pending = new_gen_e_list(r);
63 result->name = name ? rstrdup(r,name) : "fv";
64 result->elt = new_tv_elt(r,info);
66 return result;
69 term_var tv_fresh(region r, const char *name)
71 return make_var(r,name,stamp_fresh());
74 term_var tv_fresh_small(region r, const char *name)
76 return make_var(r,name,stamp_fresh_small());
79 term_var tv_fresh_large(region r, const char *name)
81 return make_var(r,name,stamp_fresh_large());
84 static term_var tv_get_v_ecr(term_var v)
86 term_var ecr = (term_var)tv_get_ecr(v);
87 assert (ecr->type == VAR_TYPE); /* this is a hack, but should be ok */
89 return ecr;
92 const char *tv_get_name(term_var v)
94 return tv_get_v_ecr(v)->name;
97 gen_e_list tv_get_pending(term_var v)
99 return tv_get_v_ecr(v)->pending;
102 void tv_add_pending(term_var v,gen_e e)
104 gen_e_list_cons(e,tv_get_v_ecr(v)->pending);
107 void tv_unify(term_var v, gen_e e)
109 tv_elt_update(v->elt,e);
111 assert(tv_get_ecr(v) == e);
114 static gen_e tv_combine(gen_e e1, gen_e e2)
116 term_var v1 = (term_var)e1,
117 v2 = (term_var)e2;
119 if (! (v1 == v2) )
120 gen_e_list_append(tv_get_pending(v1), tv_get_pending(v2));
122 return e1;
125 void tv_unify_vars(term_var v1, term_var v2)
127 tv_elt_unify(tv_combine,v1->elt, v2->elt);
130 gen_e tv_get_ecr(term_var v)
132 return tv_elt_get_info(v->elt);