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