* @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 "firm_config.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*
* @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) {
+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);
+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);
+}
+
#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))
+ 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