Alien-Judy
view release on metacpan or search on metacpan
src/judy-1.0.5/src/JudyCommon/JudyPrivate.h view on Meta::CPAN
| | | | | |
V V | V(1) | V(1)
+------ +------ | +------ | +------
Two byte |< 1 > |< 1 > | | 4+ | | 4+
Index Leaf |< 3 > |< 3 > O | 1+ O | 1+ 2
+------ +------ / | C | | C
/ | 1 | | 1
| +-L---- | +-L----
| | | |
| / | /
| | | |
V V V V
+------ +------ +------ +------
One byte Index Leaf |< 3 > |< 3 > |< 3 > |< 3 > 1
+------ +------ +------ +------
#endif // A_PICTURE_IS_WORTH_1000_WORDS
// ****************************************************************************
// MISCELLANEOUS GLOBALS:
//
// PLATFORM-SPECIFIC CONVENIENCE MACROS:
//
// These are derived from context (set by cc or in system header files) or
// based on JU_<PLATFORM> macros from make_includes/platform.*.mk. We decided
// on 011018 that any macro reliably derivable from context (cc or headers) for
// ALL platforms supported by Judy is based on that derivation, but ANY
// exception means to stop using the external macro completely and derive from
// JU_<PLATFORM> instead.
// Other miscellaneous stuff:
#ifndef _BOOL_T
#define _BOOL_T
typedef int bool_t;
#endif
#define FUNCTION // null; easy to find functions.
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifdef TRACE // turn on all other tracing in the code:
#define TRACEJP 1 // JP traversals in JudyIns.c and JudyDel.c.
#define TRACEJPR 1 // JP traversals in retrieval code, JudyGet.c.
#define TRACECF 1 // cache fills in JudyGet.c.
#define TRACEMI 1 // malloc calls in JudyMallocIF.c.
#define TRACEMF 1 // malloc calls at a lower level in JudyMalloc.c.
#endif
// SUPPORT FOR DEBUG-ONLY CODE:
//
// By convention, use -DDEBUG to enable both debug-only code AND assertions in
// the Judy sources.
//
// Invert the sense of assertions, so they are off unless explicitly requested,
// in a uniform way.
//
// Note: It is NOT appropriate to put this in Judy.h; it would mess up
// application code.
#ifndef DEBUG
#define NDEBUG 1 // must be 1 for "#if".
#endif
// Shorthand notations to avoid #ifdefs for single-line conditional statements:
//
// Warning: These cannot be used around compiler directives, such as
// "#include", nor in the case where Code contains a comma other than nested
// within parentheses or quotes.
#ifndef DEBUG
#define DBGCODE(Code) // null.
#else
#define DBGCODE(Code) Code
#endif
#ifdef JUDY1
#define JUDY1CODE(Code) Code
#define JUDYLCODE(Code) // null.
#endif
#ifdef JUDYL
#define JUDYLCODE(Code) Code
#define JUDY1CODE(Code) // null.
#endif
#include <assert.h>
// ****************************************************************************
// FUNDAMENTAL CONSTANTS FOR MACHINE
// ****************************************************************************
// Machine (CPU) cache line size:
//
// NOTE: A leaf size of 2 cache lines maximum is the target (optimal) for
// Judy. Its hard to obtain a machines cache line size at compile time, but
// if the machine has an unexpected cache line size, its not devastating if
// the following constants end up causing leaves that are 1 cache line in size,
// or even 4 cache lines in size. The assumed 32-bit system has 16-word =
// 64-byte cache lines, and the assumed 64-bit system has 16-word = 128-byte
// cache lines.
#ifdef JU_64BIT
#define cJU_BYTESPERCL 128 // cache line size in bytes.
#else
#define cJU_BYTESPERCL 64 // cache line size in bytes.
#endif
// Bits Per Byte:
#define cJU_BITSPERBYTE 0x8
src/judy-1.0.5/src/JudyCommon/JudyPrivate.h view on Meta::CPAN
// factors:
//
// TBD: The value areas should be accessed via data structures, here and in
// Dougs code, not by hard-coded address calculations.
//
// This is useful in insert/delete code when the value area is returned from
// lower levels in the JPM:
#define JU_RET_FOUND_JPM(Pjpm) return((PPvoid_t) ((Pjpm)->jpm_PValue))
// This is useful in insert/delete code when the value area location is already
// computed:
#define JU_RET_FOUND_PVALUE(Pjv,OFFSET) return((PPvoid_t) ((Pjv) + OFFSET))
#define JU_RET_FOUND_LEAFW(PJLW,POP1,OFFSET) \
return((PPvoid_t) (JL_LEAFWVALUEAREA(PJLW, POP1) + (OFFSET)))
#define JU_RET_FOUND_LEAF1(Pjll,POP1,OFFSET) \
return((PPvoid_t) (JL_LEAF1VALUEAREA(Pjll, POP1) + (OFFSET)))
#define JU_RET_FOUND_LEAF2(Pjll,POP1,OFFSET) \
return((PPvoid_t) (JL_LEAF2VALUEAREA(Pjll, POP1) + (OFFSET)))
#define JU_RET_FOUND_LEAF3(Pjll,POP1,OFFSET) \
return((PPvoid_t) (JL_LEAF3VALUEAREA(Pjll, POP1) + (OFFSET)))
#ifdef JU_64BIT
#define JU_RET_FOUND_LEAF4(Pjll,POP1,OFFSET) \
return((PPvoid_t) (JL_LEAF4VALUEAREA(Pjll, POP1) + (OFFSET)))
#define JU_RET_FOUND_LEAF5(Pjll,POP1,OFFSET) \
return((PPvoid_t) (JL_LEAF5VALUEAREA(Pjll, POP1) + (OFFSET)))
#define JU_RET_FOUND_LEAF6(Pjll,POP1,OFFSET) \
return((PPvoid_t) (JL_LEAF6VALUEAREA(Pjll, POP1) + (OFFSET)))
#define JU_RET_FOUND_LEAF7(Pjll,POP1,OFFSET) \
return((PPvoid_t) (JL_LEAF7VALUEAREA(Pjll, POP1) + (OFFSET)))
#endif
// Note: Here jp_Addr is a value area itself and not an address, so P_JV() is
// not needed:
#define JU_RET_FOUND_IMM_01(PJP) return((PPvoid_t) (&((PJP)->jp_Addr)))
// Note: Here jp_Addr is a pointer to a separately-mallocd value area, so
// P_JV() is required; likewise for JL_JLB_PVALUE:
#define JU_RET_FOUND_IMM(PJP,OFFSET) \
return((PPvoid_t) (P_JV((PJP)->jp_Addr) + (OFFSET)))
#define JU_RET_FOUND_LEAF_B1(PJLB,SUBEXP,OFFSET) \
return((PPvoid_t) (P_JV(JL_JLB_PVALUE(PJLB, SUBEXP)) + (OFFSET)))
#endif // JUDYL
// GENERIC ERROR HANDLING:
//
// This is complicated by variations in the needs of the callers of these
// macros. Only use JU_SET_ERRNO() for PJError, because it can be null; use
// JU_SET_ERRNO_NONNULL() for Pjpm, which is never null, and also in other
// cases where the pointer is known not to be null (to save dead branches).
//
// Note: Most cases of JU_ERRNO_OVERRUN or JU_ERRNO_CORRUPT should result in
// an assertion failure in debug code, so they are more likely to be caught, so
// do that here in each macro.
#define JU_SET_ERRNO(PJError, JErrno) \
{ \
assert((JErrno) != JU_ERRNO_OVERRUN); \
assert((JErrno) != JU_ERRNO_CORRUPT); \
\
if (PJError != (PJError_t) NULL) \
{ \
JU_ERRNO(PJError) = (JErrno); \
JU_ERRID(PJError) = __LINE__; \
} \
}
// Variation for callers who know already that PJError is non-null; and, it can
// also be Pjpm (both PJError_t and Pjpm_t have je_* fields), so only assert it
// for null, not cast to any specific pointer type:
#define JU_SET_ERRNO_NONNULL(PJError, JErrno) \
{ \
assert((JErrno) != JU_ERRNO_OVERRUN); \
assert((JErrno) != JU_ERRNO_CORRUPT); \
assert(PJError); \
\
JU_ERRNO(PJError) = (JErrno); \
JU_ERRID(PJError) = __LINE__; \
}
// Variation to copy error info from a (required) JPM to an (optional)
// PJError_t:
//
// Note: The assertions above about JU_ERRNO_OVERRUN and JU_ERRNO_CORRUPT
// should have already popped, so they are not needed here.
#define JU_COPY_ERRNO(PJError, Pjpm) \
{ \
if (PJError) \
{ \
JU_ERRNO(PJError) = (uint8_t)JU_ERRNO(Pjpm); \
JU_ERRID(PJError) = JU_ERRID(Pjpm); \
} \
}
// For JErrno parameter to previous macros upon return from Judy*Alloc*():
//
// The memory allocator returns an address of 0 for out of memory,
// 1..sizeof(Word_t)-1 for corruption (an invalid pointer), otherwise a valid
// pointer.
#define JU_ALLOC_ERRNO(ADDR) \
(((void *) (ADDR) != (void *) NULL) ? JU_ERRNO_OVERRUN : JU_ERRNO_NOMEM)
#define JU_CHECKALLOC(Type,Ptr,Retval) \
if ((Ptr) < (Type) sizeof(Word_t)) \
{ \
JU_SET_ERRNO(PJError, JU_ALLOC_ERRNO(Ptr)); \
return(Retval); \
}
// Leaf search routines
( run in 0.321 second using v1.01-cache-2.11-cpan-39bf76dae61 )