summaryrefslogtreecommitdiff
path: root/libguile/bitvectors.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2020-04-15 22:14:25 +0200
committerAndy Wingo <wingo@pobox.com>2020-04-15 22:14:25 +0200
commitd7fea134530e552e15732fba01257cf6fba10fec (patch)
tree92c4c938c414fcdb13187fc576a56f6ba3ffafb8 /libguile/bitvectors.c
parent8110061e647134ab9071ecb5ce59b69b4ed6ed35 (diff)
downloadguile-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.c87
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),