wojiaocbj

bsearch extension

Apr 16th, 2022
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.96 KB | None | 0 0
  1. void *lowerbound(void *key, void *base, size_t count, size_t itemsize, int(*compare)(const void *, const void *)){
  2.     size_t lo = 0, hi = count - 1, mid = 0;
  3.     if(compare(key, (char *)base + hi * itemsize) > 0){
  4.         return (char *)base + count * itemsize;
  5.     }
  6.     char *pmid = 0;
  7.     while(lo < hi){
  8.         mid = (lo + hi) >> 1;
  9.         pmid = ((char *)base) + mid * itemsize;
  10.         if(compare(pmid, key) < 0){
  11.             lo = mid + 1;
  12.         }
  13.         else{
  14.             hi = mid;
  15.         }
  16.     }
  17.     return (char *)base + lo * itemsize;
  18. }
  19. void *upperbound(void *key, void *base, size_t count, size_t itemsize, int(*compare)(const void *, const void *)){
  20.     size_t lo = 0, hi = count - 1, mid;
  21.     if(compare(key, (char *)base + hi * itemsize) >= 0){
  22.         return (char *)base + count * itemsize;
  23.     }
  24.     char *pmid = 0;
  25.     while(lo < hi){
  26.         mid = (lo + hi) >> 1;
  27.         char *pmid = ((char *)base) + mid * itemsize;
  28.         if(compare(pmid, key) <= 0){
  29.             lo = mid + 1;
  30.         }
  31.         else{
  32.             hi = mid;
  33.         }
  34.     }
  35.     return (char *)base + lo * itemsize;
  36. }
Advertisement
Add Comment
Please, Sign In to add comment