summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/kit/lower_bound.h49
-rw-r--r--source/kit/move_back.h61
2 files changed, 47 insertions, 63 deletions
diff --git a/source/kit/lower_bound.h b/source/kit/lower_bound.h
index e87794f..f40c918 100644
--- a/source/kit/lower_bound.h
+++ b/source/kit/lower_bound.h
@@ -5,37 +5,32 @@
extern "C" {
#endif
-#define KIT_LOWER_BOUND(return_val, array, value, op) \
- do { \
- ptrdiff_t position_ = 0; \
- ptrdiff_t count_ = (array).size; \
- while (count_ > 0) { \
- ptrdiff_t delta_ = count_ / 2; \
- if ((op) ((array).values[position_ + delta_], (value))) { \
- position_ += delta_ + 1; \
- count_ -= delta_ + 1; \
- } else \
- count_ = delta_; \
- } \
- (return_val) = position_; \
+#define KIT_LOWER_BOUND_INL(return_val, size, ...) \
+ do { \
+ ptrdiff_t position_ = 0; \
+ ptrdiff_t count_ = (size); \
+ while (count_ > 0) { \
+ ptrdiff_t const delta_ = count_ / 2; \
+ ptrdiff_t const index_ = position_ + delta_; \
+ if (__VA_ARGS__) { \
+ position_ += delta_ + 1; \
+ count_ -= delta_ + 1; \
+ } else \
+ count_ = delta_; \
+ } \
+ (return_val) = position_; \
} while (0)
-#define KIT_LOWER_BOUND_REF(return_val, array, value, op) \
- do { \
- ptrdiff_t position_ = 0; \
- ptrdiff_t count_ = (array).size; \
- while (count_ > 0) { \
- ptrdiff_t delta_ = count_ / 2; \
- if ((op) ((array).values + position_ + delta_, (value))) { \
- 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)))
#ifndef KIT_DISABLE_SHORT_NAMES
+# define LOWER_BOUND_INL KIT_LOWER_BOUND_INL
# define LOWER_BOUND KIT_LOWER_BOUND
# define LOWER_BOUND_REF KIT_LOWER_BOUND_REF
#endif
diff --git a/source/kit/move_back.h b/source/kit/move_back.h
index cf9cb70..4bcc7ba 100644
--- a/source/kit/move_back.h
+++ b/source/kit/move_back.h
@@ -7,47 +7,36 @@
extern "C" {
#endif
-#define KIT_MOVE_BACK(new_size, array, value, cond) \
- do { \
- ptrdiff_t end_ = (array).size; \
- unsigned char temp_[sizeof *(array).values]; \
- for (ptrdiff_t i_ = 0; i_ < end_;) { \
- if ((cond) ((array).values[i_], (value))) { \
- end_--; \
- if (i_ != end_) { \
- memcpy(temp_, (array).values + end_, \
- sizeof *(array).values); \
- (array).values[end_] = (array).values[i_]; \
- memcpy((array).values + i_, temp_, \
- sizeof *(array).values); \
- } \
- } else \
- i_++; \
- } \
- (new_size) = end_; \
+#define KIT_MOVE_BACK_INL(new_size, array, ...) \
+ do { \
+ ptrdiff_t end_ = (array).size; \
+ unsigned char temp_[sizeof *(array).values]; \
+ for (ptrdiff_t index_ = 0; index_ < end_;) { \
+ if (__VA_ARGS__) { \
+ end_--; \
+ if (index_ != end_) { \
+ memcpy(temp_, (array).values + end_, \
+ sizeof *(array).values); \
+ (array).values[end_] = (array).values[index_]; \
+ memcpy((array).values + index_, temp_, \
+ sizeof *(array).values); \
+ } \
+ } else \
+ index_++; \
+ } \
+ (new_size) = end_; \
} while (0)
+#define KIT_MOVE_BACK(new_size, array, value, cond) \
+ KIT_MOVE_BACK_INL(new_size, array, \
+ (cond) ((array).values[index_], (value)))
+
#define KIT_MOVE_BACK_REF(new_size, array, value, cond) \
- do { \
- ptrdiff_t end_ = (array).size; \
- unsigned char temp_[sizeof *(array).values]; \
- for (ptrdiff_t i_ = 0; i_ < end_;) { \
- if ((cond) ((array).values + i_, (value))) { \
- end_--; \
- if (i_ != end_) { \
- memcpy(temp_, (array).values + end_, \
- sizeof *(array).values); \
- (array).values[end_] = (array).values[i_]; \
- memcpy((array).values + i_, temp_, \
- sizeof *(array).values); \
- } \
- } else \
- i_++; \
- } \
- (new_size) = end_; \
- } while (0)
+ KIT_MOVE_BACK_INL(new_size, array, \
+ (cond) ((array).values + index_, (value)))
#ifndef KIT_DISABLE_SHORT_NAMES
+# define MOVE_BACK_INL KIT_MOVE_BACK_INL
# define MOVE_BACK KIT_MOVE_BACK
# define MOVE_BACK_REF KIT_MOVE_BACK_REF
#endif