Alien-Judy
view release on metacpan or search on metacpan
src/judy-1.0.5/src/JudyCommon/JudyCount.c view on Meta::CPAN
LEAFABOVE(Func, Pjll, Pop1)
#else
// Note: For JudyL immediates with >= 2 Indexes, the index bytes are in a
// different place than for Judy1:
#define IMMABOVE(Func,Pop1) \
LEAFABOVE(Func, (Pjll_t) (Pjp->jp_LIndex), Pop1)
#endif
// For all leaf types, the population AT OR ABOVE is the total pop1 less the
// offset of Index; and Index should always be found:
#define LEAFABOVE(Func,Pjll,Pop1) \
offset = Func(Pjll, Pop1, Index); \
assert(offset >= 0); \
assert(offset < (Pop1)); \
return((Pop1) - offset)
// IMMABOVE_01 handles the special case of an immediate JP with 1 index, which
// the search functions arent used for anyway:
//
// The target Index should be the one in this Immediate, in which case the
// count above (inclusive) is always 1.
#define IMMABOVE_01 \
assert((JU_JPDCDPOP0(Pjp)) == JU_TRIMTODCDSIZE(Index)); \
return(1)
// ----------------------------------------------------------------------------
// LINEAR LEAF; search the leaf for Index; size is computed from jp_Type:
#if (defined(JUDYL) || (! defined(JU_64BIT)))
case cJU_JPLEAF1: LEAFLABOVE(j__udySearchLeaf1);
#endif
case cJU_JPLEAF2: LEAFLABOVE(j__udySearchLeaf2);
case cJU_JPLEAF3: LEAFLABOVE(j__udySearchLeaf3);
#ifdef JU_64BIT
case cJU_JPLEAF4: LEAFLABOVE(j__udySearchLeaf4);
case cJU_JPLEAF5: LEAFLABOVE(j__udySearchLeaf5);
case cJU_JPLEAF6: LEAFLABOVE(j__udySearchLeaf6);
case cJU_JPLEAF7: LEAFLABOVE(j__udySearchLeaf7);
#endif
// ----------------------------------------------------------------------------
// BITMAP LEAF; search the leaf for Index:
//
// Since the bitmap describes Indexes digitally rather than linearly, this is
// not really a search, but just a count.
case cJU_JPLEAF_B1: LEAFB1ABOVE(j__udyCountLeafB1);
#ifdef JUDY1
// ----------------------------------------------------------------------------
// FULL POPULATION:
//
// Return the count of Indexes AT OR ABOVE Index, which is the total population
// of the expanse (a constant) less the value of the undecoded digit remaining
// in Index (its base-0 offset in the expanse), which yields an inclusive count
// above.
//
// TBD: This only supports a 1-byte full expanse. Should this extract a
// stored value for pop0 and possibly more LSBs of Index, to handle larger full
// expanses?
case cJ1_JPFULLPOPU1:
return(cJU_JPFULLPOPU1_POP0 + 1 - JU_DIGITATSTATE(Index, 1));
#endif
// ----------------------------------------------------------------------------
// IMMEDIATE:
case cJU_JPIMMED_1_01: IMMABOVE_01;
case cJU_JPIMMED_2_01: IMMABOVE_01;
case cJU_JPIMMED_3_01: IMMABOVE_01;
#ifdef JU_64BIT
case cJU_JPIMMED_4_01: IMMABOVE_01;
case cJU_JPIMMED_5_01: IMMABOVE_01;
case cJU_JPIMMED_6_01: IMMABOVE_01;
case cJU_JPIMMED_7_01: IMMABOVE_01;
#endif
case cJU_JPIMMED_1_02: IMMABOVE(j__udySearchLeaf1, 2);
case cJU_JPIMMED_1_03: IMMABOVE(j__udySearchLeaf1, 3);
#if (defined(JUDY1) || defined(JU_64BIT))
case cJU_JPIMMED_1_04: IMMABOVE(j__udySearchLeaf1, 4);
case cJU_JPIMMED_1_05: IMMABOVE(j__udySearchLeaf1, 5);
case cJU_JPIMMED_1_06: IMMABOVE(j__udySearchLeaf1, 6);
case cJU_JPIMMED_1_07: IMMABOVE(j__udySearchLeaf1, 7);
#endif
#if (defined(JUDY1) && defined(JU_64BIT))
case cJ1_JPIMMED_1_08: IMMABOVE(j__udySearchLeaf1, 8);
case cJ1_JPIMMED_1_09: IMMABOVE(j__udySearchLeaf1, 9);
case cJ1_JPIMMED_1_10: IMMABOVE(j__udySearchLeaf1, 10);
case cJ1_JPIMMED_1_11: IMMABOVE(j__udySearchLeaf1, 11);
case cJ1_JPIMMED_1_12: IMMABOVE(j__udySearchLeaf1, 12);
case cJ1_JPIMMED_1_13: IMMABOVE(j__udySearchLeaf1, 13);
case cJ1_JPIMMED_1_14: IMMABOVE(j__udySearchLeaf1, 14);
case cJ1_JPIMMED_1_15: IMMABOVE(j__udySearchLeaf1, 15);
#endif
#if (defined(JUDY1) || defined(JU_64BIT))
case cJU_JPIMMED_2_02: IMMABOVE(j__udySearchLeaf2, 2);
case cJU_JPIMMED_2_03: IMMABOVE(j__udySearchLeaf2, 3);
#endif
#if (defined(JUDY1) && defined(JU_64BIT))
case cJ1_JPIMMED_2_04: IMMABOVE(j__udySearchLeaf2, 4);
case cJ1_JPIMMED_2_05: IMMABOVE(j__udySearchLeaf2, 5);
case cJ1_JPIMMED_2_06: IMMABOVE(j__udySearchLeaf2, 6);
case cJ1_JPIMMED_2_07: IMMABOVE(j__udySearchLeaf2, 7);
#endif
#if (defined(JUDY1) || defined(JU_64BIT))
case cJU_JPIMMED_3_02: IMMABOVE(j__udySearchLeaf3, 2);
#endif
#if (defined(JUDY1) && defined(JU_64BIT))
case cJ1_JPIMMED_3_03: IMMABOVE(j__udySearchLeaf3, 3);
( run in 1.231 second using v1.01-cache-2.11-cpan-39bf76dae61 )