X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libhashkit%2Fhashkit.h;h=451333075f225c83641647dcd93065db946935f1;hb=31ed3cfdb9f1b7cf00a93dfefbe067b468a67507;hp=173f4d9ce3c095aa435947b206fdc4edd6b55852;hpb=a81bddebd55105aefa57af7cc87adbda3d1a022e;p=awesomized%2Flibmemcached diff --git a/libhashkit/hashkit.h b/libhashkit/hashkit.h index 173f4d9c..45133307 100644 --- a/libhashkit/hashkit.h +++ b/libhashkit/hashkit.h @@ -1,5 +1,5 @@ /* HashKit - * Copyright (C) 2009 Brian Aker + * Copyright (C) 2009-2010 Brian Aker * All rights reserved. * * Use and distribution licensed under the BSD license. See @@ -9,56 +9,117 @@ #ifndef HASHKIT_H #define HASHKIT_H + #if !defined(__cplusplus) # include #endif #include #include #include +#include #include #include #include +#include +#include #include #ifdef __cplusplus + +#include + extern "C" { #endif +HASHKIT_API +hashkit_st *hashkit_create(hashkit_st *hash); + +HASHKIT_API +hashkit_st *hashkit_clone(hashkit_st *destination, const hashkit_st *ptr); + +HASHKIT_API +bool hashkit_compare(const hashkit_st *first, const hashkit_st *second); + +HASHKIT_API +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_hash_algorithm_t type; + struct hashkit_function_st { hashkit_hash_fn function; void *context; - } base_hash; + } base_hash, distribution_hash; + + struct { + bool is_base_same_distributed:1; + } flags; struct { bool is_allocated:1; } options; }; -HASHKIT_API -hashkit_st *hashkit_create(hashkit_st *hash); +#ifdef __cplusplus +class Hashkit : private hashkit_st { -HASHKIT_API -hashkit_st *hashkit_clone(hashkit_st *destination, const hashkit_st *ptr); +public: -HASHKIT_API -void hashkit_free(hashkit_st *hash); + Hashkit() + { + hashkit_create(this); + } -HASHKIT_API -uint32_t hashkit_generate_value(const hashkit_st *self, const char *key, size_t key_length); + Hashkit(const Hashkit& source) + { + hashkit_clone(this, &source); + } -HASHKIT_API -uint32_t libhashkit_generate_value(const char *key, size_t key_length, hashkit_hash_algorithm_t hash_algorithm); + Hashkit& operator=(const Hashkit& source) + { + hashkit_free(this); + hashkit_clone(this, &source); -#define hashkit_is_allocated(__object) ((__object)->options.is_allocated) -#define hashkit_is_initialized(__object) ((__object)->options.is_initialized) + return *this; + } -/** @} */ + friend bool operator==(const Hashkit &left, const Hashkit &right) + { + return hashkit_compare(&left, &right); + } -#ifdef __cplusplus -} + 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() + { + hashkit_free(this); + } +}; #endif + #endif /* HASHKIT_H */