Home | History | Annotate | Download | only in cachegrind

Lines Matching refs:fm

73 /* Free up the FM.  If kFin is non-NULL, it is applied to keys
74 before the FM is deleted; ditto with vFin for vals. */
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 );
90 // set up FM for iteration
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 );
100 // Deep copy a FM. If dopyK is NULL, keys are copied verbatim.
106 WordFM* dopyFM ( WordFM* fm, Word(*dopyK)(Word), Word(*dopyV)(Word) );
1293 static void stackClear(WordFM* fm)
1296 assert(fm);
1298 fm->nodeStack[i] = NULL;
1299 fm->numStack[i] = 0;
1301 fm->stackTop = 0;
1305 static inline void stackPush(WordFM* fm, AvlNode* n, Int i)
1307 assert(fm->stackTop < WFM_STKMAX);
1309 fm->nodeStack[fm->stackTop] = n;
1310 fm-> numStack[fm->stackTop] = i;
1311 fm->stackTop++;
1315 static inline Bool stackPop(WordFM* fm, AvlNode** n, Int* i)
1317 assert(fm->stackTop <= WFM_STKMAX);
1319 if (fm->stackTop > 0) {
1320 fm->stackTop--;
1321 *n = fm->nodeStack[fm->stackTop];
1322 *i = fm-> numStack[fm->stackTop];
1324 fm->nodeStack[fm->stackTop] = NULL;
1325 fm-> numStack[fm->stackTop] = 0;
1386 void initFM ( WordFM* fm,
1391 fm->root = 0;
1392 fm->kCmp = kCmp;
1393 fm->alloc_nofail = alloc_nofail;
1394 fm->dealloc = dealloc;
1395 fm->stackTop = 0;
1403 WordFM* fm = alloc_nofail(sizeof(WordFM));
1404 assert(fm);
1405 initFM(fm, alloc_nofail, dealloc, kCmp);
1406 return fm;
1428 /* Free up the FM. If kFin is non-NULL, it is applied to keys
1429 before the FM is deleted; ditto with vFin for vals. */
1430 void deleteFM ( WordFM* fm, void(*kFin)(Word), void(*vFin)(Word) )
1432 void(*dealloc)(void*) = fm->dealloc;
1433 avl_free( fm->root, kFin, vFin, dealloc );
1434 memset(fm, 0, sizeof(WordFM) );
1435 dealloc(fm);
1438 /* Add (k,v) to fm. */
1439 void addToFM ( WordFM* fm, Word k, Word v )
1443 node = fm->alloc_nofail( sizeof(struct _AvlNode) );
1448 avl_insert_wrk( &fm->root, &oldV, node, fm->kCmp );
1449 //if (oldV.b && fm->vFin)
1450 // fm->vFin( oldV.w );
1455 // Delete key from fm, returning associated val if found
1456 Bool delFromFM ( WordFM* fm, /*OUT*/Word* oldV, Word key )
1458 AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
1460 avl_remove_wrk( &fm->root, node, fm->kCmp );
1463 fm->dealloc(node);
1470 // Look up in fm, assigning found val at spec'd address
1471 Bool lookupFM ( WordFM* fm, /*OUT*/Word* valP, Word key )
1473 AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
1483 Word sizeFM ( WordFM* fm )
1486 return fm->root ? size_avl_nonNull( fm->root ) : 0;
1489 // set up FM for iteration
1490 void initIterFM ( WordFM* fm )
1492 assert(fm);
1493 stackClear(fm);
1494 if (fm->root)
1495 stackPush(fm, fm->root, 1);
1498 // get next key/val pair. Will assert if fm has been modified
1500 Bool nextIterFM ( WordFM* fm, /*OUT*/Word* pKey, /*OUT*/Word* pVal )
1505 assert(fm);
1511 while (stackPop(fm, &n, &i)) {
1514 stackPush(fm, n, 2);
1515 if (n->left) stackPush(fm, n->left, 1);
1518 stackPush(fm, n, 3);
1523 if (n->right) stackPush(fm, n->right, 1);
1535 void doneIterFM ( WordFM* fm )
1539 WordFM* dopyFM ( WordFM* fm, Word(*dopyK)(Word), Word(*dopyV)(Word) )
1543 /* can't clone the fm whilst iterating on it */
1544 assert(fm->stackTop == 0);
1546 nyu = fm->alloc_nofail( sizeof(WordFM) );
1549 *nyu = *fm;
1551 fm->stackTop = 0;
1552 memset(fm->nodeStack, 0, sizeof(fm->nodeStack));
1553 memset(fm->numStack, 0, sizeof(fm->numStack));
1556 nyu->root = avl_dopy( nyu->root, dopyK, dopyV, fm->alloc_nofail );