浏览代码

completed wrapper. only some tests done

Nicolas Cannasse 20 年之前
父节点
当前提交
71a3cb3f41
共有 1 个文件被更改,包括 194 次插入12 次删除
  1. 194 12
      std/neko/NekoArray__.hx

+ 194 - 12
std/neko/NekoArray__.hx

@@ -4,16 +4,20 @@ class NekoArray__<T> implements Array<T> {
 	public var length : Int;
 
 	private function new() {
+		untyped {
+			this.__a = __dollar__amake(0);
+			this.length = 0;
+		}
 	}
 
-	private static function new1(a) {
+	private static function new1(a,l) {
 		untyped {
 			if( __dollar__typeof(a) != __dollar__tarray )
 				__dollar__throw(a);
-			var arr = new Array<Dynamic>();
-			arr.__a = a;
-			arr.length = __dollar__asize(a);
-			return arr;
+			var inst = new Array<Dynamic>();
+			inst.__a = a;
+			inst.length = l;
+			return inst;
 		}
 	}
 
@@ -21,22 +25,22 @@ class NekoArray__<T> implements Array<T> {
 		untyped {
 			var a1 = this.__a;
 			var a2 = arr.__a;
-			var s1 = __dollar__asize(a1);
-			var s2 = __dollar__asize(a2);
+			var s1 = this.length;
+			var s2 = arr.length;
 			var a = __dollar__amake(s1+s2);
 			__dollar__ablit(a,0,a1,0,s1);
 			__dollar__ablit(a,s1,a2,0,s2);
-			return Array.new1(a);
+			return Array.new1(a,s1+s2);
 		}
 	}
 
 	public function copy() {
-		return untyped Array.new1(__dollar__acopy(this.__a));
+		return untyped Array.new1(__dollar__acopy(this.__a),this.length);
 	}
 
 	public function indexes() {
 		return untyped {
-			a : this.__arr,
+			a : this.__a,
 			p : 0,
 			l : this.length,
 			hasNext : function() {
@@ -57,7 +61,7 @@ class NekoArray__<T> implements Array<T> {
 
 	public function iterator() {
 		return untyped {
-			a : this.__arr,
+			a : this.__a,
 			p : 0,
 			l : this.length,
 			hasNext : function() {
@@ -77,7 +81,185 @@ class NekoArray__<T> implements Array<T> {
 	}
 
 	public function insert( pos, x ) {
-		//
+		untyped {
+			this.__resize(if( length < pos ) pos + 1 else length + 1);
+			this.__a[pos] = x;
+		}
+	}
+
+	public function join(delim) {
+		var s = new StringBuf();
+		var it = iterator();
+		for i in it {
+			s.add(i);
+			if( it.hasNext() )
+				s.add(delim);
+		}
+		return s.toString();
+	}
+
+	public function toString() {
+		var s = new StringBuf();
+		s.add("[");
+		var it = iterator();
+		for i in it {
+			s.add(i);
+			if( it.hasNext() )
+				s.add(",");
+		}
+		s.add("]");
+		return s.toString();
+	}
+
+	public function pop() {
+		untyped {
+			this.length -= 1;
+			var x = this.__a[this.length];
+			this.__a[this.length] = null;
+			return x;
+		}
+	}
+
+	public function push(v) {
+		untyped {
+			var l = this.length;
+			this.__resize(l + 1);
+			this.__a[l] = v;
+			return l;
+		}
+	}
+
+	public function unshift(v ) {
+		untyped {
+			var l = this.length;
+			this.__resize(l + 1);
+			var a = this.__a;
+			__dollar__ablit(a,1,a,0,l);
+			a[0] = v;
+		}
+	}
+
+	public function remove(v) {
+		untyped {
+			var i = 0;
+			var l = this.length;
+			var a = this.__a;
+			while( i < l ) {
+				if( a[i] == v ) {
+					__dollar__ablit(a,i,a,i+1,l - i - 1);
+					l -= 1;
+					this.length = l;
+					a[l] = null;
+					return true;
+				}
+				i += 1;
+			}
+			return false;
+		}
+	}
+
+	public function reverse() {
+		untyped {
+			var i = 0;
+			var l = this.length;
+			var a = __dollar__asub(this.__a,0,l);
+			var half = __dollar__int(l / 2);
+			l -= 1;
+			while( i < half ) {
+				var tmp = a[i];
+				a[i] = a[l-i];
+				a[l-1] = tmp;
+				i += 1;
+			}
+			return Array.new1(a,l);
+		}
+	}
+
+	public function shift() {
+		untyped {
+			var l = this.length;
+			if( l == 0 )
+				return null;
+			var a = this.__a;
+			var x = a[0];
+			l -= 1;
+			__dollar__ablit(a,0,a,1,l);
+			a[l] = null;
+			this.length = l;
+			return x;
+		}
+	}
+
+	public function slice( pos, end ) {
+		var len = end - pos;
+		return untyped Array.new1(__dollar__asub(this.__a,pos,len),len);
+	}
+
+	public function sort(f) {
+		untyped {
+			var a = this.__a;
+			var i = 0;
+			var l = this.length;
+			while( i < l ) {
+				var swap = false;
+				var j = 0;
+				var max = l - i - 1;
+				while( j < max ) {
+					if( f(a[j],a[j+1]) > 0 ) {
+						var tmp = a[j+1];
+						a[j+1] = a[j];
+						a[j] = tmp;
+						swap = true;
+					}
+					j += 1;
+				}
+				if( !swap )
+					break;
+				i += 1;
+			}
+		}
+	}
+
+	public function splice( pos, len ) {
+		untyped {
+			var a = this.__a;
+			var ret = Array.new1(__dollar__asub(a,pos,len),len);
+			var end = pos + len;
+			__dollar__ablit(a,pos,a,end,this.length-end);
+			this.length -= len;
+			return ret;
+		}
+	}
+
+
+
+	/* NEKO INTERNAL */
+
+	private function __string() {
+		return untyped toString().__s;
+	}
+
+	private function __get( pos  ) {
+		return untyped this.__a[pos];
 	}
 
+	private function __set( pos, v ) {
+		untyped this.__a[pos] = v;
+	}
+
+	private function __resize(l) {
+		untyped {
+			var a = this.__a;
+			if( __dollar__asize(a) >= l ) {
+				this.length = l;
+				return;
+			}
+			var a2 = __dollar__amake(l);
+			__dollar__ablit(a2,0,a,0,this.length);
+			this.__a = a2;
+			this.length = l;
+		}
+	}
+
+
 }