cp_hashlist(3) - Linux man page

Name

cp_hashlist - a hashtable supporting insertion order conservation and quick iteration

Description

cp_hashlist may be viewed as a hashtable where nodes are inserted in a linked list to express their iteration order or equivalently, as a linked list where entries are keyed to permit random access lookups. Like cp_hashtable, this implementation makes it possible to specify the degree of internal or external synchronization and entry memory management as well as several performance tuning parameters - namely the load factor limits for internal table resizing.

Interface

<cprops/hashlist.h> defines the following functions:

CONSTRUCTOR FUNCTIONS

cp_hashlist *cp_hashlist_create(unsigned long size_hint,

cp_hashfunction hash_fn, cp_compare_fn compare_fn);

cp_hashlist *cp_hashlist_create_by_mode(int mode,

unsigned long size_hint, cp_hashfunction hash_fn, cp_compare_fn compare_fn);

cp_hashlist *cp_hashlist_create_by_option(int mode,

unsigned long size_hint, cp_hashfunction cp_hash_fn, cp_compare_fn compare_fn, cp_copy_fn copy_key, cp_destructor_fn key_free, cp_copy_fn copy_value cp_destructor_fn free_value);

DESTRUCTOR FUNCTIONS

void cp_hashlist_destroy(cp_hashlist *list);

void cp_hashlist_destroy_by_option(cp_hashlist *list, int mode);

void cp_hashlist_destroy_custom(cp_hashlist *list,

cp_destructor_fn dk, cp_destructor_fn dv);

ADDING MAPPINGS

void *cp_hashlist_insert(cp_hashlist *list, void *key, void *value);
void *cp_hashlist_insert_by_option(cp_hashlist *
list,

void *key, void *value, int mode);
void *cp_hashlist_append(cp_hashlist *
list, void *key, void *value);
void *cp_hashlist_append_by_option(cp_hashlist *
list, void *key, void *value, int mode);

REMOVING MAPPINGS

void *cp_hashlist_remove(cp_hashlist *list, void *key);
void *cp_hashlist_remove_deep(cp_hashlist *
list, void *key);
void *cp_hashlist_remove_by_option(cp_hashlist *
list,

void *key, int mode);

void *cp_hashlist_remove_head(cp_hashlist *list);
void *cp_hashlist_remove_head_by_option(cp_hashlist *
list, int mode);
void *cp_hashlist_remove_tail(cp_hashlist *
list);
void *cp_hashlist_remove_tail_by_option(cp_hashlist *
list, int mode);

ITEM RETRIEVAL

void *cp_hashlist_get(cp_hashlist *list, void *key);
void *cp_hashlist_get_head(cp_hashlist *
list);
void *cp_hashlist_get_tail(cp_hashlist *
list);

BEHAVIOR

int cp_hashlist_get_mode(cp_hashlist *list);
int cp_hashlist_set_mode(cp_hashlist *
list, int mode);
int cp_hashlist_unset_mode(cp_hashlist *
list, int mode);
int cp_hashlist_set_min_size(cp_hashlist *
list, long size);
int cp_hashlist_set_min_fill_factor(cp_hashlist *
list, int factor);
int cp_hashlist_set_max_fill_factor(cp_hashlist *
list, int factor);

SYNCHRONIZATION

int cp_hashlist_lock(cp_hashlist *list, int type);
int cp_hashlist_unlock(cp_hashlist *
list);
int cp_hashlist_rdlock(cp_hashlist *
list);
int cp_hashlist_wrlock(cp_hashlist *
list);

OTHER

int cp_hashlist_callback(cp_hashlist *list,

int (*cb)(void *key, void *value, void *id), void *id);
unsigned long cp_hashlist_item_count(cp_hashlist *
list);
int cp_hashlist_is_empty(cp_hashlist *
list);

Example

The following code creates a hashlist, inserts mappings, performs a lookup and prints the keys in reverse order.

#include <cprops/hashlist.h>
#include <stdio.h>
#include <string.h> /* strcmp and strdup */
#include <stdlib.h> /* free */
#include <errno.h>  /* perror */

int main(int argc, char *argv[])
{
char key[32];

char value[32];

char *res;

cp_hashlist *t;

cp_hashlist_iterator *i;

int j;

t = cp_hashlist_create_by_option(COLLECTION_MODE_NOSYNC |

COLLECTION_MODE_DEEP |
COLLECTION_MODE_COPY,
10,
cp_hash_string,
(cp_compare_fn) strcmp,
(cp_copy_fn) strdup,
(cp_destructor_fn) free,
(cp_copy_fn) strdup,
(cp_destructor_fn) free);
if (t == NULL)

{

perror(argv[0]);

exit(1);

}

for (j = 0; j < 10; j++)

{

sprintf(key, "ENTRY (%d)", j);

sprintf(value, "VALUE (%d)", j);

if (cp_hashlist_insert(t, key, value) == NULL)

{

perror(argv[0]);

exit(1);

}

}

res = cp_hashlist_get(t, "ENTRY (5)");

printf("looking up entry #5: %s\n", res ? res : "not found");

printf("iterating over list values:\n");

i = cp_hashlist_create_iterator(t, COLLECTION_LOCK_NONE);

while ((res = cp_hashlist_iterator_next_value(i)))

printf("\to\t%s\n", res);

cp_hashlist_iterator_destroy(i);

cp_hashlist_destroy(t);

return 0;

}
for notes on compiling and linking see cprops(3).

See Also

cp_hashlist_iterator(3), cp_hashlist_create(3), cp_hashlist_destroy(3), cp_hashlist_get(3), cp_hashlist_insert(3), cp_hashlist_lock(3), cp_hashlist_set_mode(3), cp_hashtable(3), cprops(3)

Referenced By

cp_hashtable_create(3), cp_list(3)