X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Flhash%2Flhash.h;h=5e3fde5ae44241d1f3a11b0f3a8c4de2aa81c5f5;hp=0c1e2d2338db20fd3af66d4e709243b00e92fd66;hb=dfa46e502dff4b86e6e41fbcc36c561caf20bd2e;hpb=c21c35e6a43d0798e29ad85e8c54fa6de45c12d7 diff --git a/crypto/lhash/lhash.h b/crypto/lhash/lhash.h index 0c1e2d2338..5e3fde5ae4 100644 --- a/crypto/lhash/lhash.h +++ b/crypto/lhash/lhash.h @@ -89,6 +89,35 @@ typedef unsigned long (*LHASH_HASH_FN_TYPE)(void *); typedef void (*LHASH_DOALL_FN_TYPE)(void *); typedef void (*LHASH_DOALL_ARG_FN_TYPE)(void *, void *); +/* Macros for declaring and implementing type-safe wrappers for LHASH callbacks. + * This way, callbacks can be provided to LHASH structures without function + * pointer casting and the macro-defined callbacks provide per-variable casting + * before deferring to the underlying type-specific callbacks. NB: It is + * possible to place a "static" in front of both the DECLARE and IMPLEMENT + * macros if the functions are strictly internal. To keep text-editors happy, + * the macro deliberately doesn't define a trailing semi-colon - so the macro + * can be placed just like a regular function declaration, with an optional + * "static" prefix and trailing simi-colon. */ + +/* First: "hash" functions */ +#define DECLARE_LHASH_HASH_FN(f_name,o_type) \ + unsigned long f_name##_LHASH_HASH(void *) +#define IMPLEMENT_LHASH_HASH_FN(f_name,o_type) \ + unsigned long f_name##_LHASH_HASH(void *arg) { \ + o_type a = (o_type)arg; \ + return f_name(a); } +#define LHASH_HASH_FN(f_name) f_name##_LHASH_HASH + +/* Second: "compare" functions */ +#define DECLARE_LHASH_COMP_FN(f_name,o_type) \ + int f_name##_LHASH_COMP(void *, void *) +#define IMPLEMENT_LHASH_COMP_FN(f_name,o_type) \ + int f_name##_LHASH_COMP(void *arg1, void *arg2) { \ + o_type a = (o_type)arg1; \ + o_type b = (o_type)arg2; \ + return f_name(a,b); } +#define LHASH_COMP_FN(f_name) f_name##_LHASH_COMP + typedef struct lhash_st { LHASH_NODE **b;