added qse_htl_yanknode(), qse_htl_upyank().
added qse_raddic_deletevendorbyname(), qse_raddic_deletevendorbyid()
This commit is contained in:
		| @ -197,10 +197,10 @@ static QSE_INLINE void qse_htl_setcopier (qse_htl_t* htl, qse_htl_copier_t _copi | |||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The qse_htl_search() function searches a hash table to find a  |  * The qse_htl_search() function searches a hash table to find a  | ||||||
|  * matching datum. It returns the index to the slot of an internal array |  * matching item. It returns the index to the slot of an internal array | ||||||
|  * where the matching datum is found.  |  * where the matching item is found.  | ||||||
|  * \return slot index if a match if found, |  * \return slot index if a match if found, | ||||||
|  *         #QSE_HTL_NIL if no match is found. |  *         #QSE_NULL if no match is found. | ||||||
|  */ |  */ | ||||||
| QSE_EXPORT qse_htl_node_t* qse_htl_search ( | QSE_EXPORT qse_htl_node_t* qse_htl_search ( | ||||||
| 	qse_htl_t*       htl,    /**< hash table */ | 	qse_htl_t*       htl,    /**< hash table */ | ||||||
| @ -215,10 +215,9 @@ QSE_EXPORT qse_htl_node_t* qse_htl_heterosearch ( | |||||||
| ); | ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The qse_htl_insert() function inserts a new datum. It fails if it finds |  * The qse_htl_insert() function inserts a new item. It fails if it finds | ||||||
|  * an existing datum. |  * an existing item. | ||||||
|  * \return slot index where the new datum is inserted on success, |  * \return a node pointer on success, #QSE_NULL on failure. | ||||||
|  *         #QSE_HTL_NIL on failure. |  | ||||||
|  */ |  */ | ||||||
| QSE_EXPORT qse_htl_node_t* qse_htl_insert ( | QSE_EXPORT qse_htl_node_t* qse_htl_insert ( | ||||||
| 	qse_htl_t*  htl,    /**< hash table */ | 	qse_htl_t*  htl,    /**< hash table */ | ||||||
| @ -226,9 +225,9 @@ QSE_EXPORT qse_htl_node_t* qse_htl_insert ( | |||||||
| ); | ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The qse_htl_upsert() function inserts a new datum if it finds no matching |  * The qse_htl_upsert() function inserts a new item if it finds no matching | ||||||
|  * datum or updates an exsting datum if finds a matching datum. |  * item or updates an exsting item if finds a matching item. | ||||||
|  * \return slot index where the datum is inserted or updated. |  * \return node pointer on success, #QSE_NULL on failure. | ||||||
|  */ |  */ | ||||||
| QSE_EXPORT qse_htl_node_t* qse_htl_upsert ( | QSE_EXPORT qse_htl_node_t* qse_htl_upsert ( | ||||||
| 	qse_htl_t*       htl,    /**< hash table */ | 	qse_htl_t*       htl,    /**< hash table */ | ||||||
| @ -236,16 +235,25 @@ QSE_EXPORT qse_htl_node_t* qse_htl_upsert ( | |||||||
| ); | ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The qse_htl_update() function updates an existing datum. It fails if it finds |  * The qse_htl_update() function updates an existing item. It fails if it finds | ||||||
|  * no existing datum. |  * no existing item. | ||||||
|  * \return slot index where an existing datum is updated on success, |  * \return a node pointer on success, #QSE_NULL on failure. | ||||||
|  *         #QSE_HTL_NIL on failure. |  | ||||||
|  */ |  */ | ||||||
| QSE_EXPORT qse_htl_node_t* qse_htl_update ( | QSE_EXPORT qse_htl_node_t* qse_htl_update ( | ||||||
| 	qse_htl_t*       htl,    /**< hash table */ | 	qse_htl_t*       htl,    /**< hash table */ | ||||||
| 	void*            data    /**< data pointer */ | 	void*            data    /**< data pointer */ | ||||||
| ); | ); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * The qse_htl_upyank() function updates an existing dataum without disposing | ||||||
|  |  * the old data.  | ||||||
|  |  */ | ||||||
|  | QSE_EXPORT qse_htl_node_t* qse_htl_upyank ( | ||||||
|  | 	qse_htl_t*       htl,    /**< hash table */ | ||||||
|  | 	void*            data,   /**< data pointer */ | ||||||
|  | 	void**           oldata  /**< old data pointer */ | ||||||
|  | ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The qse_htl_ensert() function inserts a new item if one is not found. |  * The qse_htl_ensert() function inserts a new item if one is not found. | ||||||
|  * It returns an existing item otherwise. |  * It returns an existing item otherwise. | ||||||
| @ -256,8 +264,8 @@ QSE_EXPORT qse_htl_node_t* qse_htl_ensert ( | |||||||
| ); | ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The qse_htl_delete() function deletes an existing datum. It fails if it finds |  * The qse_htl_delete() function deletes an existing item. It fails if it finds | ||||||
|  * no existing datum. |  * no existing item. | ||||||
|  * \return 0 on success, -1 on failure |  * \return 0 on success, -1 on failure | ||||||
|  */ |  */ | ||||||
| QSE_EXPORT int qse_htl_delete ( | QSE_EXPORT int qse_htl_delete ( | ||||||
| @ -270,6 +278,11 @@ QSE_EXPORT void* qse_htl_yank ( | |||||||
| 	void*            data | 	void*            data | ||||||
| ); | ); | ||||||
|  |  | ||||||
|  | QSE_EXPORT qse_htl_node_t* qse_htl_yanknode ( | ||||||
|  | 	qse_htl_t*       ht, | ||||||
|  | 	void*            data | ||||||
|  | ); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * The qse_htl_clear() functions deletes all data items. |  * The qse_htl_clear() functions deletes all data items. | ||||||
|  */ |  */ | ||||||
|  | |||||||
| @ -76,21 +76,23 @@ typedef struct qse_raddic_attr_t qse_raddic_attr_t; | |||||||
|  |  | ||||||
| struct qse_raddic_value_t | struct qse_raddic_value_t | ||||||
| { | { | ||||||
| 	int                     attr; | 	int          attr; | ||||||
| 	int                     value; | 	int          value; | ||||||
| 	qse_char_t              name[1]; | 	qse_char_t   name[1]; | ||||||
| }; | }; | ||||||
| typedef struct qse_raddic_value_t qse_raddic_value_t; | typedef struct qse_raddic_value_t qse_raddic_value_t; | ||||||
|  |  | ||||||
|  | typedef struct qse_raddic_vendor_t qse_raddic_vendor_t; | ||||||
| struct qse_raddic_vendor_t | struct qse_raddic_vendor_t | ||||||
| { | { | ||||||
| 	int         vendorpec; | 	int                  vendorpec; | ||||||
| 	int         type; | 	int                  type; | ||||||
| 	int         length; | 	int                  length; | ||||||
| 	int         flags; | 	int                  flags; | ||||||
| 	qse_char_t  name[1]; | 	qse_raddic_vendor_t* nextv; /* next vendor with same details except the name */ | ||||||
|  | 	qse_char_t           name[1]; | ||||||
| }; | }; | ||||||
| typedef struct qse_raddic_vendor_t qse_raddic_vendor_t; |  | ||||||
|  |  | ||||||
| typedef struct qse_raddic_t qse_raddic_t; | typedef struct qse_raddic_t qse_raddic_t; | ||||||
|  |  | ||||||
| @ -123,6 +125,16 @@ QSE_EXPORT qse_raddic_vendor_t* qse_raddic_addvendor ( | |||||||
| 	int               value | 	int               value | ||||||
| ); | ); | ||||||
|  |  | ||||||
|  | QSE_EXPORT int qse_raddic_deletevendorbyname ( | ||||||
|  | 	qse_raddic_t*     dic, | ||||||
|  | 	const qse_char_t* name | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | QSE_EXPORT int qse_raddic_deletevendorbyvalue ( | ||||||
|  | 	qse_raddic_t*     dic, | ||||||
|  | 	int               value | ||||||
|  | ); | ||||||
|  |  | ||||||
| #if defined(__cplusplus) | #if defined(__cplusplus) | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -578,9 +578,30 @@ qse_htl_node_t* qse_htl_update (qse_htl_t* ht, void* data) | |||||||
| 	return node; | 	return node; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | qse_htl_node_t* qse_htl_upyank (qse_htl_t* ht, void* data, void** olddata) | ||||||
|  | { | ||||||
|  | 	qse_htl_node_t* node; | ||||||
|  | 	void* datap, * olddatap; | ||||||
|  |  | ||||||
|  | 	node = qse_htl_search(ht, data); | ||||||
|  | 	if (!node) return QSE_NULL; | ||||||
|  |  | ||||||
|  | 	if (ht->copier)  | ||||||
|  | 	{ | ||||||
|  | 		datap = ht->copier (ht, data); | ||||||
|  | 		if (!datap) return QSE_NULL; | ||||||
|  | 	} | ||||||
|  | 	else datap = data; | ||||||
|  |  | ||||||
|  | 	*olddata = node->data; | ||||||
|  | 	node->data = datap; | ||||||
|  |  | ||||||
|  | 	return node; | ||||||
|  | } | ||||||
|  |  | ||||||
| qse_htl_node_t* qse_htl_ensert (qse_htl_t* ht, void* data) | qse_htl_node_t* qse_htl_ensert (qse_htl_t* ht, void* data) | ||||||
| { | { | ||||||
| 	qse_htl_node_t *node; | 	qse_htl_node_t* node; | ||||||
|  |  | ||||||
| 	node = qse_htl_search(ht, data); | 	node = qse_htl_search(ht, data); | ||||||
| 	if (!node) node = qse_htl_insert(ht, data); | 	if (!node) node = qse_htl_insert(ht, data); | ||||||
| @ -588,19 +609,14 @@ qse_htl_node_t* qse_htl_ensert (qse_htl_t* ht, void* data) | |||||||
| 	return node; | 	return node; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* |  | ||||||
|  *	Yank an entry from the hash table, without freeing the data. | qse_htl_node_t* qse_htl_yanknode (qse_htl_t* ht, void* data) | ||||||
|  */ |  | ||||||
| void* qse_htl_yank (qse_htl_t* ht, void* data) |  | ||||||
| { | { | ||||||
| 	qse_uint32_t key; | 	qse_uint32_t key; | ||||||
| 	qse_uint32_t entry; | 	qse_uint32_t entry; | ||||||
| 	qse_uint32_t reversed; | 	qse_uint32_t reversed; | ||||||
| 	void *old; |  | ||||||
| 	qse_htl_node_t* node; | 	qse_htl_node_t* node; | ||||||
|  |  | ||||||
| 	if (!ht) return QSE_NULL; |  | ||||||
|  |  | ||||||
| 	key = ht->hasher(ht, data); | 	key = ht->hasher(ht, data); | ||||||
| 	entry = key & ht->mask; | 	entry = key & ht->mask; | ||||||
| 	reversed = reverse(key); | 	reversed = reverse(key); | ||||||
| @ -613,9 +629,23 @@ void* qse_htl_yank (qse_htl_t* ht, void* data) | |||||||
| 	list_delete(ht, &ht->buckets[entry], node); | 	list_delete(ht, &ht->buckets[entry], node); | ||||||
| 	ht->num_elements--; | 	ht->num_elements--; | ||||||
|  |  | ||||||
|  | 	return node; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *	Yank an entry from the hash table, without freeing the data. | ||||||
|  |  */ | ||||||
|  | void* qse_htl_yank (qse_htl_t* ht, void* data) | ||||||
|  | { | ||||||
|  | 	qse_htl_node_t* node; | ||||||
|  | 	void* old; | ||||||
|  |  | ||||||
|  | 	node = qse_htl_yanknode (ht, data); | ||||||
|  | 	if (!node) return QSE_NULL; | ||||||
|  |  | ||||||
| 	old = node->data; | 	old = node->data; | ||||||
| 	QSE_MMGR_FREE (ht->mmgr, node); | 	QSE_MMGR_FREE (ht->mmgr, node); | ||||||
|  |  | ||||||
| 	return old; | 	return old; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -217,7 +217,7 @@ qse_raddic_vendor_t* qse_raddic_findvendorbyvalue (qse_raddic_t* dic, int vendor | |||||||
| qse_raddic_vendor_t* qse_raddic_addvendor (qse_raddic_t* dic, const qse_char_t* name, int value) | qse_raddic_vendor_t* qse_raddic_addvendor (qse_raddic_t* dic, const qse_char_t* name, int value) | ||||||
| { | { | ||||||
| 	qse_size_t length; | 	qse_size_t length; | ||||||
| 	qse_raddic_vendor_t* dv; | 	qse_raddic_vendor_t* dv, * old_dv; | ||||||
| 	qse_htl_node_t* np; | 	qse_htl_node_t* np; | ||||||
|  |  | ||||||
| 	if (value >= 65535) return QSE_NULL; | 	if (value >= 65535) return QSE_NULL; | ||||||
| @ -227,10 +227,11 @@ qse_raddic_vendor_t* qse_raddic_addvendor (qse_raddic_t* dic, const qse_char_t* | |||||||
| 	/* no +1 for the terminating null because dv->name is char[1] */ | 	/* no +1 for the terminating null because dv->name is char[1] */ | ||||||
| 	dv = QSE_MMGR_ALLOC(dic->mmgr, QSE_SIZEOF(*dv) + (length * QSE_SIZEOF(*name))); | 	dv = QSE_MMGR_ALLOC(dic->mmgr, QSE_SIZEOF(*dv) + (length * QSE_SIZEOF(*name))); | ||||||
| 	if (dv == QSE_NULL) return QSE_NULL; | 	if (dv == QSE_NULL) return QSE_NULL; | ||||||
| 	 |  | ||||||
| 	qse_strcpy(dv->name, name); | 	qse_strcpy(dv->name, name); | ||||||
| 	dv->vendorpec = value; | 	dv->vendorpec = value; | ||||||
| 	dv->type = dv->length = 1; /* defaults */ | 	dv->type = dv->length = 1; /* defaults */ | ||||||
|  | 	dv->nextv = QSE_NULL; | ||||||
|  |  | ||||||
| 	/* return an existing item or insert a new item */ | 	/* return an existing item or insert a new item */ | ||||||
| 	np = qse_htl_ensert(&dic->vendors_byname, dv); | 	np = qse_htl_ensert(&dic->vendors_byname, dv); | ||||||
| @ -241,16 +242,96 @@ qse_raddic_vendor_t* qse_raddic_addvendor (qse_raddic_t* dic, const qse_char_t* | |||||||
| 		return QSE_NULL; | 		return QSE_NULL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* update indexing by value */ | 	/* attempt to update the lookup table by value */ | ||||||
| 	if (!qse_htl_upsert(&dic->vendors_byvalue, dv)) | 	np = qse_htl_upyank(&dic->vendors_byvalue, dv, (void**)&old_dv); | ||||||
|  | 	if (np) | ||||||
| 	{ | 	{ | ||||||
| 		qse_htl_delete (&dic->vendors_byname, dv); | 		/* updated the existing item successfully.  | ||||||
| 		return QSE_NULL; | 		 * link the old item to the current item */ | ||||||
|  | 		QSE_ASSERT (np->data == dv); | ||||||
|  | 		QSE_ASSERT (dv->vendorpec == old_dv->vendorpec); | ||||||
|  | 		dv->nextv = old_dv; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		/* update failure, this entry must be new. try insertion */ | ||||||
|  | 		if (!qse_htl_insert (&dic->vendors_byvalue, dv)) | ||||||
|  | 		{ | ||||||
|  | 			qse_htl_delete (&dic->vendors_byname, dv); | ||||||
|  | 			return QSE_NULL; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return dv; | 	return dv; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int qse_raddic_deletevendorbyname (qse_raddic_t* dic, const qse_char_t* name) | ||||||
|  | { | ||||||
|  | 	qse_raddic_vendor_t* dv, * dv2; | ||||||
|  |  | ||||||
|  | 	dv = qse_raddic_findvendorbyname(dic, name); | ||||||
|  | 	if (!dv) return -1; | ||||||
|  |  | ||||||
|  | 	dv2 = qse_raddic_findvendorbyvalue(dic, dv->vendorpec); | ||||||
|  | 	QSE_ASSERT (dv2 != QSE_NULL); | ||||||
|  |  | ||||||
|  | 	if (dv != dv2) | ||||||
|  | 	{ | ||||||
|  | 		qse_raddic_vendor_t* x, * y; | ||||||
|  |  | ||||||
|  | 		QSE_ASSERT (qse_strcasecmp(dv->name, dv2->name) != 0); | ||||||
|  | 		QSE_ASSERT (dv->vendorpec == dv2->vendorpec); | ||||||
|  |  | ||||||
|  | 		/* when the vendor of the given name is not the first one | ||||||
|  | 		 * referenced by value, i need to unlink the vendor from the | ||||||
|  | 		 * vendor chains with the same ID */ | ||||||
|  | 		x = dv2; | ||||||
|  | 		y = QSE_NULL;  | ||||||
|  | 		while (x) | ||||||
|  | 		{ | ||||||
|  | 			if (x == dv)  | ||||||
|  | 			{ | ||||||
|  | 				if (y) y->nextv = x->nextv; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 			y = x; | ||||||
|  | 			x = x->nextv; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		/* this is the only vendor with the vendor ID. i can  | ||||||
|  | 		 * safely remove it from the lookup table by value */ | ||||||
|  | 		qse_htl_delete (&dic->vendors_byvalue, dv); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* delete the vendor from the lookup table by name */ | ||||||
|  | 	qse_htl_delete (&dic->vendors_byname, dv); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int qse_raddic_deletevendorbyvalue (qse_raddic_t* dic, int value) | ||||||
|  | { | ||||||
|  | 	qse_raddic_vendor_t* dv; | ||||||
|  |  | ||||||
|  | 	dv = qse_raddic_findvendorbyvalue(dic, value); | ||||||
|  | 	if (!dv) return -1; | ||||||
|  |  | ||||||
|  | 	if (dv->nextv) | ||||||
|  | 	{ | ||||||
|  | 		qse_htl_update (&dic->vendors_byvalue, dv->nextv); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		/* this is the only vendor with the vendor ID. i can  | ||||||
|  | 		 * safely remove it from the lookup table by value */ | ||||||
|  | 		qse_htl_delete (&dic->vendors_byvalue, dv); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* delete the vendor from the lookup table by name */ | ||||||
|  | 	qse_htl_delete (&dic->vendors_byname, dv); | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| #if 0 // XXX | #if 0 // XXX | ||||||
| /* | /* | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ | |||||||
| static int test1 () | static int test1 () | ||||||
| {	 | {	 | ||||||
| 	qse_raddic_t* dic; | 	qse_raddic_t* dic; | ||||||
| 	qse_raddic_vendor_t* vendor; | 	qse_raddic_vendor_t* vendor, * v; | ||||||
| 	int i; | 	int i; | ||||||
|  |  | ||||||
| 	dic = qse_raddic_open (QSE_MMGR_GETDFL(), 0); | 	dic = qse_raddic_open (QSE_MMGR_GETDFL(), 0); | ||||||
| @ -44,9 +44,10 @@ static int test1 () | |||||||
| 	_assert (vendor != QSE_NULL && vendor->vendorpec == 12365, "unabled to find a vendor named Abiyo-aliased.Net"); | 	_assert (vendor != QSE_NULL && vendor->vendorpec == 12365, "unabled to find a vendor named Abiyo-aliased.Net"); | ||||||
| 	_assert (qse_strcasecmp(vendor->name, QSE_T("abiyo-aliased.net")) == 0, "unabled to find a vendor of value 12365"); | 	_assert (qse_strcasecmp(vendor->name, QSE_T("abiyo-aliased.net")) == 0, "unabled to find a vendor of value 12365"); | ||||||
|  |  | ||||||
| #define COUNT 65535 | #define COUNT1 600 | ||||||
|  | #define COUNT2 700 | ||||||
|  |  | ||||||
| 	for (i = 0; i < COUNT; i++) | 	for (i = 0; i < COUNT1; i++) | ||||||
| 	{ | 	{ | ||||||
| 		qse_char_t tmp[64]; | 		qse_char_t tmp[64]; | ||||||
| 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | ||||||
| @ -56,7 +57,7 @@ static int test1 () | |||||||
| 		_assert (qse_strcasecmp(vendor->name, tmp) == 0, "wrong vendor name"); | 		_assert (qse_strcasecmp(vendor->name, tmp) == 0, "wrong vendor name"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for (i = 0; i < COUNT; i++) | 	for (i = 0; i < COUNT1; i++) | ||||||
| 	{ | 	{ | ||||||
| 		qse_char_t tmp[64]; | 		qse_char_t tmp[64]; | ||||||
| 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | ||||||
| @ -66,7 +67,7 @@ static int test1 () | |||||||
| 		_assert (qse_strcasecmp(vendor->name, tmp) == 0, "wrong vendor name"); | 		_assert (qse_strcasecmp(vendor->name, tmp) == 0, "wrong vendor name"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for (i = 0; i < COUNT; i++) | 	for (i = 0; i < COUNT1; i++) | ||||||
| 	{ | 	{ | ||||||
| 		qse_char_t tmp[64]; | 		qse_char_t tmp[64]; | ||||||
| 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | ||||||
| @ -76,6 +77,91 @@ static int test1 () | |||||||
| 		_assert (qse_strcasecmp(vendor->name, tmp) == 0, "wrong vendor name"); | 		_assert (qse_strcasecmp(vendor->name, tmp) == 0, "wrong vendor name"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	for (i = COUNT1; i < COUNT2; i++) | ||||||
|  | 	{ | ||||||
|  | 		qse_char_t tmp[64]; | ||||||
|  | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | ||||||
|  | 		vendor = qse_raddic_addvendor (dic, tmp, COUNT1);  | ||||||
|  | 		// insert different items with the same value | ||||||
|  | 		_assert (vendor != QSE_NULL, "unable to add a vendor"); | ||||||
|  | 		_assert (vendor->vendorpec == COUNT1, "wrong vendor value"); | ||||||
|  | 		_assert (qse_strcasecmp(vendor->name, tmp) == 0, "wrong vendor name"); | ||||||
|  |  | ||||||
|  | 		v = qse_raddic_findvendorbyvalue (dic, COUNT1); | ||||||
|  | 		_assert (vendor == v, "unable to find a last added vendor by value"); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for (i = COUNT1; i < COUNT2 - 1; i++) | ||||||
|  | 	{ | ||||||
|  | 		qse_char_t tmp[64]; | ||||||
|  | 		int n; | ||||||
|  |  | ||||||
|  | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | ||||||
|  |  | ||||||
|  | 		n = qse_raddic_deletevendorbyname (dic, tmp);  | ||||||
|  | 		_assert (n == 0, "unable to delete a vendor"); | ||||||
|  |  | ||||||
|  | 		v = qse_raddic_findvendorbyname (dic, tmp); | ||||||
|  | 		_assert (v == QSE_NULL, "vendor found errorenously"); | ||||||
|  |  | ||||||
|  | 		if (i == COUNT2 - 1) | ||||||
|  | 		{ | ||||||
|  | 			v = qse_raddic_findvendorbyvalue (dic, COUNT1); | ||||||
|  | 			_assert (v == QSE_NULL, "vendor of COUNT1 found errorenously"); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i + 1); | ||||||
|  | 			v = qse_raddic_findvendorbyname (dic, tmp); | ||||||
|  | 			_assert (v != QSE_NULL && v->vendorpec == COUNT1 && qse_strcasecmp(tmp, v->name) == 0, "unable to find an expected vendor"); | ||||||
|  |  | ||||||
|  | 			v = qse_raddic_findvendorbyvalue (dic, COUNT1); | ||||||
|  | 			_assert (v != QSE_NULL && v->vendorpec == COUNT1, "unable to find the vendor of COUNT1"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < COUNT1; i++) | ||||||
|  | 	{ | ||||||
|  | 		qse_char_t tmp[64]; | ||||||
|  | 		int n; | ||||||
|  |  | ||||||
|  | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | ||||||
|  | 		n = qse_raddic_deletevendorbyname (dic, tmp); | ||||||
|  | 		_assert (n == 0, "unable to delete a vendor"); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < COUNT1; i++) | ||||||
|  | 	{ | ||||||
|  | 		qse_char_t tmp[64]; | ||||||
|  | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("test%d"), i); | ||||||
|  | 		v = qse_raddic_addvendor (dic, tmp, i); | ||||||
|  | 		_assert (v != QSE_NULL && v->vendorpec == i, "unable to add a vendor"); | ||||||
|  |  | ||||||
|  | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("testx%d"), i); | ||||||
|  | 		v = qse_raddic_addvendor (dic, tmp, i); | ||||||
|  | 		_assert (v != QSE_NULL && v->vendorpec == i, "unable to add a vendor"); | ||||||
|  |  | ||||||
|  | 		qse_strxfmt(tmp, QSE_COUNTOF(tmp), QSE_T("testy%d"), i); | ||||||
|  | 		v = qse_raddic_addvendor (dic, tmp, i); | ||||||
|  | 		_assert (v != QSE_NULL && v->vendorpec == i, "unable to add a vendor"); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < COUNT1; i++) | ||||||
|  | 	{ | ||||||
|  | 		int n; | ||||||
|  | 		n = qse_raddic_deletevendorbyvalue (dic, i); | ||||||
|  | 		_assert (n == 0, "unable to delete a vendor by value"); | ||||||
|  |  | ||||||
|  | 		n = qse_raddic_deletevendorbyvalue (dic, i); | ||||||
|  | 		_assert (n == 0, "unable to delete a vendor by value"); | ||||||
|  |  | ||||||
|  | 		n = qse_raddic_deletevendorbyvalue (dic, i); | ||||||
|  | 		_assert (n == 0, "unable to delete a vendor by value"); | ||||||
|  |  | ||||||
|  | 		n = qse_raddic_deletevendorbyvalue (dic, i); | ||||||
|  | 		_assert (n <= -1, "erroreneously successful vendor deletion by value"); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
| 	qse_raddic_close (dic); | 	qse_raddic_close (dic); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user