/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
* @date 30.03.2007
* @brief A nodeset. This should be prefered over a simple pset, because it
* tries to guarantee deterministic behavior. (and is faster)
- * @version $Id$
* @note Actually the bits to make the behaviour deterministic are not
* implemented yet...
*/
#ifndef _FIRM_IRNODESET_H_
#define _FIRM_IRNODESET_H_
+#include <stdbool.h>
#include "firm_types.h"
#include "xmalloc.h"
-/*
- * sebastian experimental:
- * use ordered arrays as node sets.
- * the guys here have made good experiences with that.
- * Internally we use normal Firm arrays and binary
- * search for locating the elements. Using arrays should
- * give the sets a small footprint.
- */
-#undef IR_NODESET_USE_ORDERED_SETS
-
#define HashSet ir_nodeset_t
#define HashSetIterator ir_nodeset_iterator_t
#define ValueType ir_node*
#define DO_REHASH
-#ifdef IR_NODESET_USE_ORDERED_SETS
-#include "arrayset.h"
-#else
#include "hashset.h"
-#endif
#undef DO_REHASH
#undef ValueType
* @param expected_elements Number of elements expected in the nodeset (roughly)
* @return The initialized nodeset
*/
-static INLINE ir_nodeset_t *ir_nodeset_new(size_t expected_elements) {
- ir_nodeset_t *res = xmalloc(sizeof(*res));
+static inline ir_nodeset_t *ir_nodeset_new(size_t expected_elements) {
+ ir_nodeset_t *res = XMALLOC(ir_nodeset_t);
ir_nodeset_init_size(res, expected_elements);
return res;
}
/**
* Destroys a nodeset and frees the memory of the nodeset itself.
*/
-static INLINE void ir_nodeset_del(ir_nodeset_t *nodeset) {
+static inline void ir_nodeset_del(ir_nodeset_t *nodeset) {
ir_nodeset_destroy(nodeset);
xfree(nodeset);
}
*
* @param nodeset Pointer to the nodeset
* @param node node to insert into the nodeset
- * @returns 1 if the element has been inserted,
- * 0 if it was already there
+ * @returns true if the element has been inserted,
+ * false if it was already there
*/
-int ir_nodeset_insert(ir_nodeset_t *nodeset, ir_node *node);
+bool ir_nodeset_insert(ir_nodeset_t *nodeset, ir_node *node);
/**
*
* @param nodeset Pointer to the nodeset
* @param node The pointer to find
- * @returns 1 if nodeset contains the node, 0 else
*/
-int ir_nodeset_contains(const ir_nodeset_t *nodeset, const ir_node *node);
+bool ir_nodeset_contains(const ir_nodeset_t *nodeset, const ir_node *node);
/**
* Returns the number of pointers contained in the nodeset
void ir_nodeset_remove_iterator(ir_nodeset_t *nodeset,
const ir_nodeset_iterator_t *iterator);
-#define foreach_ir_nodeset(nodeset, irn, iter) \
- for(ir_nodeset_iterator_init(&iter, nodeset), \
- irn = ir_nodeset_iterator_next(&iter); \
- irn != NULL; irn = ir_nodeset_iterator_next(&iter))
-
-
-#ifdef IR_NODESET_USE_ORDERED_SETS
-
-/**
- * Insert an element quickly into from the set.
- * This method may destroy internal invariats of the set (think of sorted arrays).
- * All calls to other routines but
- * - iteration
- * - get the number of elements in the set
- * will not work until ir_nodeset_fixup() was called.
- * @param nodeset The nodeset.
- * @param node The node to insert.
- */
-void ir_nodeset_insert_quick(ir_nodeset_t *nodeset, ir_node *node);
-
-/**
- * Remove an element quickly from the set.
- * This method may destroy internal invariats of the set (think of sorted arrays).
- * All calls to other routines but
- * - iteration
- * - get the number of elements in the set
- * will not work until ir_nodeset_fixup() was called.
- * @param nodeset The nodeset.
- * @param node The node to delete.
- */
-void ir_nodeset_remove_quick(ir_nodeset_t *nodeset, const ir_node *node);
-
-/**
- * Fixes up internal state of the set.
- * Is needed when one of the _quick functions was called.
- * @param nodeset The nodeset.
- */
-void ir_nodeset_fixup(ir_nodeset_t *nodeset);
-
-#else
-
-#define ir_nodeset_remove_quick ir_nodeset_remove
-#define ir_nodeset_insert_quick ir_nodeset_insert
-#define ir_nodeset_fixup(set)
+static inline ir_node *ir_nodeset_first(ir_nodeset_t const *const nodeset)
+{
+ ir_nodeset_iterator_t iter;
+ ir_nodeset_iterator_init(&iter, nodeset);
+ return ir_nodeset_iterator_next(&iter);
+}
-#endif /* IR_NODESET_USE_ORDERED_SETS */
+#define foreach_ir_nodeset(nodeset, irn, iter) \
+ for (bool irn##__once = true; irn##__once;) \
+ for (ir_nodeset_iterator_t iter; irn##__once;) \
+ for (ir_node *irn; irn##__once; irn##__once = false) \
+ for (ir_nodeset_iterator_init(&iter, nodeset); (irn = ir_nodeset_iterator_next(&iter));)
#endif