Alien-Judy
view release on metacpan or search on metacpan
src/judy-1.0.5/src/JudyCommon/JudyIns.c view on Meta::CPAN
// (4_01 => [[ 4_02..03 => ]] LeafL)
case cJ1_JPIMMED_4_02:
JU_IMMSETINPLACE(4, uint32_t *, cJ1_JPIMMED_4_02, j__udySearchLeaf4,
JU_INSERTINPLACE);
case cJ1_JPIMMED_4_03:
JU_IMMSETCASCADE(4, 3, uint32_t *, cJU_JPLEAF4, ignore,
j__udySearchLeaf4, JU_INSERTCOPY,
j__udyAllocJLL4);
// (5_01 => [[ 5_02..03 => ]] LeafL)
case cJ1_JPIMMED_5_02:
JU_IMMSETINPLACE(5, uint8_t *, cJ1_JPIMMED_5_02, j__udySearchLeaf5,
JU_INSERTINPLACE5);
case cJ1_JPIMMED_5_03:
JU_IMMSETCASCADE(5, 3, uint8_t *, cJU_JPLEAF5, ignore,
j__udySearchLeaf5, JU_INSERTCOPY5,
j__udyAllocJLL5);
// (6_01 => [[ 6_02 => ]] LeafL)
case cJ1_JPIMMED_6_02:
JU_IMMSETCASCADE(6, 2, uint8_t *, cJU_JPLEAF6, ignore,
j__udySearchLeaf6, JU_INSERTCOPY6,
j__udyAllocJLL6);
// (7_01 => [[ 7_02 => ]] LeafL)
case cJ1_JPIMMED_7_02:
JU_IMMSETCASCADE(7, 2, uint8_t *, cJU_JPLEAF7, ignore,
j__udySearchLeaf7, JU_INSERTCOPY7,
j__udyAllocJLL7);
#endif // (JUDY1 && JU_64BIT)
// ****************************************************************************
// INVALID JP TYPE:
default: JU_SET_ERRNO_NONNULL(Pjpm, JU_ERRNO_CORRUPT); return(-1);
} // switch on JP type
{
#ifdef SUBEXPCOUNTS
// This code might seem strange here. However it saves some memory read time
// during insert (~70nS) because a pipelined processor does not need to "stall"
// waiting for the memory read to complete. Hope the compiler is not too smart
// or dumb and moves the code down to where it looks like it belongs (below a
// few lines).
Word_t SubExpCount = 0; // current subexpanse counter.
if (PSubExp != (PWord_t) NULL) // only if BranchB/U.
SubExpCount = PSubExp[0];
#endif
// PROCESS JP -- RECURSIVELY:
//
// For non-Immed JP types, if successful, post-increment the population count
// at this Level.
retcode = j__udyInsWalk(Pjp, Index, Pjpm);
// Successful insert, increment JP and subexpanse count:
if ((JU_JPTYPE(Pjp) < cJU_JPIMMED_1_01) && (retcode == 1))
{
jp_t JP;
Word_t DcdP0;
#ifdef SUBEXPCOUNTS
// Note: Pjp must be a pointer to a BranchB/U:
if (PSubExp != (PWord_t) NULL) PSubExp[0] = SubExpCount + 1;
#endif
JP = *Pjp;
DcdP0 = JU_JPDCDPOP0(Pjp) + 1;
JU_JPSETADT(Pjp, JP.jp_Addr, DcdP0, JU_JPTYPE(&JP));
}
}
return(retcode);
} // j__udyInsWalk()
// ****************************************************************************
// J U D Y 1 S E T
// J U D Y L I N S
//
// Main entry point. See the manual entry for details.
#ifdef JUDY1
FUNCTION int Judy1Set
#else
FUNCTION PPvoid_t JudyLIns
#endif
(
PPvoid_t PPArray, // in which to insert.
Word_t Index, // to insert.
PJError_t PJError // optional, for returning error info.
)
{
#ifdef JUDY1
#define Pjv ignore // placeholders for macros.
#define Pjvnew ignore
#else
Pjv_t Pjv; // value area in old leaf.
( run in 1.187 second using v1.01-cache-2.11-cpan-39bf76dae61 )