From 982f414579a631d523bb340f853cba7c71e82b05 Mon Sep 17 00:00:00 2001 From: cristianrosa Date: Thu, 27 May 2010 15:25:52 +0000 Subject: [PATCH] Improve setset iterator git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7803 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/xbt/setset.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/xbt/setset.c b/src/xbt/setset.c index 4a45406793..f78a074e50 100644 --- a/src/xbt/setset.c +++ b/src/xbt/setset.c @@ -1,5 +1,6 @@ #include #include +#include #include "setset_private.h" #include "xbt/sysdep.h" @@ -336,21 +337,16 @@ void xbt_setset_intersect(xbt_setset_set_t set1, xbt_setset_set_t set2) return; } -/* Get the cursor to point to the first element of a set */ void xbt_setset_cursor_first(xbt_setset_set_t set, xbt_setset_cursor_t *cursor) { + int i; (*cursor) = xbt_new0(s_xbt_setset_cursor_t, 1); (*cursor)->set = set; - int i,k; - /* Traverse the set and point the cursor to the first element */ - for(i=0; i < set->size; i++){ + + for(i = 0; i < set->size; i++){ if(set->bitmap[i] != 0){ - for(k=0; k < BITS_INT; k++){ - if(_is_bit_set(k, set->bitmap[i])){ - (*cursor)->idx = i * BITS_INT + k; - return; - } - } + (*cursor)->idx = i * BITS_INT + ffs(set->bitmap[i]) - 1; + break; } } } @@ -371,13 +367,23 @@ int xbt_setset_cursor_get_data(xbt_setset_cursor_t cursor, void **data) /* Advance a cursor to the next element */ void xbt_setset_cursor_next(xbt_setset_cursor_t cursor) { + unsigned int mask; + unsigned int data; cursor->idx++; while(cursor->idx < cursor->set->size * BITS_INT) { - if(_is_bit_set(cursor->idx % BITS_INT, cursor->set->bitmap[cursor->idx / BITS_INT])){ - return; + if((data = cursor->set->bitmap[cursor->idx / BITS_INT])){ + mask = 1 << cursor->idx % BITS_INT; + while(mask){ + if(data & mask){ + return; + }else{ + cursor->idx++; + mask <<= 1; + } + } }else{ - cursor->idx += cursor->set->bitmap[cursor->idx / BITS_INT] ? 1 : BITS_INT; + cursor->idx += BITS_INT; } } cursor->idx = 0; -- 2.20.1