\brief Delete data from a hash based on desired key
\param hash the hash to delete from
\param key the key from which to delete the data
- \return SWITCH_STATUS_SUCCESS if the data is deleted
+ \return The value stored if the data is deleted otherwise NULL
*/
-SWITCH_DECLARE(switch_status_t) switch_core_hash_delete(_In_ switch_hash_t *hash, _In_z_ const char *key);
+SWITCH_DECLARE(void *) switch_core_hash_delete(_In_ switch_hash_t *hash, _In_z_ const char *key);
/*!
\brief Delete data from a hash based on desired key
const void **key, _Out_opt_ switch_ssize_t *klen, _Out_ void **val);
+SWITCH_DECLARE(switch_status_t) switch_core_inthash_init(switch_inthash_t **hash);
+SWITCH_DECLARE(switch_status_t) switch_core_inthash_destroy(switch_inthash_t **hash);
+SWITCH_DECLARE(switch_status_t) switch_core_inthash_insert(switch_inthash_t *hash, uint32_t key, const void *data);
+SWITCH_DECLARE(void *) switch_core_inthash_delete(switch_inthash_t *hash, uint32_t key);
+SWITCH_DECLARE(void *) switch_core_inthash_find(switch_inthash_t *hash, uint32_t key);
///\}
SWITCH_DECLARE(switch_hashtable_iterator_t*) switch_hashtable_next(switch_hashtable_iterator_t **iP);
SWITCH_DECLARE(void) switch_hashtable_this(switch_hashtable_iterator_t *i, const void **key, switch_ssize_t *klen, void **val);
+static inline uint32_t switch_hash_default_int(void *ky) {
+ uint32_t x = *((uint32_t *)ky);
+ x = ((x >> 16) ^ x) * 0x45d9f3b;
+ x = ((x >> 16) ^ x) * 0x45d9f3b;
+ x = ((x >> 16) ^ x);
+ return x;
+}
+
+static inline int switch_hash_equalkeys_int(void *k1, void *k2)
+{
+ return *(uint32_t *)k1 == *(uint32_t *)k2;
+}
+
static inline int switch_hash_equalkeys(void *k1, void *k2)
{
return strcmp((char *) k1, (char *) k2) ? 0 : 1;
SWITCH_RTP_FLAG_PLI,
SWITCH_RTP_FLAG_RESET,
SWITCH_RTP_FLAG_MUTE,
+ SWITCH_RTP_FLAG_NACK,
SWITCH_RTP_FLAG_INVALID
} switch_rtp_flag_t;
struct switch_hashtable;
struct switch_hashtable_iterator;
typedef struct switch_hashtable switch_hash_t;
+typedef struct switch_hashtable switch_inthash_t;
typedef struct switch_hashtable_iterator switch_hash_index_t;
struct switch_network_list;
if (tech_pvt->profile->purge) {
mdl_profile_t *profile = tech_pvt->profile;
- if (switch_core_hash_delete(globals.profile_hash, profile->name) == SWITCH_STATUS_SUCCESS) {
+ if (switch_core_hash_delete(globals.profile_hash, profile->name)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile %s deleted successfully\n", profile->name);
}
}
ldl_handle_stop(profile->handle);
}
- if (switch_core_hash_delete(globals.profile_hash, profile->name) == SWITCH_STATUS_SUCCESS) {
+ if (switch_core_hash_delete(globals.profile_hash, profile->name)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Profile %s deleted successfully\n", profile->name);
}
}
return SWITCH_STATUS_SUCCESS;
}
-SWITCH_DECLARE(switch_status_t) switch_core_hash_delete(switch_hash_t *hash, const char *key)
+SWITCH_DECLARE(void *) switch_core_hash_delete(switch_hash_t *hash, const char *key)
{
- switch_hashtable_remove(hash, (void *)key);
-
- return SWITCH_STATUS_SUCCESS;
+ return switch_hashtable_remove(hash, (void *)key);
}
SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_locked(switch_hash_t *hash, const char *key, switch_mutex_t *mutex)
/* now delete them */
for (header = event->headers; header; header = header->next) {
- if (switch_core_hash_delete(hash, header->value) == SWITCH_STATUS_SUCCESS) {
+ if (switch_core_hash_delete(hash, header->value)) {
status = SWITCH_STATUS_SUCCESS;
}
}
}
+SWITCH_DECLARE(switch_status_t) switch_core_inthash_init(switch_inthash_t **hash)
+{
+ return switch_create_hashtable(hash, 16, switch_hash_default_int, switch_hash_equalkeys_int);
+}
+
+SWITCH_DECLARE(switch_status_t) switch_core_inthash_destroy(switch_inthash_t **hash)
+{
+ switch_hashtable_destroy(hash);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_core_inthash_insert(switch_inthash_t *hash, uint32_t key, const void *data)
+{
+ uint32_t *k = NULL;
+
+ switch_zmalloc(k, sizeof(k));
+ *k = key;
+ switch_hashtable_insert_destructor(hash, k, (void *)data, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_DUP_CHECK, NULL);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+SWITCH_DECLARE(void *) switch_core_inthash_delete(switch_inthash_t *hash, uint32_t key)
+{
+ return switch_hashtable_remove(hash, (void *)&key);
+}
+
+SWITCH_DECLARE(void *) switch_core_inthash_find(switch_inthash_t *hash, uint32_t key)
+{
+ return switch_hashtable_search(hash, (void *)&key);
+}
+
+
/* For Emacs:
* Local Variables:
* mode:c
switch_status_t status = SWITCH_STATUS_FALSE;
if (parser != NULL && digits != NULL && *digits) {
- status = switch_core_hash_delete(parser->hash, digits);
+ status = switch_core_hash_delete(parser->hash, digits) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
}
if (status != SWITCH_STATUS_SUCCESS) {