看了一下宏的实现,这是zle结构的高效的原因之一:
- } zlentry;
-
- #define ZIPLIST_ENTRY_ZERO(zle) { \
- (zle)->prevrawlensize = (zle)->prevrawlen = 0; \
- (zle)->lensize = (zle)->len = (zle)->headersize = 0; \
- (zle)->encoding = 0; \
- (zle)->p = NULL; \
- }
-
- /* Extract the encoding from the byte pointed by 'ptr' and set it into
- * 'encoding' field of the zlentry structure. */
- #define ZIP_ENTRY_ENCODING(ptr, encoding) do { \
- (encoding) = ((ptr)[0]); \
- if ((encoding) < ZIP_STR_MASK) (encoding) &= ZIP_STR_MASK; \
- } while(0)
-
- #define ZIP_ENCODING_SIZE_INVALID 0xff
- /* Return the number of bytes required to encode the entry type + length.
- * On error, return ZIP_ENCODING_SIZE_INVALID */
- static inline unsigned int zipEncodingLenSize(unsigned char encoding) {
- if (encoding == ZIP_INT_16B || encoding == ZIP_INT_32B ||
- encoding == ZIP_INT_24B || encoding == ZIP_INT_64B ||
- encoding == ZIP_INT_8B)
- return 1;
- if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX)
- return 1;
- if (encoding == ZIP_STR_06B)
- return 1;
- if (encoding == ZIP_STR_14B)
- return 2;
- if (encoding == ZIP_STR_32B)
- return 5;
- return ZIP_ENCODING_SIZE_INVALID;
- }
-
- #define ZIP_ASSERT_ENCODING(encoding) do { \
- assert(zipEncodingLenSize(encoding) != ZIP_ENCODING_SIZE_INVALID); \
- } while (0)
-
- /* Return bytes needed to store integer encoded by 'encoding' */
- static inline unsigned int zipIntSize(unsigned char encoding) {
- switch(encoding) {
- case ZIP_INT_8B: return 1;
- case ZIP_INT_16B: return 2;
- case ZIP_INT_24B: return 3;
- case ZIP_INT_32B: return 4;
- case ZIP_INT_64B: return 8;
- }
- if (encoding >= ZIP_INT_IMM_MIN && encoding <= ZIP_INT_IMM_MAX)
- return 0; /* 4 bit immediate */
- /* bad encoding, covered by a previous call to ZIP_ASSERT_ENCODING */
- redis_unreachable();
- return 0;
- }