[m-rev.] for review: Simplify string.append(in, in, in) implementation.
Mark Brown
mark at mercurylang.org
Wed Oct 23 20:29:19 AEDT 2019
This looks fine.
On Wed, Oct 23, 2019 at 3:02 PM Peter Wang <novalazy at gmail.com> wrote:
>
> library/string.m:
> Replace foreign code implementations with Mercury code.
> ---
> library/string.m | 47 ++++++++++-------------------------------------
> 1 file changed, 10 insertions(+), 37 deletions(-)
>
> diff --git a/library/string.m b/library/string.m
> index 96566a3dc..8cc572d9c 100644
> --- a/library/string.m
> +++ b/library/string.m
> @@ -3577,43 +3577,16 @@ append(S1::out, S2::out, S3::in) :-
>
> :- pred append_iii(string::in, string::in, string::in) is semidet.
>
> -:- pragma foreign_proc("C",
> - append_iii(S1::in, S2::in, S3::in),
> - [will_not_call_mercury, promise_pure, thread_safe, will_not_modify_trail,
> - does_not_affect_liveness, no_sharing],
> -"{
> - size_t len_1 = strlen(S1);
> - SUCCESS_INDICATOR = (
> - strncmp(S1, S3, len_1) == 0 &&
> - strcmp(S2, S3 + len_1) == 0
> - );
> -}").
> -:- pragma foreign_proc("C#",
> - append_iii(S1::in, S2::in, S3::in),
> - [will_not_call_mercury, promise_pure, thread_safe],
> -"{
> - SUCCESS_INDICATOR = S3.Equals(System.String.Concat(S1, S2));
> -}").
> -:- pragma foreign_proc("Java",
> - append_iii(S1::in, S2::in, S3::in),
> - [will_not_call_mercury, promise_pure, thread_safe],
> -"
> - SUCCESS_INDICATOR = S3.equals(S1.concat(S2));
> -").
> -:- pragma foreign_proc("Erlang",
> - append_iii(S1::in, S2::in, S3::in),
> - [will_not_call_mercury, promise_pure, thread_safe],
> -"
> - S1_length = size(S1),
> - S2_length = size(S2),
> - case S1_length + S2_length =:= size(S3) of
> - true ->
> - <<Left:S1_length/binary, Right/binary>> = S3,
> - SUCCESS_INDICATOR = (Left =:= S1 andalso Right =:= S2);
> - false ->
> - SUCCESS_INDICATOR = false
> - end
> -").
> +append_iii(S1, S2, S3) :-
> + Len1 = length(S1),
> + Len2 = length(S2),
> + Len3 = length(S3),
> + ( if Len3 = Len1 + Len2 then
> + unsafe_compare_substrings((=), S1, 0, S3, 0, Len1),
> + unsafe_compare_substrings((=), S2, 0, S3, Len1, Len2)
> + else
> + fail
> + ).
>
> :- pred append_ioi(string::in, string::uo, string::in) is semidet.
>
> --
> 2.23.0
>
> _______________________________________________
> reviews mailing list
> reviews at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/reviews
More information about the reviews
mailing list