QDict: Introduce new iteration API
It's composed of functions qdict_first() and qdict_next(), plus
functions to access QDictEntry values.
This API was suggested by Markus Armbruster <armbru@redhat.com> and
it offers full control over the iteration process.
The usage is simple, the following example prints all keys in 'qdict'
(it's hopefully better than any English description):
   QDict *qdict;
   const QDictEntry *ent;
   [...]
   for (ent = qdict_first(qdict); ent; ent = qdict_next(qdict, ent)) {
        printf("%s ", qdict_entry_key(ent));
    }
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									0d078b2ade
								
							
						
					
					
						commit
						f2b07f35d2
					
				
							
								
								
									
										37
									
								
								qdict.c
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								qdict.c
									
									
									
									
									
								
							@ -345,6 +345,43 @@ void qdict_iter(const QDict *qdict,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static QDictEntry *qdict_next_entry(const QDict *qdict, int first_bucket)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i = first_bucket; i < QDICT_BUCKET_MAX; i++) {
 | 
			
		||||
        if (!QLIST_EMPTY(&qdict->table[i])) {
 | 
			
		||||
            return QLIST_FIRST(&qdict->table[i]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * qdict_first(): Return first qdict entry for iteration.
 | 
			
		||||
 */
 | 
			
		||||
const QDictEntry *qdict_first(const QDict *qdict)
 | 
			
		||||
{
 | 
			
		||||
    return qdict_next_entry(qdict, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * qdict_next(): Return next qdict entry in an iteration.
 | 
			
		||||
 */
 | 
			
		||||
const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry)
 | 
			
		||||
{
 | 
			
		||||
    QDictEntry *ret;
 | 
			
		||||
 | 
			
		||||
    ret = QLIST_NEXT(entry, next);
 | 
			
		||||
    if (!ret) {
 | 
			
		||||
        unsigned int bucket = tdb_hash(entry->key) % QDICT_BUCKET_MAX;
 | 
			
		||||
        ret = qdict_next_entry(qdict, bucket + 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * qentry_destroy(): Free all the memory allocated by a QDictEntry
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								qdict.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								qdict.h
									
									
									
									
									
								
							@ -45,6 +45,8 @@ QDict *qobject_to_qdict(const QObject *obj);
 | 
			
		||||
void qdict_iter(const QDict *qdict,
 | 
			
		||||
                void (*iter)(const char *key, QObject *obj, void *opaque),
 | 
			
		||||
                void *opaque);
 | 
			
		||||
const QDictEntry *qdict_first(const QDict *qdict);
 | 
			
		||||
const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry);
 | 
			
		||||
 | 
			
		||||
/* Helper to qdict_put_obj(), accepts any object */
 | 
			
		||||
#define qdict_put(qdict, key, obj) \
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user