X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Futil.c;h=be378ef84409cd23bec31a6fff7e3caa1fa51f7a;hb=772058dfc33fbe4857864b4bdb8ba947eca19303;hp=d292634731b662827dc8c0dfbeec0f566ab5a32a;hpb=d9bdc90da5c143d76cf3efd3c39b9bd190fb3741;p=bluesky.git diff --git a/bluesky/util.c b/bluesky/util.c index d292634..be378ef 100644 --- a/bluesky/util.c +++ b/bluesky/util.c @@ -219,3 +219,40 @@ BlueSkyInode *bluesky_list_tail(GList *head) else return (BlueSkyInode *)head->prev->data; } + +/**** Range sets. ****/ + +/* These are a data structure which can track a set of discontiguous integer + * ranges--such as the partitioning of the inode number space or the bytes in a + * log file into objects. This current prototype implementation just tracks + * the starting offset with a hash table and doesn't track the length, but + * should be extended later to track properly. */ + +struct BlueSkyRangeset { + GHashTable *hashtable; +}; + +BlueSkyRangeset *bluesky_rangeset_new() +{ + BlueSkyRangeset *rangeset = g_new(BlueSkyRangeset, 1); + rangeset->hashtable = g_hash_table_new(g_direct_hash, g_direct_equal); + return rangeset; +} + +void bluesky_rangeset_free(BlueSkyRangeset *rangeset) +{ + g_hash_table_unref(rangeset->hashtable); + g_free(rangeset); +} + +gboolean bluesky_rangeset_insert(BlueSkyRangeset *rangeset, + int start, int length, gpointer data) +{ + g_hash_table_insert(rangeset->hashtable, GINT_TO_POINTER(start), data); + return TRUE; +} + +gpointer bluesky_rangeset_lookup(BlueSkyRangeset *rangeset, int start) +{ + return g_hash_table_lookup(rangeset->hashtable, GINT_TO_POINTER(start)); +}