From: Julian Seward Date: Fri, 24 Jul 2009 08:11:39 +0000 (+0000) Subject: New methods in WordXA: X-Git-Tag: svn/VALGRIND_3_5_0~265 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5653b12bb2b4049f2fb67f9730ea8048bafc3a8d;p=thirdparty%2Fvalgrind.git New methods in WordXA: * lookupXA_UNSAFE -- binary search in array without being forced to sortXA it first -- dangerous because if the array isn't in order then the lookup can loop forever * dropHeadXA -- drop the first N elements (kinda like dropTailXA, but unfortunately O(N) not O(1)), so that xarrays can be used to implement FIFOs, after a fashion. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10583 --- diff --git a/coregrind/m_xarray.c b/coregrind/m_xarray.c index 45a1e593eb..c00391b010 100644 --- a/coregrind/m_xarray.c +++ b/coregrind/m_xarray.c @@ -225,14 +225,14 @@ void VG_(sortXA) ( XArray* xao ) xa->sorted = True; } -Bool VG_(lookupXA) ( XArray* xao, void* key, Word* first, Word* last ) +Bool VG_(lookupXA_UNSAFE) ( XArray* xao, void* key, + /*OUT*/Word* first, /*OUT*/Word* last, + Int(*cmpFn)(void*,void*) ) { Word lo, mid, hi, cres; void* midv; struct _XArray* xa = (struct _XArray*)xao; vg_assert(xa); - vg_assert(xa->cmpFn); - vg_assert(xa->sorted); vg_assert(first); vg_assert(last); lo = 0; @@ -242,23 +242,33 @@ Bool VG_(lookupXA) ( XArray* xao, void* key, Word* first, Word* last ) if (lo > hi) return False; /* not found */ mid = (lo + hi) / 2; midv = VG_(indexXA)( xa, mid ); - cres = xa->cmpFn( key, midv ); + cres = cmpFn( key, midv ); if (cres < 0) { hi = mid-1; continue; } if (cres > 0) { lo = mid+1; continue; } /* Found it, at mid. See how far we can expand this. */ - vg_assert(xa->cmpFn( key, VG_(indexXA)(xa, lo) ) >= 0); - vg_assert(xa->cmpFn( key, VG_(indexXA)(xa, hi) ) <= 0); + vg_assert(cmpFn( key, VG_(indexXA)(xa, lo) ) >= 0); + vg_assert(cmpFn( key, VG_(indexXA)(xa, hi) ) <= 0); *first = *last = mid; while (*first > 0 - && 0 == xa->cmpFn( key, VG_(indexXA)(xa, (*first)-1))) + && 0 == cmpFn( key, VG_(indexXA)(xa, (*first)-1))) (*first)--; while (*last < xa->usedsizeE-1 - && 0 == xa->cmpFn( key, VG_(indexXA)(xa, (*last)+1))) + && 0 == cmpFn( key, VG_(indexXA)(xa, (*last)+1))) (*last)++; return True; } } +Bool VG_(lookupXA) ( XArray* xao, void* key, + /*OUT*/Word* first, /*OUT*/Word* last ) +{ + struct _XArray* xa = (struct _XArray*)xao; + vg_assert(xa); + vg_assert(xa->cmpFn); + vg_assert(xa->sorted); + return VG_(lookupXA_UNSAFE)(xao, key, first, last, xa->cmpFn); +} + Word VG_(sizeXA) ( XArray* xao ) { struct _XArray* xa = (struct _XArray*)xao; @@ -275,6 +285,27 @@ void VG_(dropTailXA) ( XArray* xao, Word n ) xa->usedsizeE -= n; } +void VG_(dropHeadXA) ( XArray* xao, Word n ) +{ + struct _XArray* xa = (struct _XArray*)xao; + vg_assert(xa); + vg_assert(n >= 0); + vg_assert(n <= xa->usedsizeE); + if (n == 0) { + return; + } + if (n == xa->usedsizeE) { + xa->usedsizeE = 0; + return; + } + vg_assert(n > 0); + vg_assert(xa->usedsizeE - n > 0); + VG_(memcpy)( (char*)xa->arr, + ((char*)xa->arr) + n * xa->elemSzB, + (xa->usedsizeE - n) * xa->elemSzB ); + xa->usedsizeE -= n; +} + /*--------------------------------------------------------------------*/ /*--- end m_xarray.c ---*/