Home | History | Annotate | Download | only in coregrind

Lines Matching refs:fm

462 static void stackClear(WordFM* fm)
465 tl_assert(fm);
467 fm->nodeStack[i] = NULL;
468 fm->numStack[i] = 0;
470 fm->stackTop = 0;
474 static inline void stackPush(WordFM* fm, AvlNode* n, Int i)
476 tl_assert(fm->stackTop < WFM_STKMAX);
478 fm->nodeStack[fm->stackTop] = n;
479 fm-> numStack[fm->stackTop] = i;
480 fm->stackTop++;
484 static inline Bool stackPop(WordFM* fm, AvlNode** n, Int* i)
486 tl_assert(fm->stackTop <= WFM_STKMAX);
488 if (fm->stackTop > 0) {
489 fm->stackTop--;
490 *n = fm->nodeStack[fm->stackTop];
491 *i = fm-> numStack[fm->stackTop];
493 fm->nodeStack[fm->stackTop] = NULL;
494 fm-> numStack[fm->stackTop] = 0;
556 static void initFM ( WordFM* fm,
562 fm
563 fm->kCmp = kCmp;
564 fm->alloc_nofail = alloc_nofail;
565 fm->cc = cc;
566 fm->dealloc = dealloc;
567 fm->stackTop = 0;
584 WordFM* fm = alloc_nofail(cc, sizeof(WordFM));
585 tl_assert(fm);
586 initFM(fm, alloc_nofail, cc, dealloc, kCmp);
587 return fm;
609 /* Free up the FM. If kFin is non-NULL, it is applied to keys
610 before the FM is deleted; ditto with vFin for vals. */
611 void VG_(deleteFM) ( WordFM* fm, void(*kFin)(UWord), void(*vFin)(UWord) )
613 void(*dealloc)(void*) = fm->dealloc;
614 avl_free( fm->root, kFin, vFin, dealloc );
615 VG_(memset)(fm, 0, sizeof(WordFM) );
616 dealloc(fm);
619 /* Add (k,v) to fm. */
620 Bool VG_(addToFM) ( WordFM* fm, UWord k, UWord v )
624 node = fm->alloc_nofail( fm->cc, sizeof(AvlNode) );
629 avl_insert_wrk( &fm->root, &oldV, node, fm->kCmp );
630 //if (oldV.b && fm->vFin)
631 // fm->vFin( oldV.w );
633 fm->dealloc(node);
637 // Delete key from fm, returning associated key and val if found
638 Bool VG_(delFromFM) ( WordFM* fm,
641 AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
643 avl_remove_wrk( &fm->root, node, fm->kCmp );
648 fm->dealloc(node);
655 // Look up in fm, assigning found key & val at spec'd addresses
656 Bool VG_(lookupFM) ( WordFM* fm,
659 AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
672 Bool VG_(findBoundsFM)( WordFM* fm,
680 where <= is as defined by fm->kCmp. */
681 return avl_find_bounds( fm->root, kMinP, vMinP,
685 key, fm->kCmp );
689 UWord VG_(sizeFM) ( WordFM* fm )
692 return fm->root ? size_avl_nonNull( fm->root ) : 0;
696 //Bool VG_(isEmptyFM)( WordFM* fm )
698 // return fm->root ? False : True;
701 // set up FM for iteration
702 void VG_(initIterFM) ( WordFM* fm )
704 tl_assert(fm);
705 stackClear(fm);
706 if (fm->root)
707 stackPush(fm, fm->root, 1);
710 // set up FM for iteration so that the first key subsequently produced
714 void VG_(initIterAtFM) ( WordFM* fm, UWord start_at )
721 tl_assert(fm);
722 stackClear(fm);
724 if (!fm->root)
729 t = fm->root;
735 = fm->kCmp ? /*boxed*/ fm->kCmp( t->key, start_at )
741 stackPush(fm, t, 2);
749 stackPush(fm, t, 2);
753 if (stackPop(fm, &n, &i)) {
757 stackPush(fm, n, 3);
762 // get next key/val pair. Will tl_assert if fm has been modified
763 // or looked up in since initIter{,At}FM was called.
764 Bool VG_(nextIterFM) ( WordFM* fm, /*OUT*/UWord* pKey, /*OUT*/UWord* pVal )
769 tl_assert(fm);
775 while (stackPop(fm, &n, &i)) {
778 stackPush(fm, n, 2);
779 /* if (n->child[0]) stackPush(fm, n->child[0], 1); */
783 stackPush(fm, n, 3);
788 /* if (n->child[1]) stackPush(fm, n->child[1], 1); */
801 void VG_(doneIterFM) ( WordFM* fm )
805 WordFM* VG_(dopyFM) ( WordFM* fm, UWord(*dopyK)(UWord), UWord(*dopyV)(UWord) )
809 /* can't clone the fm whilst iterating on it */
810 tl_assert(fm->stackTop == 0);
812 nyu = fm->alloc_nofail( fm->cc, sizeof(WordFM) );
815 *nyu = *fm;
817 fm->stackTop = 0;
818 VG_(memset)(fm->nodeStack, 0, sizeof(fm->nodeStack));
819 VG_(memset)(fm->numStack, 0, sizeof(fm->numStack));
823 fm->alloc_nofail, fm->cc );
849 WordFM* fm;
857 bag->fm = VG_(newFM)( alloc_nofail, cc, dealloc, NULL );
863 void (*dealloc)(void*) = bag->fm->dealloc;
864 VG_(deleteFM)( bag->fm, NULL, NULL );
872 if (VG_(lookupFM)(bag->fm, &key, &count, w)) {
875 VG_(addToFM)(bag->fm, w, count+1);
877 VG_(addToFM)(bag->fm, w, 1);
884 if (VG_(lookupFM)( bag->fm, &key, &count, w)) {
895 return VG_(sizeFM)( bag->fm );
911 if (bag->fm->root)
912 return sizeTotalBag_wrk(bag->fm->root);
920 if (VG_(lookupFM)(bag->fm, &key, &count, w)) {
924 VG_(addToFM)(bag->fm, w, count-1);
927 VG_(delFromFM)( bag->fm, NULL, NULL, w );
937 return VG_(sizeFM)(bag->fm) == 0;
943 if (VG_(sizeFM)(bag->fm) != 1)
945 nd = bag->fm->root;
956 AvlNode* nd = bag->fm->root;
964 VG_(initIterFM)(bag->fm);
969 return VG_(nextIterFM)( bag->fm, pVal, pCount );
974 VG_(doneIterFM)( bag->fm );