LAL  7.5.0.1-b72065a
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 
7 static _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 
12 static _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 
17 int XLALIsSorted(void *base, size_t nobj, size_t size, void *params, int (*compar)(void *, const void *, const void *))
18 {
19  char *p = base;
20  XLAL_CHECK(base, XLAL_EFAULT);
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 
31 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)
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;
36  XLAL_CHECK(base, XLAL_EFAULT);
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