summaryrefslogtreecommitdiff
path: root/libguile/bitvectors.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2020-04-14 22:08:45 +0200
committerAndy Wingo <wingo@pobox.com>2020-04-14 22:18:02 +0200
commitd804177be4525feb517feb63ca09502d187fc016 (patch)
treefe99bbf9aa760874d717c8e9d7ee693f2c0d7e8d /libguile/bitvectors.c
parentff9979b6bc6a72e03085d7ce21fd3f8f1bd39b64 (diff)
downloadguile-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.c67
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)))