mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Add inline bsearch expansion.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2013-02-09 Ondřej Bílka <neleai@seznam.cz>
|
||||||
|
|
||||||
|
* bits/stdlib-bsearch.h: New file.
|
||||||
|
* stdlib/bsearch.c: Include bits/stdlib-bsearch.h.
|
||||||
|
* stdlib/stdlib.h (bsearch): Add inline bsearch.
|
||||||
|
|
||||||
2013-02-11 Roland McGrath <roland@hack.frob.com>
|
2013-02-11 Roland McGrath <roland@hack.frob.com>
|
||||||
|
|
||||||
* manual/conf.texi (General Limits): Fix SSIZE_MAX type to ssize_t.
|
* manual/conf.texi (General Limits): Fix SSIZE_MAX type to ssize_t.
|
||||||
|
43
bits/stdlib-bsearch.h
Normal file
43
bits/stdlib-bsearch.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/* Perform binary search - inline version.
|
||||||
|
Copyright (C) 1991-2013 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
__extern_inline void *
|
||||||
|
bsearch (const void *__key, const void *__base, size_t __nmemb, size_t __size,
|
||||||
|
__compar_fn_t __compar)
|
||||||
|
{
|
||||||
|
size_t __l, __u, __idx;
|
||||||
|
const void *__p;
|
||||||
|
int __comparison;
|
||||||
|
|
||||||
|
__l = 0;
|
||||||
|
__u = __nmemb;
|
||||||
|
while (__l < __u)
|
||||||
|
{
|
||||||
|
__idx = (__l + __u) / 2;
|
||||||
|
__p = (void *) (((const char *) __base) + (__idx * __size));
|
||||||
|
__comparison = (*__compar) (__key, __p);
|
||||||
|
if (__comparison < 0)
|
||||||
|
__u = __idx;
|
||||||
|
else if (__comparison > 0)
|
||||||
|
__l = __idx + 1;
|
||||||
|
else
|
||||||
|
return (void *) __p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
@ -17,32 +17,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#undef __extern_inline
|
||||||
/* Perform a binary search for KEY in BASE which has NMEMB elements
|
#define __extern_inline /* Empty, so we get a normal definition. */
|
||||||
of SIZE bytes each. The comparisons are done by (*COMPAR)(). */
|
#include <bits/stdlib-bsearch.h>
|
||||||
void *
|
|
||||||
bsearch (const void *key, const void *base, size_t nmemb, size_t size,
|
|
||||||
int (*compar) (const void *, const void *))
|
|
||||||
{
|
|
||||||
size_t l, u, idx;
|
|
||||||
const void *p;
|
|
||||||
int comparison;
|
|
||||||
|
|
||||||
l = 0;
|
|
||||||
u = nmemb;
|
|
||||||
while (l < u)
|
|
||||||
{
|
|
||||||
idx = (l + u) / 2;
|
|
||||||
p = (void *) (((const char *) base) + (idx * size));
|
|
||||||
comparison = (*compar) (key, p);
|
|
||||||
if (comparison < 0)
|
|
||||||
u = idx;
|
|
||||||
else if (comparison > 0)
|
|
||||||
l = idx + 1;
|
|
||||||
else
|
|
||||||
return (void *) p;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
libc_hidden_def (bsearch)
|
libc_hidden_def (bsearch)
|
||||||
|
@ -756,6 +756,10 @@ extern void *bsearch (const void *__key, const void *__base,
|
|||||||
size_t __nmemb, size_t __size, __compar_fn_t __compar)
|
size_t __nmemb, size_t __size, __compar_fn_t __compar)
|
||||||
__nonnull ((1, 2, 5)) __wur;
|
__nonnull ((1, 2, 5)) __wur;
|
||||||
|
|
||||||
|
#ifdef __USE_EXTERN_INLINES
|
||||||
|
# include <bits/stdlib-bsearch.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Sort NMEMB elements of BASE, of SIZE bytes each,
|
/* Sort NMEMB elements of BASE, of SIZE bytes each,
|
||||||
using COMPAR to perform the comparisons. */
|
using COMPAR to perform the comparisons. */
|
||||||
extern void qsort (void *__base, size_t __nmemb, size_t __size,
|
extern void qsort (void *__base, size_t __nmemb, size_t __size,
|
||||||
|
Reference in New Issue
Block a user