diff options
Diffstat (limited to 'kit/lower_bound.h')
-rw-r--r-- | kit/lower_bound.h | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/kit/lower_bound.h b/kit/lower_bound.h new file mode 100644 index 0000000..eb437ed --- /dev/null +++ b/kit/lower_bound.h @@ -0,0 +1,42 @@ +#ifndef KIT_LOWER_BOUND_H +#define KIT_LOWER_BOUND_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define KIT_LOWER_BOUND_INL(return_val, size, ...) \ + do { \ + i64 position_ = 0; \ + i64 count_ = (size); \ + while (count_ > 0) { \ + i64 delta_ = count_ / 2; \ + i64 index_ = position_ + delta_; \ + if (__VA_ARGS__) { \ + position_ += delta_ + 1; \ + count_ -= delta_ + 1; \ + } else \ + count_ = delta_; \ + } \ + (return_val) = position_; \ + } while (0) + +#define KIT_LOWER_BOUND(return_val, array, value, op) \ + KIT_LOWER_BOUND_INL(return_val, (array).size, \ + (op) ((array).values[index_], (value))) + +#define KIT_LOWER_BOUND_REF(return_val, array, value, op) \ + KIT_LOWER_BOUND_INL(return_val, (array).size, \ + (op) ((array).values + index_, (value))) + +#ifdef __cplusplus +} +#endif + +#define LOWER_BOUND_INL KIT_LOWER_BOUND_INL +#define LOWER_BOUND KIT_LOWER_BOUND +#define LOWER_BOUND_REF KIT_LOWER_BOUND_REF + +#endif |