X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libhashkit%2Fhashkit.h;h=5f19f9d34af3221da3a6f564f5a076940eb038ce;hb=284978b1dc258cb8cd2a32d6a0f25f2f9b284149;hp=6dd08f43faa87ae39e38c94390bf5422be844a46;hpb=c67da677fe0944d3d2d3ff46e65fc3bc775404ae;p=awesomized%2Flibmemcached diff --git a/libhashkit/hashkit.h b/libhashkit/hashkit.h index 6dd08f43..5f19f9d3 100644 --- a/libhashkit/hashkit.h +++ b/libhashkit/hashkit.h @@ -1,19 +1,15 @@ /* HashKit - * Copyright (C) 2009 Brian Aker + * Copyright (C) 2009-2010 Brian Aker * All rights reserved. * * Use and distribution licensed under the BSD license. See * the COPYING file in the parent directory for full text. */ -/** - * @file - * @brief HashKit Header - */ - #ifndef HASHKIT_H #define HASHKIT_H + #if !defined(__cplusplus) # include #endif @@ -23,70 +19,16 @@ #include #include #include +#include +#include #include #ifdef __cplusplus -extern "C" { -#endif - -/** - * @addtogroup hashkit_constants Constants - * @ingroup hashkit - * @{ - */ - -/* Defines. */ -#define HASHKIT_MAX_KEY 251 -#define HASHKIT_POINTS_PER_NODE 100 -#define HASHKIT_POINTS_PER_NODE_WEIGHTED 160 -#define HASHKIT_CONTINUUM_ADDITION 10 -#define HASHKIT_CONTINUUM_KEY_SIZE 86 -/** @} */ - -/** - * @ingroup hashkit - */ -struct hashkit_st -{ - hashkit_options_st options; - hashkit_distribution_t distribution; - uint32_t continuum_count; - uint32_t continuum_points_count; - size_t list_size; - size_t context_size; - - /** - @note There are two places we use hashing, one is for when we have a key - and we want to find out what server it should be placed on. The second is - for when we are placing a value into the continuum. - */ - hashkit_hash_algorithm_t for_key; - hashkit_hash_algorithm_t for_distribution; - - hashkit_continuum_point_st *continuum; - hashkit_fn *hash_fn; - hashkit_active_fn *active_fn; - hashkit_fn *continuum_hash_fn; - hashkit_key_fn *continuum_key_fn; - hashkit_sort_fn *sort_fn; - hashkit_weight_fn *weight_fn; - void *list; -}; - -/** - * @ingroup hashkit - */ -struct hashkit_continuum_point_st -{ - uint32_t index; - uint32_t value; -}; +#include -/** - * @addtogroup hashkit Pandora Hash Declarations - * @{ - */ +extern "C" { +#endif HASHKIT_API hashkit_st *hashkit_create(hashkit_st *hash); @@ -95,18 +37,92 @@ HASHKIT_API hashkit_st *hashkit_clone(hashkit_st *destination, const hashkit_st *ptr); HASHKIT_API -void hashkit_free(hashkit_st *hash); +bool hashkit_compare(const hashkit_st *first, const hashkit_st *second); HASHKIT_API -uint32_t hashkit_generate_value(const char *key, size_t key_length, hashkit_hash_algorithm_t hash_algorithm); +void hashkit_free(hashkit_st *hash); #define hashkit_is_allocated(__object) ((__object)->options.is_allocated) #define hashkit_is_initialized(__object) ((__object)->options.is_initialized) -/** @} */ +#ifdef __cplusplus +} // extern "C" +#endif + +struct hashkit_st +{ + struct hashkit_function_st { + hashkit_hash_fn function; + void *context; + } base_hash, distribution_hash; + + struct { + bool is_base_same_distributed:1; + } flags; + + struct { + bool is_allocated:1; + } options; #ifdef __cplusplus -} + + hashkit_st() : + base_hash(), + distribution_hash(), + flags(), + options() + { + hashkit_create(this); + } + + hashkit_st(const hashkit_st& source) : + base_hash(), + distribution_hash(), + flags(), + options() + { + hashkit_clone(this, &source); + } + + hashkit_st& operator=(const hashkit_st& source) + { + hashkit_free(this); + hashkit_clone(this, &source); + + return *this; + } + + friend bool operator==(const hashkit_st &left, const hashkit_st &right) + { + return hashkit_compare(&left, &right); + } + + uint32_t digest(std::string& str) + { + return hashkit_digest(this, str.c_str(), str.length()); + } + + uint32_t digest(const char *key, size_t key_length) + { + return hashkit_digest(this, key, key_length); + } + + hashkit_return_t set_function(hashkit_hash_algorithm_t hash_algorithm) + { + return hashkit_set_function(this, hash_algorithm); + } + + hashkit_return_t set_distribution_function(hashkit_hash_algorithm_t hash_algorithm) + { + return hashkit_set_function(this, hash_algorithm); + } + + ~hashkit_st() + { + hashkit_free(this); + } #endif +}; + #endif /* HASHKIT_H */