]> git.mxchange.org Git - simgear.git/commitdiff
Nasal: add naVec_removelast. (Thanks to Philosopher)
authorThomas Geymayer <tomgey@gmail.com>
Fri, 12 Apr 2013 10:32:03 +0000 (12:32 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Fri, 12 Apr 2013 10:32:03 +0000 (12:32 +0200)
simgear/nasal/nasal.h
simgear/nasal/vector.c

index d3cb916736f5225d8f467598f5df6e7151b1c6c0..db7354eab327e6634ca581d91bcf5a9c00464672 100644 (file)
@@ -185,9 +185,27 @@ int naVec_size(naRef v);
 naRef naVec_get(naRef v, int i);
 void naVec_set(naRef vec, int i, naRef o);
 int naVec_append(naRef vec, naRef o);
-naRef naVec_removelast(naRef vec);
 void naVec_setsize(naContext c, naRef vec, int sz);
 
+/**
+ * Remove and retrieve the first element of the vector.
+ *
+ * This operation reduces the size of the vector by one and moves all elements
+ * by one towards the begin of the vector.
+ *
+ * @return The element removed from the begin
+ */
+naRef naVec_removefirst(naRef vec);
+
+/**
+ * Remove and retrieve the last element of the vector.
+ *
+ * This operation reduces the size of the vector by one.
+ *
+ * @return The element removed from the end
+ */
+naRef naVec_removelast(naRef vec);
+
 // Hash utilities:
 int naHash_size(naRef h);
 int naHash_get(naRef hash, naRef key, naRef* out);
index 1a7546aeb2cbc4dfd9eae7fddfcf12c10b995e26..fc160f0e48d1be2ac3c687924aad5d1a71e24e96 100644 (file)
@@ -69,6 +69,7 @@ int naVec_append(naRef vec, naRef o)
     return 0;
 }
 
+//------------------------------------------------------------------------------
 void naVec_setsize(naContext c, naRef vec, int sz)
 {
     if (sz < 0)
@@ -86,6 +87,26 @@ void naVec_setsize(naContext c, naRef vec, int sz)
     }
 }
 
+//------------------------------------------------------------------------------
+naRef naVec_removefirst(naRef vec)
+{
+    naRef o;
+    int i;
+    if(IS_VEC(vec)) {
+        struct VecRec* v = PTR(vec).vec->rec;
+        if(!v || v->size == 0) return naNil();
+        o = v->array[0];
+        for (i=1; i<v->size; i++)
+            v->array[i-1] = v->array[i];
+        v->size--;
+        if(v->size < (v->alloced >> 1))
+            resize(PTR(vec).vec);
+        return o;
+    }
+    return naNil();
+}
+
+//------------------------------------------------------------------------------
 naRef naVec_removelast(naRef vec)
 {
     naRef o;