X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fhc_matchfinder.h;h=6c7020e5979a58b59cf56a1e6ebd5c3a3f7d54b9;hb=7e71e0ea5e7c2958cef2cc3522367a7da82e4728;hp=8382a3cdab8388d4710d5189acd4a2d74bc953f1;hpb=64b6dba86d307632b4c6b36ea15b993b5bac760c;p=wimlib diff --git a/include/wimlib/hc_matchfinder.h b/include/wimlib/hc_matchfinder.h index 8382a3cd..6c7020e5 100644 --- a/include/wimlib/hc_matchfinder.h +++ b/include/wimlib/hc_matchfinder.h @@ -49,11 +49,13 @@ * * Notes on usage * - * You must define MATCHFINDER_MAX_WINDOW_ORDER before including this header - * because that determines which integer type to use for positions. Since - * 16-bit integers are faster than 32-bit integers due to reduced memory usage - * (and therefore reduced cache pressure), the code only uses 32-bit integers if - * they are needed to represent all possible positions. + * Before including this header, you must define 'pos_t' to an integer type that + * can represent all possible positions. This can be a 16-bit or 32-bit + * unsigned integer. When possible, the former should be used due to the + * reduced cache pressure. This header can be included multiple times in a + * single .c file with different 'pos_t' definitions; however, you must define a + * different MF_SUFFIX each time to generate different names for the matchfinder + * structure and functions. * * The number of bytes that must be allocated for a given 'struct * hc_matchfinder' must be gotten by calling hc_matchfinder_size(). @@ -100,29 +102,20 @@ * ---------------------------------------------------------------------------- */ -#ifndef _HC_MATCHFINDER_H -#define _HC_MATCHFINDER_H - -#ifndef MATCHFINDER_MAX_WINDOW_ORDER -# error "MATCHFINDER_MAX_WINDOW_ORDER must be defined!" -#endif - #include #include "wimlib/lz_extend.h" #include "wimlib/lz_hash.h" #include "wimlib/unaligned.h" -#if MATCHFINDER_MAX_WINDOW_ORDER <= 16 -typedef u16 pos_t; -#else -typedef u32 pos_t; -#endif - #define HC_MATCHFINDER_HASH3_ORDER 14 #define HC_MATCHFINDER_HASH4_ORDER 15 -struct hc_matchfinder { +/* TEMPLATED functions and structures have MF_SUFFIX appended to their name. */ +#undef TEMPLATED +#define TEMPLATED(name) CONCAT(name, MF_SUFFIX) + +struct TEMPLATED(hc_matchfinder) { /* The hash table for finding length 3 matches */ pos_t hash3_tab[1UL << HC_MATCHFINDER_HASH3_ORDER]; @@ -139,14 +132,15 @@ struct hc_matchfinder { /* Return the number of bytes that must be allocated for a 'hc_matchfinder' that * can work with buffers up to the specified size. */ static inline size_t -hc_matchfinder_size(size_t max_bufsize) +TEMPLATED(hc_matchfinder_size)(size_t max_bufsize) { - return sizeof(struct hc_matchfinder) + (max_bufsize * sizeof(pos_t)); + return sizeof(struct TEMPLATED(hc_matchfinder)) + + (max_bufsize * sizeof(pos_t)); } /* Prepare the matchfinder for a new input buffer. */ static inline void -hc_matchfinder_init(struct hc_matchfinder *mf) +TEMPLATED(hc_matchfinder_init)(struct TEMPLATED(hc_matchfinder) *mf) { memset(mf, 0, sizeof(*mf)); } @@ -181,15 +175,15 @@ hc_matchfinder_init(struct hc_matchfinder *mf) * 'best_len' was found. */ static inline u32 -hc_matchfinder_longest_match(struct hc_matchfinder * const restrict mf, - const u8 * const restrict in_begin, - const ptrdiff_t cur_pos, - u32 best_len, - const u32 max_len, - const u32 nice_len, - const u32 max_search_depth, - u32 next_hashes[const restrict static 2], - u32 * const restrict offset_ret) +TEMPLATED(hc_matchfinder_longest_match)(struct TEMPLATED(hc_matchfinder) * const restrict mf, + const u8 * const restrict in_begin, + const ptrdiff_t cur_pos, + u32 best_len, + const u32 max_len, + const u32 nice_len, + const u32 max_search_depth, + u32 next_hashes[const restrict static 2], + u32 * const restrict offset_ret) { const u8 *in_next = in_begin + cur_pos; u32 depth_remaining = max_search_depth; @@ -350,12 +344,12 @@ out: * Returns @in_next + @count. */ static inline const u8 * -hc_matchfinder_skip_positions(struct hc_matchfinder * const restrict mf, - const u8 * const restrict in_begin, - const ptrdiff_t cur_pos, - const ptrdiff_t end_pos, - const u32 count, - u32 next_hashes[const restrict static 2]) +TEMPLATED(hc_matchfinder_skip_positions)(struct TEMPLATED(hc_matchfinder) * const restrict mf, + const u8 * const restrict in_begin, + const ptrdiff_t cur_pos, + const ptrdiff_t end_pos, + const u32 count, + u32 next_hashes[const restrict static 2]) { const u8 *in_next = in_begin + cur_pos; const u8 * const stop_ptr = in_next + count; @@ -386,5 +380,3 @@ hc_matchfinder_skip_positions(struct hc_matchfinder * const restrict mf, return stop_ptr; } - -#endif /* _HC_MATCHFINDER_H */