From 07ece0b4b352e7bb07bcf7d44060d4e7fee5ebd0 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Sat, 22 Feb 2014 00:29:25 +0000 Subject: [PATCH] Unifying splaycomparemethod with treecompare. Copied from Perforce Change: 184428 ServerID: perforce.ravenbrook.com --- mps/code/cbs.c | 5 +++-- mps/code/dbgpool.c | 4 ++-- mps/code/splay.c | 28 +++++++++++++--------------- mps/code/splay.h | 6 +++--- 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/mps/code/cbs.c b/mps/code/cbs.c index 93b859cd0b2..44b1a0b990d 100644 --- a/mps/code/cbs.c +++ b/mps/code/cbs.c @@ -104,7 +104,7 @@ static Bool CBSBlockCheck(CBSBlock block) * See */ -static Compare cbsCompare(void *key, Tree node) +static Compare cbsCompare(Tree node, void *key) { Addr base1, base2, limit2; CBSBlock cbsBlock; @@ -213,7 +213,8 @@ Res CBSInit(Arena arena, CBS cbs, void *owner, Align alignment, if (ArgPick(&arg, args, MPS_KEY_CBS_EXTEND_BY)) extendBy = arg.val.size; - SplayTreeInit(treeOfCBS(cbs), &cbsCompare, + SplayTreeInit(treeOfCBS(cbs), + cbsCompare, fastFind ? cbsUpdateNode : SplayTrivUpdate); MPS_ARGS_BEGIN(pcArgs) { MPS_ARGS_ADD(pcArgs, MPS_KEY_MFS_UNIT_SIZE, sizeof(CBSBlockStruct)); diff --git a/mps/code/dbgpool.c b/mps/code/dbgpool.c index 02264119753..f24a6c2edee 100644 --- a/mps/code/dbgpool.c +++ b/mps/code/dbgpool.c @@ -44,7 +44,7 @@ static void TagTrivInit(void* tag, va_list args) /* TagComp -- splay comparison function for address ordering of tags */ -static Compare TagComp(void *key, Tree node) +static Compare TagCompare(Tree node, void *key) { Addr addr1, addr2; @@ -195,7 +195,7 @@ static Res DebugPoolInit(Pool pool, ArgList args) if (res != ResOK) goto tagFail; debug->missingTags = 0; - SplayTreeInit(&debug->index, TagComp, SplayTrivUpdate); + SplayTreeInit(&debug->index, TagCompare, SplayTrivUpdate); } debug->sig = PoolDebugMixinSig; diff --git a/mps/code/splay.c b/mps/code/splay.c index c721c28b4b8..907f8ffc773 100644 --- a/mps/code/splay.c +++ b/mps/code/splay.c @@ -25,8 +25,7 @@ SRCID(splay, "$Id$"); #define SplayTreeRoot(t) RVALUE((t)->root) #define SplayTreeSetRoot(t, r) BEGIN ((t)->root = (r)); END -#define SplayCompare(tree, key, node) \ - (((tree)->compare)((key), (node))) +#define SplayCompare(tree, key, node) (((tree)->compare)(node, key)) Bool SplayTreeCheck(SplayTree tree) @@ -39,7 +38,8 @@ Bool SplayTreeCheck(SplayTree tree) } -void SplayTreeInit(SplayTree tree, SplayCompareMethod compare, +void SplayTreeInit(SplayTree tree, + TreeCompare compare, SplayUpdateNodeMethod updateNode) { AVER(tree != NULL); @@ -283,7 +283,7 @@ static void SplayAssemble(SplayTree tree, Tree top, */ static Bool SplaySplay(Tree *nodeReturn, SplayTree tree, - void *key, SplayCompareMethod compareMethod) { + void *key, TreeCompare compare) { /* The sides structure avoids a boundary case in SplayLink* */ TreeStruct sides; /* rightTop and leftTop */ Tree top, leftLast, rightFirst; @@ -292,7 +292,7 @@ static Bool SplaySplay(Tree *nodeReturn, SplayTree tree, AVERT(SplayTree, tree); AVER(nodeReturn != NULL); - AVER(FUNCHECK(compareMethod)); + AVER(FUNCHECK(compare)); top = SplayTreeRoot(tree); /* will be copied back at end */ @@ -302,7 +302,7 @@ static Bool SplaySplay(Tree *nodeReturn, SplayTree tree, } /* short-circuit case where node is already top */ - compareTop = (*compareMethod)(key, top); + compareTop = compare(top, key); if (compareTop == CompareEQUAL) { *nodeReturn = top; return TRUE; @@ -322,7 +322,7 @@ static Bool SplaySplay(Tree *nodeReturn, SplayTree tree, found = FALSE; goto assemble; } else { - Compare compareTopLeft = (*compareMethod)(key, topLeft); + Compare compareTopLeft = compare(topLeft, key); switch(compareTopLeft) { @@ -359,7 +359,7 @@ static Bool SplaySplay(Tree *nodeReturn, SplayTree tree, found = FALSE; goto assemble; } else { - Compare compareTopRight = (*compareMethod)(key, topRight); + Compare compareTopRight = compare(topRight, key); switch(compareTopRight) { @@ -399,7 +399,7 @@ static Bool SplaySplay(Tree *nodeReturn, SplayTree tree, NOTREACHED; } break; } - compareTop = (*compareMethod)(key, top); + compareTop = compare(top, key); } /* end while(TRUE) */ terminalZig: @@ -750,7 +750,7 @@ typedef struct { SplayTree tree; } SplayFindClosureStruct, *SplayFindClosure; -static Compare SplayFindFirstCompare(void *key, Tree node) +static Compare SplayFindFirstCompare(Tree node, void *key) { SplayFindClosure closure; void *closureP; @@ -781,7 +781,7 @@ static Compare SplayFindFirstCompare(void *key, Tree node) } } -static Compare SplayFindLastCompare(void *key, Tree node) +static Compare SplayFindLastCompare(Tree node, void *key) { SplayFindClosure closure; void *closureP; @@ -849,8 +849,7 @@ Bool SplayFindFirst(Tree *nodeReturn, SplayTree tree, closureStruct.testTree = testTree; closureStruct.tree = tree; - if (SplaySplay(&node, tree, (void *)&closureStruct, - &SplayFindFirstCompare)) { + if (SplaySplay(&node, tree, (void *)&closureStruct, SplayFindFirstCompare)) { *nodeReturn = node; return TRUE; } else { @@ -885,8 +884,7 @@ Bool SplayFindLast(Tree *nodeReturn, SplayTree tree, closureStruct.testTree = testTree; closureStruct.tree = tree; - if (SplaySplay(&node, tree, (void *)&closureStruct, - &SplayFindLastCompare)) { + if (SplaySplay(&node, tree, (void *)&closureStruct, SplayFindLastCompare)) { *nodeReturn = node; return TRUE; } else { diff --git a/mps/code/splay.h b/mps/code/splay.h index fc137e6432e..62e4eedbacc 100644 --- a/mps/code/splay.h +++ b/mps/code/splay.h @@ -15,7 +15,6 @@ typedef struct SplayTreeStruct *SplayTree; -typedef Compare (*SplayCompareMethod)(void *key, Tree node); typedef Bool (*SplayTestNodeMethod)(SplayTree tree, Tree node, void *closureP, Size closureS); typedef Bool (*SplayTestTreeMethod)(SplayTree tree, Tree node, @@ -26,14 +25,15 @@ typedef void (*SplayUpdateNodeMethod)(SplayTree tree, Tree node); extern void SplayTrivUpdate(SplayTree tree, Tree node); typedef struct SplayTreeStruct { - SplayCompareMethod compare; + TreeCompare compare; SplayUpdateNodeMethod updateNode; Tree root; } SplayTreeStruct; extern Bool SplayTreeCheck(SplayTree tree); -extern void SplayTreeInit(SplayTree tree, SplayCompareMethod compare, +extern void SplayTreeInit(SplayTree tree, + TreeCompare compare, SplayUpdateNodeMethod updateNode); extern void SplayTreeFinish(SplayTree tree);