From cc51e9d8e70931d5c4723c87597c50fde66a1b2a Mon Sep 17 00:00:00 2001 From: Fredrik Noring <noring@nocrew.org> Date: Fri, 8 Dec 2000 00:05:44 +0100 Subject: [PATCH] Made reverse_array in-place for refs = 1. Rev: src/array.c:1.98 --- src/array.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/array.c b/src/array.c index 403d9f8c99..53c4a96ea2 100644 --- a/src/array.c +++ b/src/array.c @@ -23,7 +23,7 @@ #include "stuff.h" #include "bignum.h" -RCSID("$Id: array.c,v 1.97 2000/12/01 08:09:43 hubbe Exp $"); +RCSID("$Id: array.c,v 1.98 2000/12/07 23:05:44 noring Exp $"); PMOD_EXPORT struct array empty_array= { @@ -1867,7 +1867,24 @@ PMOD_EXPORT struct array *reverse_array(struct array *a) INT32 e; struct array *ret; - /* FIXME: Check refs so we might optimize */ + if(a->refs == 1) + /* Reverse in-place. */ + { + struct svalue *tmp0, *tmp1, swap; + + tmp0 = ITEM(a); + tmp1 = ITEM(a) + a->size; + for(e = a->size>>1; 0 < e; e--) + { + swap = *tmp0; + *(tmp0++) = *(--tmp1); + *tmp1 = swap; + } + + add_ref(a); + return a; + } + ret=allocate_array_no_init(a->size,0); for(e=0;e<a->size;e++) assign_svalue_no_free(ITEM(ret)+e,ITEM(a)+a->size+~e); -- GitLab