Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
49718491
Commit
49718491
authored
Jan 08, 2011
by
Michael Beck
Browse files
Removed old and unused support for sorted arrays.
[r28241]
parent
0a805b86
Changes
1
Hide whitespace changes
Inline
Side-by-side
include/libfirm/adt/array.h
View file @
49718491
...
...
@@ -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
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment