Prefer C-like interfaces for scm_c_bitvector_{set,clear}_bits_x

* libguile/bitvectors.h:
* libguile/bitvectors.c (scm_c_bitvector_set_bits_x)
  (scm_c_bitvector_clear_bits_x): Expose only C-like interfaces.  No
  need to have a SCM_UNDEFINED return.
* libguile/deprecated.c (scm_bit_set_star_x): Adapt.
* doc/ref/api-data.texi (Bit Vectors): Update.
This commit is contained in:
Andy Wingo 2020-04-23 21:30:24 +02:00
commit 8861af39ae
4 changed files with 68 additions and 63 deletions

View file

@ -590,19 +590,9 @@ SCM_DEFINE (scm_bitvector_position, "bitvector-position", 2, 1, 0,
}
#undef FUNC_NAME
SCM_DEFINE (scm_bitvector_set_bits_x, "bitvector-set-bits!", 2, 0, 0,
(SCM v, SCM bits),
"Update the bitvector @var{v} in place by performing a logical\n"
"OR of its bits with those of @var{bits}.\n"
"For example:\n"
"\n"
"@example\n"
"(define bv (bitvector-copy #*11000010))\n"
"(bitvector-set-bits! bv #*10010001)\n"
"bv\n"
"@result{} #*11010011\n"
"@end example")
#define FUNC_NAME s_scm_bitvector_set_bits_x
void
scm_c_bitvector_set_bits_x (SCM v, SCM bits)
#define FUNC_NAME "bitvector-set-bits!"
{
VALIDATE_MUTABLE_BITVECTOR (1, v);
VALIDATE_BITVECTOR (2, bits);
@ -625,24 +615,12 @@ SCM_DEFINE (scm_bitvector_set_bits_x, "bitvector-set-bits!", 2, 0, 0,
v_bits[i] |= kv_bits[i];
v_bits[i] |= kv_bits[i] & last_mask;
}
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
SCM_DEFINE (scm_bitvector_clear_bits_x, "bitvector-clear-bits!", 2, 0, 0,
(SCM v, SCM bits),
"Update the bitvector @var{v} in place by performing a logical\n"
"AND of its bits with the complement of those of @var{bits}.\n"
"For example:\n"
"\n"
"@example\n"
"(define bv (bitvector-copy #*11000010))\n"
"(bitvector-clear-bits! bv #*10010001)\n"
"bv\n"
"@result{} #*01000010\n"
"@end example")
#define FUNC_NAME s_scm_bitvector_clear_bits_x
void
scm_c_bitvector_clear_bits_x (SCM v, SCM bits)
#define FUNC_NAME "bitvector-clear-bits!"
{
VALIDATE_MUTABLE_BITVECTOR (1, v);
VALIDATE_BITVECTOR (2, bits);
@ -666,7 +644,43 @@ SCM_DEFINE (scm_bitvector_clear_bits_x, "bitvector-clear-bits!", 2, 0, 0,
v_bits[i] &= ~kv_bits[i];
v_bits[i] &= ~(kv_bits[i] & last_mask);
}
}
#undef FUNC_NAME
SCM_DEFINE_STATIC (scm_bitvector_set_bits_x, "bitvector-set-bits!", 2, 0, 0,
(SCM v, SCM bits),
"Update the bitvector @var{v} in place by performing a\n"
"logical OR of its bits with those of @var{bits}.\n"
"For example:\n"
"\n"
"@example\n"
"(define bv (bitvector-copy #*11000010))\n"
"(bitvector-set-bits! bv #*10010001)\n"
"bv\n"
"@result{} #*11010011\n"
"@end example")
#define FUNC_NAME s_scm_bitvector_set_bits_x
{
scm_c_bitvector_set_bits_x (v, bits);
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
SCM_DEFINE_STATIC (scm_bitvector_clear_bits_x, "bitvector-clear-bits!", 2, 0, 0,
(SCM v, SCM bits),
"Update the bitvector @var{v} in place by performing a\n"
"logical AND of its bits with the complement of those of\n"
"@var{bits}. For example:\n"
"\n"
"@example\n"
"(define bv (bitvector-copy #*11000010))\n"
"(bitvector-clear-bits! bv #*10010001)\n"
"bv\n"
"@result{} #*01000010\n"
"@end example")
#define FUNC_NAME s_scm_bitvector_clear_bits_x
{
scm_c_bitvector_clear_bits_x (v, bits);
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME

View file

@ -39,8 +39,6 @@ SCM_API SCM scm_list_to_bitvector (SCM list);
SCM_API SCM scm_bitvector_to_list (SCM vec);
SCM_API SCM scm_bitvector_position (SCM v, SCM item, SCM start);
SCM_API SCM scm_bitvector_set_bits_x (SCM v, SCM bits);
SCM_API SCM scm_bitvector_clear_bits_x (SCM v, SCM bits);
SCM_API int scm_is_bitvector (SCM obj);
SCM_API SCM scm_c_make_bitvector (size_t len, SCM fill);
@ -50,6 +48,8 @@ SCM_API int scm_c_bitvector_bit_is_set (SCM vec, size_t idx);
SCM_API int scm_c_bitvector_bit_is_clear (SCM vec, size_t idx);
SCM_API void scm_c_bitvector_set_bit_x (SCM vec, size_t idx);
SCM_API void scm_c_bitvector_clear_bit_x (SCM vec, size_t idx);
SCM_API void scm_c_bitvector_set_bits_x (SCM v, SCM bits);
SCM_API void scm_c_bitvector_clear_bits_x (SCM v, SCM bits);
SCM_API void scm_c_bitvector_set_all_bits_x (SCM vec);
SCM_API void scm_c_bitvector_clear_all_bits_x (SCM vec);
SCM_API void scm_c_bitvector_flip_all_bits_x (SCM vec);

View file

@ -447,9 +447,14 @@ SCM_DEFINE (scm_bit_set_star_x, "bit-set*!", 3, 0, 0,
int bit = scm_to_bool (obj);
if (scm_is_bitvector (v) && scm_is_bitvector (kv))
return bit
? scm_bitvector_set_bits_x (v, kv)
: scm_bitvector_clear_bits_x (v, kv);
{
if (bit)
scm_c_bitvector_set_bits_x (v, kv);
else
scm_c_bitvector_clear_bits_x (v, kv);
return SCM_UNSPECIFIED;
}
scm_t_array_handle v_handle;
size_t v_off, v_len;