Loading [MathJax]/extensions/TeX/AMSsymbols.js
LAL 7.7.0.1-3a66518
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
SearchSorted.c
Go to the documentation of this file.
1#include <stddef.h>
2#include <sys/types.h>
3#include <lal/LALStddef.h>
4#include <lal/LALStdlib.h>
5#include <lal/Sort.h>
6
7static _LAL_INLINE_ int lt(void *params, const void *a, const void *b, int (*compar)(void *, const void *, const void *))
8{
9 return compar(params, a, b) < 0;
10}
11
12static _LAL_INLINE_ int lte(void *params, const void *a, const void *b, int (*compar)(void *, const void *, const void *))
13{
14 return compar(params, a, b) <= 0;
15}
16
17int XLALIsSorted(void *base, size_t nobj, size_t size, void *params, int (*compar)(void *, const void *, const void *))
18{
19 char *p = base;
21 XLAL_CHECK(compar, XLAL_EFAULT);
22 XLAL_CHECK((ssize_t)size > 0, XLAL_EINVAL);
23 while (nobj-- > 1)
24 if (compar(params, p + size, p) < 0)
25 return 0;
26 else
27 p += size;
28 return 1;
29}
30
31ssize_t XLALSearchSorted(const void *key, const void *base, size_t nobj, size_t size, void *params, int (*compar)(void *, const void *, const void *), int side)
32{
33 size_t imin = 0;
34 size_t imax = nobj;
35 int (*cmp)(void *, const void *, const void *, int (*)(void *, const void *, const void *)) = side > 0 ? lte : lt;
37 XLAL_CHECK(compar, XLAL_EFAULT);
38 XLAL_CHECK((ssize_t)size > 0, XLAL_EINVAL);
39 while (imin < imax) {
40 size_t i = imin + ((imax - imin) >> 1);
41 if (cmp(params, (const char *)base + i * size, key, compar))
42 imin = i + 1;
43 else
44 imax = i;
45 }
46 if (side || (imin < nobj && compar(params, (const char *)base + imin * size, key) == 0))
47 return imin;
48 return -1; /* entry not found */
49}
#define _LAL_INLINE_
Definition: LALStddef.h:36
static _LAL_INLINE_ int lt(void *params, const void *a, const void *b, int(*compar)(void *, const void *, const void *))
Definition: SearchSorted.c:7
static _LAL_INLINE_ int lte(void *params, const void *a, const void *b, int(*compar)(void *, const void *, const void *))
Definition: SearchSorted.c:12
static int cmp(REAL4Sequence *a, REAL4Sequence *b)
Definition: SequenceTest.c:62
static const INT4 a
Definition: Random.c:79
int XLALIsSorted(void *base, size_t nobj, size_t size, void *params, int(*compar)(void *, const void *, const void *))
Definition: SearchSorted.c:17
ssize_t XLALSearchSorted(const void *key, const void *base, size_t nobj, size_t size, void *params, int(*compar)(void *, const void *, const void *), int side)
Definition: SearchSorted.c:31
#define XLAL_CHECK(assertion,...)
Macro to test an assertion and invoke a failure if it is not true in a function that returns an integ...
Definition: XLALError.h:810
@ XLAL_EFAULT
Invalid pointer.
Definition: XLALError.h:408
@ XLAL_EINVAL
Invalid argument.
Definition: XLALError.h:409