Przeglądaj źródła

fixed Vector.blit in hl

Nicolas Cannasse 9 lat temu
rodzic
commit
4b182bb949
2 zmienionych plików z 12 dodań i 22 usunięć
  1. 2 22
      std/hl/_std/haxe/ds/Vector.hx
  2. 10 0
      std/hl/types/ArrayBase.hx

+ 2 - 22
std/hl/_std/haxe/ds/Vector.hx

@@ -45,28 +45,8 @@ abstract Vector<T>(VectorData<T>) {
 		return this.length;
 		return this.length;
 	}
 	}
 
 
-	public static function blit<T>(src:Vector<T>, srcPos:Int, dest:Vector<T>, destPos:Int, len:Int):Void {
-		if( src == dest ) {
-			if (srcPos < destPos) {
-				var i = srcPos + len;
-				var j = destPos + len;
-				for (k in 0...len) {
-					i--;
-					j--;
-					src[j] = src[i];
-				}
-			} else if (srcPos > destPos) {
-				var i = srcPos;
-				var j = destPos;
-				for (k in 0...len) {
-					src[j] = src[i];
-					i++;
-					j++;
-				}
-			}		
-		} else
-			for (i in 0...len)
-				dest[destPos + i] = src[srcPos + i];
+	public static inline function blit<T>(src:Vector<T>, srcPos:Int, dest:Vector<T>, destPos:Int, len:Int):Void {
+		(cast dest : hl.types.ArrayBase.ArrayAccess).blit(destPos,(cast src : hl.types.ArrayBase.ArrayAccess),srcPos,len);
 	}
 	}
 
 
 	public inline function toArray():Array<T> {
 	public inline function toArray():Array<T> {

+ 10 - 0
std/hl/types/ArrayBase.hx

@@ -33,6 +33,10 @@ class ArrayAccess {
 		throw "Not implemented";
 		throw "Not implemented";
 	}
 	}
 
 
+	public function blit( pos : Int, src : ArrayAccess, srcpos : Int, len : Int ) : Void {
+		throw "Not implemented";		
+	}
+
 }
 }
 
 
 @:keep
 @:keep
@@ -216,6 +220,12 @@ class BasicIterator<T> {
 		(bytes:Bytes).blit(0, bytes, 1 << bytes.sizeBits, length << bytes.sizeBits);
 		(bytes:Bytes).blit(0, bytes, 1 << bytes.sizeBits, length << bytes.sizeBits);
 		return v;
 		return v;
 	}
 	}
+	
+	override function blit( pos : Int, src : ArrayAccess, srcpos : Int, len : Int ) : Void {
+		var src = (cast src : ArrayBasic<T>);
+		if( pos < 0 || srcpos < 0 || len < 0 || pos + len > length || srcpos + len > src.length ) throw haxe.io.Error.OutsideBounds;
+		(bytes:Bytes).blit(pos << bytes.sizeBits,src.bytes,srcpos<<bytes.sizeBits,len<<bytes.sizeBits);
+	}
 
 
 	override function slice( pos : Int, ?end : Int ) : ArrayBasic<T> {
 	override function slice( pos : Int, ?end : Int ) : ArrayBasic<T> {
 		if( pos < 0 ) {
 		if( pos < 0 ) {