diff options
author | Andy Wingo <wingo@pobox.com> | 2020-04-15 22:14:25 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2020-04-15 22:14:25 +0200 |
commit | d7fea134530e552e15732fba01257cf6fba10fec (patch) | |
tree | 92c4c938c414fcdb13187fc576a56f6ba3ffafb8 /libguile/bitvectors.c | |
parent | 8110061e647134ab9071ecb5ce59b69b4ed6ed35 (diff) | |
download | guile-d7fea134530e552e15732fba01257cf6fba10fec.tar.gz |
bitvector-set-all-bits! / bitvector-clear-all-bits! replace bitvector-fill!
* NEWS: Add entry.
* doc/ref/api-data.texi (Bit Vectors): Update.
* libguile/bitvectors.h:
* libguile/bitvectors.c (scm_c_bitvector_set_all_bits_x)
(scm_c_bitvector_clear_all_bits_x): New functions.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_bitvector_fill_x): Deprecate.
* module/ice-9/sandbox.scm (mutable-bitvector-bindings): Replace
bitvector-fill! with bitvector-set-all-bits! /
bitvector-clear-all-bits!.
* module/system/vm/disassembler.scm (static-opcode-set): Use
bitvector-set-bit!.
* module/system/vm/frame.scm (available-bindings): Use the new
interfaces.
* test-suite/tests/bitvectors.test: Update.
Diffstat (limited to 'libguile/bitvectors.c')
-rw-r--r-- | libguile/bitvectors.c | 87 |
1 files changed, 45 insertions, 42 deletions
diff --git a/libguile/bitvectors.c b/libguile/bitvectors.c index 87ad6e84a..077bc556c 100644 --- a/libguile/bitvectors.c +++ b/libguile/bitvectors.c @@ -149,10 +149,10 @@ scm_c_make_bitvector (size_t len, SCM fill) "bitvector"); res = scm_double_cell (scm_tc7_bitvector, len, (scm_t_bits)bits, 0); - if (!SCM_UNBNDP (fill)) - scm_bitvector_fill_x (res, fill); + if (SCM_UNBNDP (fill) || !scm_is_true (fill)) + scm_c_bitvector_clear_all_bits_x (res); else - memset (bits, 0, sizeof (uint32_t) * word_len); + scm_c_bitvector_set_all_bits_x (res); return res; } @@ -344,56 +344,59 @@ SCM_DEFINE_STATIC (scm_bitvector_clear_bit_x, "bitvector-clear-bit!", 2, 0, 0, } #undef FUNC_NAME -SCM_DEFINE (scm_bitvector_fill_x, "bitvector-fill!", 2, 0, 0, - (SCM vec, SCM val), - "Set all elements of the bitvector\n" - "@var{vec} when @var{val} is true, else clear them.") -#define FUNC_NAME s_scm_bitvector_fill_x +void +scm_c_bitvector_set_all_bits_x (SCM bv) +#define FUNC_NAME "bitvector-set-all-bits!" { - if (IS_MUTABLE_BITVECTOR (vec)) - { - size_t len = BITVECTOR_LENGTH (vec); - - if (len > 0) - { - uint32_t *bits = BITVECTOR_BITS (vec); - size_t word_len = (len + 31) / 32; - uint32_t last_mask = ((uint32_t)-1) >> (32*word_len - len); + VALIDATE_MUTABLE_BITVECTOR (1, bv); + size_t len = BITVECTOR_LENGTH (bv); - if (scm_is_true (val)) - { - memset (bits, 0xFF, sizeof(uint32_t)*(word_len-1)); - bits[word_len-1] |= last_mask; - } - else - { - memset (bits, 0x00, sizeof(uint32_t)*(word_len-1)); - bits[word_len-1] &= ~last_mask; - } - } - } - else + if (len > 0) { - scm_t_array_handle handle; - size_t off, len; - ssize_t inc; + uint32_t *bits = BITVECTOR_BITS (bv); + size_t word_len = (len + 31) / 32; + uint32_t last_mask = ((uint32_t)-1) >> (32*word_len - len); - scm_bitvector_writable_elements (vec, &handle, &off, &len, &inc); + memset (bits, 0xFF, sizeof(uint32_t)*(word_len-1)); + bits[word_len-1] |= last_mask; + } +} +#undef FUNC_NAME - scm_c_issue_deprecation_warning - ("Using bitvector-fill! on arrays is deprecated. " - "Use array-set! instead."); +void +scm_c_bitvector_clear_all_bits_x (SCM bv) +#define FUNC_NAME "bitvector-clear-all-bits!" +{ + VALIDATE_MUTABLE_BITVECTOR (1, bv); + size_t len = BITVECTOR_LENGTH (bv); - size_t i; - for (i = 0; i < len; i++) - scm_array_handle_set (&handle, i*inc, val); + if (len > 0) + { + uint32_t *bits = BITVECTOR_BITS (bv); + size_t word_len = (len + 31) / 32; + uint32_t last_mask = ((uint32_t)-1) >> (32*word_len - len); - scm_array_handle_release (&handle); + memset (bits, 0x00, sizeof(uint32_t)*(word_len-1)); + bits[word_len-1] &= ~last_mask; } +} +#undef FUNC_NAME +SCM_DEFINE_STATIC (scm_bitvector_set_all_bits_x, + "bitvector-set-all-bits!", 1, 0, 0, (SCM vec), + "Set all elements of the bitvector @var{vec}.") +{ + scm_c_bitvector_set_all_bits_x (vec); + return SCM_UNSPECIFIED; +} + +SCM_DEFINE_STATIC (scm_bitvector_clear_all_bits_x, + "bitvector-clear-all-bits!", 1, 0, 0, (SCM vec), + "Clear all elements of the bitvector @var{vec}.") +{ + scm_c_bitvector_clear_all_bits_x (vec); return SCM_UNSPECIFIED; } -#undef FUNC_NAME SCM_DEFINE (scm_list_to_bitvector, "list->bitvector", 1, 0, 0, (SCM list), |