[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 01/03: Deprecate use of vector-move-left! and vector-mov
From: |
Daniel Llorens |
Subject: |
[Guile-commits] 01/03: Deprecate use of vector-move-left! and vector-move-right! on non-vector arrays |
Date: |
Thu, 5 Aug 2021 14:03:36 -0400 (EDT) |
lloda pushed a commit to branch wip-vector-cleanup-2
in repository guile.
commit c4ccebfadd7cb9d6c19c7efa53041250a3cf6713
Author: Daniel Llorens <lloda@sarc.name>
AuthorDate: Thu Aug 5 17:27:31 2021 +0200
Deprecate use of vector-move-left! and vector-move-right! on non-vector
arrays
These functions weren't advertised to work on non-vector arrays. They
did try to, but only incorrectly. For example:
(define a (vector 1 2 3 4 5))
(define b (make-array 0 '(1 5)))
(vector-move-right! a 0 2 b 2)
b
=> #1@1(0 0 1 2 0)
instead of the correct result #1@1(0 1 2 0 0).
* libguile/vectors.c (vector-move-left!, vector-move-right!): As stated.
---
libguile/vectors.c | 149 +++++++++++++++++++++++++++++++++++------------------
1 file changed, 100 insertions(+), 49 deletions(-)
diff --git a/libguile/vectors.c b/libguile/vectors.c
index 4b701f7..9558d88 100644
--- a/libguile/vectors.c
+++ b/libguile/vectors.c
@@ -408,31 +408,53 @@ SCM_DEFINE (scm_vector_move_left_x, "vector-move-left!",
5, 0, 0,
"@var{start1} is greater than @var{start2}.")
#define FUNC_NAME s_scm_vector_move_left_x
{
- scm_t_array_handle handle1, handle2;
- const SCM *elts1;
- SCM *elts2;
- size_t len1, len2;
- ssize_t inc1, inc2;
- size_t i, j, e;
+ if (SCM_I_IS_VECTOR (vec1) && SCM_I_IS_VECTOR (vec2))
+ {
+ SCM_VALIDATE_MUTABLE_VECTOR (1, vec2);
+ const SCM *elts1 = SCM_I_VECTOR_ELTS (vec1);
+ SCM *elts2 = SCM_I_VECTOR_WELTS (vec2);
+ size_t len1 = SCM_I_VECTOR_LENGTH (vec1);
+ size_t len2 = SCM_I_VECTOR_LENGTH (vec2);
+
+ size_t i, j, e;
+ i = scm_to_unsigned_integer (start1, 0, len1);
+ e = scm_to_unsigned_integer (end1, i, len1);
+ SCM_ASSERT_RANGE (SCM_ARG3, end1, (e-i) <= len2);
+ j = scm_to_unsigned_integer (start2, 0, len2);
+ SCM_ASSERT_RANGE (SCM_ARG5, start2, j <= len2 - (e - i));
+ for (; i < e; ++i, ++j)
+ elts2[j] = elts1[i];
+ }
+ else
+ {
+ scm_t_array_handle handle1, handle2;
+ const SCM *elts1;
+ SCM *elts2;
+ size_t len1, len2;
+ ssize_t inc1, inc2;
+ size_t i, j, e;
- elts1 = scm_vector_elements (vec1, &handle1, &len1, &inc1);
- elts2 = scm_vector_writable_elements (vec2, &handle2, &len2, &inc2);
-
- i = scm_to_unsigned_integer (start1, 0, len1);
- e = scm_to_unsigned_integer (end1, i, len1);
- SCM_ASSERT_RANGE (SCM_ARG3, end1, (e-i) <= len2);
- j = scm_to_unsigned_integer (start2, 0, len2);
- SCM_ASSERT_RANGE (SCM_ARG5, start2, j <= len2 - (e - i));
+ elts1 = scm_vector_elements (vec1, &handle1, &len1, &inc1);
+ elts2 = scm_vector_writable_elements (vec2, &handle2, &len2, &inc2);
+ scm_c_issue_deprecation_warning
+ ("Using vector-move-left! on arrays is deprecated. "
+ "Use array-copy-in-order! instead.");
+
+ i = scm_to_unsigned_integer (start1, 0, len1);
+ e = scm_to_unsigned_integer (end1, i, len1);
+ SCM_ASSERT_RANGE (SCM_ARG3, end1, (e-i) <= len2);
+ j = scm_to_unsigned_integer (start2, 0, len2);
+ SCM_ASSERT_RANGE (SCM_ARG5, start2, j <= len2 - (e - i));
- i *= inc1;
- e *= inc1;
- j *= inc2;
- for (; i < e; i += inc1, j += inc2)
- elts2[j] = elts1[i];
-
- scm_array_handle_release (&handle2);
- scm_array_handle_release (&handle1);
-
+ i *= inc1;
+ e *= inc1;
+ j *= inc2;
+ for (; i < e; i += inc1, j += inc2)
+ elts2[j] = elts1[i];
+
+ scm_array_handle_release (&handle2);
+ scm_array_handle_release (&handle1);
+ }
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
@@ -448,37 +470,66 @@ SCM_DEFINE (scm_vector_move_right_x,
"vector-move-right!", 5, 0, 0,
"@var{start1} is less than @var{start2}.")
#define FUNC_NAME s_scm_vector_move_right_x
{
- scm_t_array_handle handle1, handle2;
- const SCM *elts1;
- SCM *elts2;
- size_t len1, len2;
- ssize_t inc1, inc2;
- size_t i, j, e;
+ if (SCM_I_IS_VECTOR (vec1) && SCM_I_IS_VECTOR (vec2))
+ {
+ SCM_VALIDATE_MUTABLE_VECTOR (1, vec2);
+ const SCM *elts1 = SCM_I_VECTOR_ELTS (vec1);
+ SCM *elts2 = SCM_I_VECTOR_WELTS (vec2);
+ size_t len1 = SCM_I_VECTOR_LENGTH (vec1);
+ size_t len2 = SCM_I_VECTOR_LENGTH (vec2);
+
+ size_t i, j, e;
+ i = scm_to_unsigned_integer (start1, 0, len1);
+ e = scm_to_unsigned_integer (end1, i, len1);
+ SCM_ASSERT_RANGE (SCM_ARG3, end1, (e-i) <= len2);
+ j = scm_to_unsigned_integer (start2, 0, len2);
+ SCM_ASSERT_RANGE (SCM_ARG5, start2, j <= len2 - (e - i));
+ j += (e - i);
+
+ while (i < e)
+ {
+ --e;
+ --j;
+ elts2[j] = elts1[e];
+ }
+ }
+ else
+ {
+ scm_t_array_handle handle1, handle2;
+ const SCM *elts1;
+ SCM *elts2;
+ size_t len1, len2;
+ ssize_t inc1, inc2;
+ size_t i, j, e;
- elts1 = scm_vector_elements (vec1, &handle1, &len1, &inc1);
- elts2 = scm_vector_writable_elements (vec2, &handle2, &len2, &inc2);
-
- i = scm_to_unsigned_integer (start1, 0, len1);
- e = scm_to_unsigned_integer (end1, i, len1);
- SCM_ASSERT_RANGE (SCM_ARG3, end1, (e-i) <= len2);
- j = scm_to_unsigned_integer (start2, 0, len2);
- SCM_ASSERT_RANGE (SCM_ARG5, start2, j <= len2 - (e - i));
+ elts1 = scm_vector_elements (vec1, &handle1, &len1, &inc1);
+ elts2 = scm_vector_writable_elements (vec2, &handle2, &len2, &inc2);
+ scm_c_issue_deprecation_warning
+ ("Using vector-move-right! on arrays is deprecated. "
+ "Use array-copy-in-order! instead.");
+
+ i = scm_to_unsigned_integer (start1, 0, len1);
+ e = scm_to_unsigned_integer (end1, i, len1);
+ SCM_ASSERT_RANGE (SCM_ARG3, end1, (e-i) <= len2);
+ j = scm_to_unsigned_integer (start2, 0, len2);
+ SCM_ASSERT_RANGE (SCM_ARG5, start2, j <= len2 - (e - i));
- j += (e - i);
+ j += (e - i);
- i *= inc1;
- e *= inc1;
- j *= inc2;
- while (i < e)
- {
- e -= inc1;
- j -= inc2;
- elts2[j] = elts1[e];
+ i *= inc1;
+ e *= inc1;
+ j *= inc2;
+ while (i < e)
+ {
+ e -= inc1;
+ j -= inc2;
+ elts2[j] = elts1[e];
+ }
+
+ scm_array_handle_release (&handle2);
+ scm_array_handle_release (&handle1);
}
- scm_array_handle_release (&handle2);
- scm_array_handle_release (&handle1);
-
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME