version 1.1.1.1, 2018/04/24 17:33:50
|
version 1.1.1.2, 2018/04/24 18:23:14
|
Line 1
|
Line 1
|
/* |
/* |
* QDict data type. |
* QDict Module |
* |
* |
* Copyright (C) 2009 Red Hat Inc. |
* Copyright (C) 2009 Red Hat Inc. |
* |
* |
* Authors: |
* Authors: |
* Luiz Capitulino <lcapitulino@redhat.com> |
* Luiz Capitulino <lcapitulino@redhat.com> |
* |
* |
* This work is licensed under the terms of the GNU GPL, version 2. See |
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later. |
* the COPYING file in the top-level directory. |
* See the COPYING.LIB file in the top-level directory. |
*/ |
*/ |
|
|
#include "qint.h" |
#include "qint.h" |
|
#include "qfloat.h" |
#include "qdict.h" |
#include "qdict.h" |
#include "qbool.h" |
#include "qbool.h" |
#include "qstring.h" |
#include "qstring.h" |
Line 82 static QDictEntry *alloc_entry(const cha
|
Line 83 static QDictEntry *alloc_entry(const cha
|
} |
} |
|
|
/** |
/** |
|
* qdict_entry_value(): Return qdict entry value |
|
* |
|
* Return weak reference. |
|
*/ |
|
QObject *qdict_entry_value(const QDictEntry *entry) |
|
{ |
|
return entry->value; |
|
} |
|
|
|
/** |
|
* qdict_entry_key(): Return qdict entry key |
|
* |
|
* Return a *pointer* to the string, it has to be duplicated before being |
|
* stored. |
|
*/ |
|
const char *qdict_entry_key(const QDictEntry *entry) |
|
{ |
|
return entry->key; |
|
} |
|
|
|
/** |
* qdict_find(): List lookup function |
* qdict_find(): List lookup function |
*/ |
*/ |
static QDictEntry *qdict_find(const QDict *qdict, |
static QDictEntry *qdict_find(const QDict *qdict, |
const char *key, unsigned int hash) |
const char *key, unsigned int bucket) |
{ |
{ |
QDictEntry *entry; |
QDictEntry *entry; |
|
|
QLIST_FOREACH(entry, &qdict->table[hash], next) |
QLIST_FOREACH(entry, &qdict->table[bucket], next) |
if (!strcmp(entry->key, key)) |
if (!strcmp(entry->key, key)) |
return entry; |
return entry; |
|
|
Line 109 static QDictEntry *qdict_find(const QDic
|
Line 131 static QDictEntry *qdict_find(const QDic
|
*/ |
*/ |
void qdict_put_obj(QDict *qdict, const char *key, QObject *value) |
void qdict_put_obj(QDict *qdict, const char *key, QObject *value) |
{ |
{ |
unsigned int hash; |
unsigned int bucket; |
QDictEntry *entry; |
QDictEntry *entry; |
|
|
hash = tdb_hash(key) % QDICT_HASH_SIZE; |
bucket = tdb_hash(key) % QDICT_BUCKET_MAX; |
entry = qdict_find(qdict, key, hash); |
entry = qdict_find(qdict, key, bucket); |
if (entry) { |
if (entry) { |
/* replace key's value */ |
/* replace key's value */ |
qobject_decref(entry->value); |
qobject_decref(entry->value); |
Line 121 void qdict_put_obj(QDict *qdict, const c
|
Line 143 void qdict_put_obj(QDict *qdict, const c
|
} else { |
} else { |
/* allocate a new entry */ |
/* allocate a new entry */ |
entry = alloc_entry(key, value); |
entry = alloc_entry(key, value); |
QLIST_INSERT_HEAD(&qdict->table[hash], entry, next); |
QLIST_INSERT_HEAD(&qdict->table[bucket], entry, next); |
qdict->size++; |
qdict->size++; |
} |
} |
} |
} |
Line 136 QObject *qdict_get(const QDict *qdict, c
|
Line 158 QObject *qdict_get(const QDict *qdict, c
|
{ |
{ |
QDictEntry *entry; |
QDictEntry *entry; |
|
|
entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE); |
entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX); |
return (entry == NULL ? NULL : entry->value); |
return (entry == NULL ? NULL : entry->value); |
} |
} |
|
|
Line 147 QObject *qdict_get(const QDict *qdict, c
|
Line 169 QObject *qdict_get(const QDict *qdict, c
|
*/ |
*/ |
int qdict_haskey(const QDict *qdict, const char *key) |
int qdict_haskey(const QDict *qdict, const char *key) |
{ |
{ |
unsigned int hash = tdb_hash(key) % QDICT_HASH_SIZE; |
unsigned int bucket = tdb_hash(key) % QDICT_BUCKET_MAX; |
return (qdict_find(qdict, key, hash) == NULL ? 0 : 1); |
return (qdict_find(qdict, key, bucket) == NULL ? 0 : 1); |
} |
} |
|
|
/** |
/** |
Line 175 static QObject *qdict_get_obj(const QDic
|
Line 197 static QObject *qdict_get_obj(const QDic
|
} |
} |
|
|
/** |
/** |
|
* qdict_get_double(): Get an number mapped by 'key' |
|
* |
|
* This function assumes that 'key' exists and it stores a |
|
* QFloat or QInt object. |
|
* |
|
* Return number mapped by 'key'. |
|
*/ |
|
double qdict_get_double(const QDict *qdict, const char *key) |
|
{ |
|
QObject *obj = qdict_get(qdict, key); |
|
|
|
assert(obj); |
|
switch (qobject_type(obj)) { |
|
case QTYPE_QFLOAT: |
|
return qfloat_get_double(qobject_to_qfloat(obj)); |
|
case QTYPE_QINT: |
|
return qint_get_int(qobject_to_qint(obj)); |
|
default: |
|
abort(); |
|
} |
|
} |
|
|
|
/** |
* qdict_get_int(): Get an integer mapped by 'key' |
* qdict_get_int(): Get an integer mapped by 'key' |
* |
* |
* This function assumes that 'key' exists and it stores a |
* This function assumes that 'key' exists and it stores a |
Line 216 QList *qdict_get_qlist(const QDict *qdic
|
Line 261 QList *qdict_get_qlist(const QDict *qdic
|
} |
} |
|
|
/** |
/** |
|
* qdict_get_qdict(): Get the QDict mapped by 'key' |
|
* |
|
* This function assumes that 'key' exists and it stores a |
|
* QDict object. |
|
* |
|
* Return QDict mapped by 'key'. |
|
*/ |
|
QDict *qdict_get_qdict(const QDict *qdict, const char *key) |
|
{ |
|
return qobject_to_qdict(qdict_get_obj(qdict, key, QTYPE_QDICT)); |
|
} |
|
|
|
/** |
* qdict_get_str(): Get a pointer to the stored string mapped |
* qdict_get_str(): Get a pointer to the stored string mapped |
* by 'key' |
* by 'key' |
* |
* |
Line 235 const char *qdict_get_str(const QDict *q
|
Line 293 const char *qdict_get_str(const QDict *q
|
* |
* |
* Return integer mapped by 'key', if it is not present in |
* Return integer mapped by 'key', if it is not present in |
* the dictionary or if the stored object is not of QInt type |
* the dictionary or if the stored object is not of QInt type |
* 'err_value' will be returned. |
* 'def_value' will be returned. |
*/ |
*/ |
int64_t qdict_get_try_int(const QDict *qdict, const char *key, |
int64_t qdict_get_try_int(const QDict *qdict, const char *key, |
int64_t err_value) |
int64_t def_value) |
{ |
{ |
QObject *obj; |
QObject *obj; |
|
|
obj = qdict_get(qdict, key); |
obj = qdict_get(qdict, key); |
if (!obj || qobject_type(obj) != QTYPE_QINT) |
if (!obj || qobject_type(obj) != QTYPE_QINT) |
return err_value; |
return def_value; |
|
|
return qint_get_int(qobject_to_qint(obj)); |
return qint_get_int(qobject_to_qint(obj)); |
} |
} |
|
|
/** |
/** |
|
* qdict_get_try_bool(): Try to get a bool mapped by 'key' |
|
* |
|
* Return bool mapped by 'key', if it is not present in the |
|
* dictionary or if the stored object is not of QBool type |
|
* 'def_value' will be returned. |
|
*/ |
|
int qdict_get_try_bool(const QDict *qdict, const char *key, int def_value) |
|
{ |
|
QObject *obj; |
|
|
|
obj = qdict_get(qdict, key); |
|
if (!obj || qobject_type(obj) != QTYPE_QBOOL) |
|
return def_value; |
|
|
|
return qbool_get_int(qobject_to_qbool(obj)); |
|
} |
|
|
|
/** |
* qdict_get_try_str(): Try to get a pointer to the stored string |
* qdict_get_try_str(): Try to get a pointer to the stored string |
* mapped by 'key' |
* mapped by 'key' |
* |
* |
Line 281 void qdict_iter(const QDict *qdict,
|
Line 357 void qdict_iter(const QDict *qdict,
|
int i; |
int i; |
QDictEntry *entry; |
QDictEntry *entry; |
|
|
for (i = 0; i < QDICT_HASH_SIZE; i++) { |
for (i = 0; i < QDICT_BUCKET_MAX; i++) { |
QLIST_FOREACH(entry, &qdict->table[i], next) |
QLIST_FOREACH(entry, &qdict->table[i], next) |
iter(entry->key, entry->value, opaque); |
iter(entry->key, entry->value, opaque); |
} |
} |
} |
} |
|
|
|
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 |
* qentry_destroy(): Free all the memory allocated by a QDictEntry |
*/ |
*/ |
Line 310 void qdict_del(QDict *qdict, const char
|
Line 423 void qdict_del(QDict *qdict, const char
|
{ |
{ |
QDictEntry *entry; |
QDictEntry *entry; |
|
|
entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE); |
entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX); |
if (entry) { |
if (entry) { |
QLIST_REMOVE(entry, next); |
QLIST_REMOVE(entry, next); |
qentry_destroy(entry); |
qentry_destroy(entry); |
Line 329 static void qdict_destroy_obj(QObject *o
|
Line 442 static void qdict_destroy_obj(QObject *o
|
assert(obj != NULL); |
assert(obj != NULL); |
qdict = qobject_to_qdict(obj); |
qdict = qobject_to_qdict(obj); |
|
|
for (i = 0; i < QDICT_HASH_SIZE; i++) { |
for (i = 0; i < QDICT_BUCKET_MAX; i++) { |
QDictEntry *entry = QLIST_FIRST(&qdict->table[i]); |
QDictEntry *entry = QLIST_FIRST(&qdict->table[i]); |
while (entry) { |
while (entry) { |
QDictEntry *tmp = QLIST_NEXT(entry, next); |
QDictEntry *tmp = QLIST_NEXT(entry, next); |