Commit 49718491 authored by Michael Beck's avatar Michael Beck
Browse files

Removed old and unused support for sorted arrays.

[r28241]
parent 0a805b86
......@@ -263,111 +263,6 @@ FIRM_API void ir_verify_arr(const void *elts);
#define ARR_ELTS_OFFS offsetof(ir_arr_descr, v.elts)
#define ARR_DESCR(elts) ((ir_arr_descr *)(void *)((char *)(elts) - ARR_ELTS_OFFS))
/*
____ _ _ _
/ ___| ___ _ __| |_ ___ __| | / \ _ __ _ __ __ _ _ _ ___
\___ \ / _ \| '__| __/ _ \/ _` | / _ \ | '__| '__/ _` | | | / __|
___) | (_) | | | || __/ (_| | / ___ \| | | | | (_| | |_| \__ \
|____/ \___/|_| \__\___|\__,_| /_/ \_\_| |_| \__,_|\__, |___/
|___/
*/
typedef int (ir_arr_cmp_func_t)(const void *a, const void *b);
/**
* Do a binary search in an array.
* @param arr The array.
* @param elm_size The size of an array element.
* @param cmp A comparison function for two array elements (see qsort(3) for example).
* @param elm A pointer to the element we are looking for.
* @return This is somewhat tricky. Let <code>res</code> be the return value.
* If the return value is negative, then <code>elm</code> was not in the array
* but <code>-res - 1</code> gives the proper location where it should be inserted.
* If <code>res >= 0</code> then the element is in the array and <code>res</code>
* represents its index.
* That allows for testing membership and finding proper insertion indices.
* @note The differences to bsearch(3) which does not give proper insert locations
* in the case that the element is not conatined in the array.
*/
static inline int ir_arr_bsearch(const void *arr, size_t elm_size, ir_arr_cmp_func_t *cmp, const void *elm)
{
int hi = ARR_LEN(arr);
int lo = 0;
while(lo < hi) {
int md = lo + ((hi - lo) >> 1);
int res = cmp((char *) arr + md * elm_size, elm);
if(res < 0)
lo = md + 1;
else if(res > 0)
hi = md;
else
return md;
}
return -(lo + 1);
}
#define ARR_SET_INSERT(arr, cmp, elm) \
do { \
int idx = ir_arr_bsearch((arr), sizeof((arr)[0]), (cmp), (elm)); \
if (idx < 0) { \
idx = -idx - 1; \
memmove(&(arr)[idx+1], &(arr)[idx], sizeof((arr)[0]) * (ARR_DESCR((arr))->nelts - idx)); \
(arr)[idx] = *(elm); \
++ARR_DESCR((arr))->nelts; \
} \
} while(0)
#define ARR_SET_INSERT_EXT(type, arr, cmp, elm) \
do { \
int idx = ir_arr_bsearch((arr), sizeof((arr)[0]), (cmp), (elm)); \
if (idx < 0) { \
int len = ARR_LEN(arr); \
idx = -idx - 1; \
ARR_EXTO(type, arr, len + 1); \
memmove(&(arr)[idx+1], &(arr)[idx], sizeof((arr)[0]) * (len - idx)); \
(arr)[idx] = *(elm); \
} \
} while(0)
#define ARR_SET_REMOVE(arr, cmp, elm) \
do { \
int idx = ir_arr_bsearch((arr), sizeof((arr)[0]), (cmp), (elm)); \
if (idx >= 0) { \
--ARR_DESCR((arr))->nelts; \
memmove(&(arr)[idx], &(arr)[idx+1], sizeof((arr)[0]) * (ARR_DESCR((arr))->nelts - idx)); \
} \
} while(0)
/**
* Return the index of an element in an array set.
* To check for containment, use the expression:
* (ARR_SET_GET_IDX(arr, cmp, elm) >= 0)
*
* @return The index or some value < 0 if the element was not in the set.
*/
#define ARR_SET_GET_IDX(arr, cmp, elm) \
(ARR_VRFY((arr)), ir_arr_bsearch((arr), sizeof((arr)[0]), cmp, (elm)))
#ifdef __GNUC__
#define ARR_SET_GET(arr, cmp, elm) \
({ int idx = ARR_SET_GET_IDX(arr, cmp, elm); idx >= 0 ? &(arr)[idx] : NULL; })
#else
#define ARR_SET_GET(arr, cmp, elm) \
(ARR_SET_GET_IDX(arr, cmp, elm) >= 0 ? &(arr)[ARR_SET_GET_IDX(arr, cmp, elm)] : NULL)
#endif
#define ARR_SET_CONTAINS(arr, cmp, elm) \
(ARR_SET_GET_IDX((arr), (cmp), (elm)) >= 0)
/**
* Reset the array set.
* This just initializes the size to zero but does not wipe out any element.
*/
#define ARR_SET_CLEAR(arr) ARR_SHRINKLEN(arr, 0)
#include "../end.h"
#endif
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment