|
@@ -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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|