+/*
+ * This file is part of cparser.
+ * Copyright (C) 2007-2008 Matthias Braun <matze@braunis.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
#include <config.h>
#include <stdbool.h>
#undef HashSetIterator
#undef HashSet
+typedef struct type_hash_iterator_t type_hash_iterator_t;
+typedef struct type_hash_t type_hash_t;
+
/* TODO: ^= is a bad way of combining hashes since most addresses are very
* similar */
return result;
}
+static unsigned hash_complex_type(const complex_type_t *type)
+{
+ unsigned some_prime = 27644437;
+ unsigned result = type->akind * some_prime;
+
+ return result;
+}
+
+static unsigned hash_imaginary_type(const imaginary_type_t *type)
+{
+ unsigned some_prime = 27644437;
+ unsigned result = type->akind * some_prime;
+
+ return result;
+}
+
static unsigned hash_pointer_type(const pointer_type_t *type)
{
return hash_ptr(type->points_to);
static unsigned hash_bitfield_type(const bitfield_type_t *type)
{
- unsigned result = hash_ptr(type->base);
+ unsigned result = hash_ptr(type->base_type);
result ^= 27172145;
return result;
case TYPE_INVALID:
panic("internalizing void or invalid types not possible");
return 0;
+ case TYPE_ERROR:
+ return 0;
case TYPE_ATOMIC:
hash = hash_atomic_type(&type->atomic);
break;
+ case TYPE_COMPLEX:
+ hash = hash_complex_type(&type->complex);
+ break;
+ case TYPE_IMAGINARY:
+ hash = hash_imaginary_type(&type->imaginary);
+ break;
case TYPE_ENUM:
hash = hash_enum_type(&type->enumt);
break;
}
static bool atomic_types_equal(const atomic_type_t *type1,
- const atomic_type_t *type2)
+ const atomic_type_t *type2)
+{
+ return type1->akind == type2->akind;
+}
+
+static bool complex_types_equal(const complex_type_t *type1,
+ const complex_type_t *type2)
+{
+ return type1->akind == type2->akind;
+}
+
+static bool imaginary_types_equal(const imaginary_type_t *type1,
+ const imaginary_type_t *type2)
{
return type1->akind == type2->akind;
}
return false;
if(type1->is_static != type2->is_static)
return false;
+ if(type1->size_constant != type2->size_constant)
+ return false;
+
+ /* never identify vla types, because we need them for caching calculated
+ * sizes later in ast2firm */
+ if(type1->is_vla || type2->is_vla)
+ return false;
/* TODO: compare size expressions for equality... */
static bool bitfield_types_equal(const bitfield_type_t *type1,
const bitfield_type_t *type2)
{
- if(type1->base != type2->base)
+ if(type1->base_type != type2->base_type)
return false;
/* TODO: compare size expression */
return false;
return false;
switch(type1->kind) {
+ case TYPE_ERROR:
+ /* Hmm, the error type is never equal */
+ return false;
case TYPE_INVALID:
return false;
case TYPE_ATOMIC:
return atomic_types_equal(&type1->atomic, &type2->atomic);
+ case TYPE_COMPLEX:
+ return complex_types_equal(&type1->complex, &type2->complex);
+ case TYPE_IMAGINARY:
+ return imaginary_types_equal(&type1->imaginary, &type2->imaginary);
case TYPE_ENUM:
return enum_types_equal(&type1->enumt, &type2->enumt);
case TYPE_COMPOUND_STRUCT:
#define hashset_iterator_init typehash_iterator_init
#define hashset_iterator_next typehash_iterator_next
#define hashset_remove_iterator typehash_remove_iterator
+#define SCALAR_RETURN
#include "adt/hashset.c"