diff options
author | Andy Wingo <wingo@pobox.com> | 2020-04-14 22:08:45 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2020-04-14 22:18:02 +0200 |
commit | d804177be4525feb517feb63ca09502d187fc016 (patch) | |
tree | fe99bbf9aa760874d717c8e9d7ee693f2c0d7e8d /libguile/bitvectors.c | |
parent | ff9979b6bc6a72e03085d7ce21fd3f8f1bd39b64 (diff) | |
download | guile-d804177be4525feb517feb63ca09502d187fc016.tar.gz |
bitvector-bit-set? / bitvector-bit-clear? replace bitvector-ref
This is an opportunity to make a new interface that can be more
efficient in 3.0 (because no generic array support), easier to read (no
need for 'not'), and more consistent with other bitvector interfaces.
* NEWS: Add entry.
* doc/ref/api-data.texi (Bit Vectors): Update.
* libguile/array-handle.h (bitvector_ref, scm_array_get_handle): Adapt
to bitvector changes.
* libguile/bitvectors.h:
* libguile/bitvectors.c (scm_c_bitvector_bit_is_set)
(scm_c_bitvector_bit_is_clear): New functions.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_bitvector_ref): Deprecate.
* module/ice-9/sandbox.scm (bitvector-bindings): Replace
bitvector-ref with bitvector-bit-set? / bitvector-bit-clear?.
* module/system/vm/disassembler.scm (instruction-has-fallthrough): Use
bitvector-bit-clear?.
* test-suite/tests/bitvectors.test: Update.
Diffstat (limited to 'libguile/bitvectors.c')
-rw-r--r-- | libguile/bitvectors.c | 67 |
1 files changed, 32 insertions, 35 deletions
diff --git a/libguile/bitvectors.c b/libguile/bitvectors.c index 40da4757e..9755f24d8 100644 --- a/libguile/bitvectors.c +++ b/libguile/bitvectors.c @@ -254,45 +254,42 @@ scm_bitvector_writable_elements (SCM vec, return (uint32_t *) ret; } -SCM -scm_c_bitvector_ref (SCM vec, size_t idx) +int +scm_c_bitvector_bit_is_set (SCM vec, size_t idx) { - const uint32_t *bits; + if (!IS_BITVECTOR (vec)) + scm_wrong_type_arg_msg (NULL, 0, vec, "bitvector"); + if (idx >= BITVECTOR_LENGTH (vec)) + scm_out_of_range (NULL, scm_from_size_t (idx)); - if (IS_BITVECTOR (vec)) - { - if (idx >= BITVECTOR_LENGTH (vec)) - scm_out_of_range (NULL, scm_from_size_t (idx)); - bits = BITVECTOR_BITS(vec); - return scm_from_bool (bits[idx/32] & (1L << (idx%32))); - } - else - { - SCM res; - scm_t_array_handle handle; - size_t len, off; - ssize_t inc; - - bits = scm_bitvector_elements (vec, &handle, &off, &len, &inc); - scm_c_issue_deprecation_warning - ("Using bitvector-ref on arrays is deprecated. " - "Use array-ref instead."); - if (idx >= len) - scm_out_of_range (NULL, scm_from_size_t (idx)); - idx = idx*inc + off; - res = scm_from_bool (bits[idx/32] & (1L << (idx%32))); - scm_array_handle_release (&handle); - return res; - } + const uint32_t *bits = BITVECTOR_BITS (vec); + return (bits[idx/32] & (1L << (idx%32))) ? 1 : 0; } -SCM_DEFINE (scm_bitvector_ref, "bitvector-ref", 2, 0, 0, - (SCM vec, SCM idx), - "Return the element at index @var{idx} of the bitvector\n" - "@var{vec}.") -#define FUNC_NAME s_scm_bitvector_ref +int +scm_c_bitvector_bit_is_clear (SCM vec, size_t idx) +{ + return !scm_c_bitvector_bit_is_set (vec, idx); +} + +SCM_DEFINE_STATIC (scm_bitvector_bit_set_p, "bitvector-bit-set?", 2, 0, 0, + (SCM vec, SCM idx), + "Return @code{#t} if the bit at index @var{idx} of the \n" + "bitvector @var{vec} is set, or @code{#f} otherwise.") +#define FUNC_NAME s_scm_bitvector_bit_set_p +{ + return scm_from_bool (scm_c_bitvector_bit_is_set (vec, scm_to_size_t (idx))); +} +#undef FUNC_NAME + +SCM_DEFINE_STATIC (scm_bitvector_bit_clear_p, "bitvector-bit-clear?", 2, 0, 0, + (SCM vec, SCM idx), + "Return @code{#t} if the bit at index @var{idx} of the \n" + "bitvector @var{vec} is clear (unset), or @code{#f} otherwise.") +#define FUNC_NAME s_scm_bitvector_bit_clear_p { - return scm_c_bitvector_ref (vec, scm_to_size_t (idx)); + return scm_from_bool + (scm_c_bitvector_bit_is_clear (vec, scm_to_size_t (idx))); } #undef FUNC_NAME @@ -724,7 +721,7 @@ SCM_DEFINE (scm_bit_count_star, "bit-count*", 3, 0, 0, { size_t kv_len = BITVECTOR_LENGTH (kv); for (size_t i = 0; i < kv_len; i++) - if (scm_is_true (scm_c_bitvector_ref (kv, i))) + if (scm_c_bitvector_bit_is_set (kv, i)) { SCM elt = scm_array_handle_ref (&v_handle, i*v_inc); if ((bit && scm_is_true (elt)) || (!bit && scm_is_false (elt))) |