Lines Matching defs:fm

77 /* Add (k,v) to fm.  If a binding for k already exists, it is updated
80 void addToFM ( WordFM* fm, Word k, Word v );
82 // Delete key from fm, returning associated val if found
83 Bool delFromFM ( WordFM* fm, /*OUT*/Word* oldV, Word key );
85 // Look up in fm, assigning found val at spec'd address
86 Bool lookupFM ( WordFM* fm, /*OUT*/Word* valP, Word key );
88 Word sizeFM ( WordFM* fm );
91 void initIterFM ( WordFM* fm );
93 // get next key/val pair. Will assert if fm has been modified
95 Bool nextIterFM ( WordFM* fm, /*OUT*/Word* pKey, /*OUT*/Word* pVal );
98 void doneIterFM ( WordFM* fm );
106 WordFM* dopyFM ( WordFM* fm, Word(*dopyK)(Word), Word(*dopyV)(Word) );
1304 static void stackClear(WordFM* fm)
1307 assert(fm);
1309 fm->nodeStack[i] = NULL;
1310 fm->numStack[i] = 0;
1312 fm->stackTop = 0;
1316 static inline void stackPush(WordFM* fm, AvlNode* n, Int i)
1318 assert(fm->stackTop < WFM_STKMAX);
1320 fm->nodeStack[fm->stackTop] = n;
1321 fm-> numStack[fm->stackTop] = i;
1322 fm->stackTop++;
1326 static inline Bool stackPop(WordFM* fm, AvlNode** n, Int* i)
1328 assert(fm->stackTop <= WFM_STKMAX);
1330 if (fm->stackTop > 0) {
1331 fm->stackTop--;
1332 *n = fm->nodeStack[fm->stackTop];
1333 *i = fm-> numStack[fm->stackTop];
1335 fm->nodeStack[fm->stackTop] = NULL;
1336 fm-> numStack[fm->stackTop] = 0;
1397 void initFM ( WordFM* fm,
1402 fm->root = 0;
1403 fm->kCmp = kCmp;
1404 fm->alloc_nofail = alloc_nofail;
1405 fm->dealloc = dealloc;
1406 fm->stackTop = 0;
1414 WordFM* fm = alloc_nofail(sizeof(WordFM));
1415 assert(fm);
1416 initFM(fm, alloc_nofail, dealloc, kCmp);
1417 return fm;
1441 void deleteFM ( WordFM* fm, void(*kFin)(Word), void(*vFin)(Word) )
1443 void(*dealloc)(void*) = fm->dealloc;
1444 avl_free( fm->root, kFin, vFin, dealloc );
1445 memset(fm, 0, sizeof(WordFM) );
1446 dealloc(fm);
1449 /* Add (k,v) to fm. */
1450 void addToFM ( WordFM* fm, Word k, Word v )
1454 node = fm->alloc_nofail( sizeof(struct _AvlNode) );
1459 avl_insert_wrk( &fm->root, &oldV, node, fm->kCmp );
1460 //if (oldV.b && fm->vFin)
1461 // fm->vFin( oldV.w );
1466 // Delete key from fm, returning associated val if found
1467 Bool delFromFM ( WordFM* fm, /*OUT*/Word* oldV, Word key )
1469 AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
1471 avl_remove_wrk( &fm->root, node, fm->kCmp );
1474 fm->dealloc(node);
1481 // Look up in fm, assigning found val at spec'd address
1482 Bool lookupFM ( WordFM* fm, /*OUT*/Word* valP, Word key )
1484 AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
1494 Word sizeFM ( WordFM* fm )
1497 return fm->root ? size_avl_nonNull( fm->root ) : 0;
1501 void initIterFM ( WordFM* fm )
1503 assert(fm);
1504 stackClear(fm);
1505 if (fm->root)
1506 stackPush(fm, fm->root, 1);
1509 // get next key/val pair. Will assert if fm has been modified
1511 Bool nextIterFM ( WordFM* fm, /*OUT*/Word* pKey, /*OUT*/Word* pVal )
1516 assert(fm);
1522 while (stackPop(fm, &n, &i)) {
1525 stackPush(fm, n, 2);
1526 if (n->left) stackPush(fm, n->left, 1);
1529 stackPush(fm, n, 3);
1534 if (n->right) stackPush(fm, n->right, 1);
1546 void doneIterFM ( WordFM* fm )
1550 WordFM* dopyFM ( WordFM* fm, Word(*dopyK)(Word), Word(*dopyV)(Word) )
1554 /* can't clone the fm whilst iterating on it */
1555 assert(fm->stackTop == 0);
1557 nyu = fm->alloc_nofail( sizeof(WordFM) );
1560 *nyu = *fm;
1562 fm->stackTop = 0;
1563 memset(fm->nodeStack, 0, sizeof(fm->nodeStack));
1564 memset(fm->numStack, 0, sizeof(fm->numStack));
1567 nyu->root = avl_dopy( nyu->root, dopyK, dopyV, fm->alloc_nofail );