fr_trie_key_t get_key,
fr_free_t free_data);
+/*
+ * CC_NO_SANITIZE_UNDEFINED("function") is needed because ubsan implements
+ * strict function pointer type checking. This is an issue because ubsan
+ * doesn't allow void * to match a specific tree type like fr_hash_t.
+ */
+
/** Match data in a htrie
*
*/
+CC_NO_SANITIZE_UNDEFINED("function")
static inline CC_HINT(nonnull) void *fr_htrie_match(fr_htrie_t *ht, void const *data)
{
return ht->funcs.match(ht->store, data);
/** Find data in a htrie
*
*/
+CC_NO_SANITIZE_UNDEFINED("function")
static inline CC_HINT(nonnull) void *fr_htrie_find(fr_htrie_t *ht, void const *data)
{
return ht->funcs.find(ht->store, data);
/** Insert data into a htrie
*
*/
+CC_NO_SANITIZE_UNDEFINED("function")
static inline CC_HINT(nonnull) bool fr_htrie_insert(fr_htrie_t *ht, void const *data)
{
return ht->funcs.insert(ht->store, data);
/** Replace data in a htrie, freeing previous data if free_data cb was passed to fr_htrie_alloc
*
*/
+CC_NO_SANITIZE_UNDEFINED("function")
static inline CC_HINT(nonnull(2,3)) int fr_htrie_replace(void **old, fr_htrie_t *ht, void const *data)
{
return ht->funcs.replace(old, ht->store, data);
/** Remove data from a htrie without freeing it
*
*/
+CC_NO_SANITIZE_UNDEFINED("function")
static inline CC_HINT(nonnull) void *fr_htrie_remove(fr_htrie_t *ht, void const *data)
{
return ht->funcs.remove(ht->store, data);
/** Delete data from a htrie, freeing it if free_data cb was passed to fr_htrie_alloc
*
*/
+CC_NO_SANITIZE_UNDEFINED("function")
static inline CC_HINT(nonnull) bool fr_htrie_delete(fr_htrie_t *ht, void const *data)
{
return ht->funcs.delete(ht->store, data);
/** Return the number of elements in the htrie
*
*/
+CC_NO_SANITIZE_UNDEFINED("function")
static inline CC_HINT(nonnull) int fr_htrie_num_elements(fr_htrie_t *ht)
{
return ht->funcs.num_elements(ht->store);