Răsfoiți Sursa

fix vector blit (#5186)

* fix vector blit

* fix vector blit
Michael Baczynski 9 ani în urmă
părinte
comite
34f4cec409
2 a modificat fișierele cu 49 adăugiri și 3 ștergeri
  1. 25 3
      std/haxe/ds/Vector.hx
  2. 24 0
      tests/unit/src/unitstd/haxe/ds/Vector.unit.hx

+ 25 - 3
std/haxe/ds/Vector.hx

@@ -150,9 +150,31 @@ abstract Vector<T>(VectorData<T>) {
 		#elseif cpp
 			dest.toData().blit(destPos,src.toData(), srcPos,len);
 		#else
-			for (i in 0...len)
-			{
-				dest[destPos + i] = src[srcPos + i];
+			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];
+				}
 			}
 		#end
 	}

+ 24 - 0
tests/unit/src/unitstd/haxe/ds/Vector.unit.hx

@@ -89,6 +89,30 @@ vec3[4] == 4;
 vec3[5] == 5;
 vec3[6] == 6;
 
+var vec5 = haxe.ds.Vector.fromArrayCopy([0,1,2,3,4]);
+haxe.ds.Vector.blit(vec5, 0, vec5, 1, 4);
+vec5[0] == 0;
+vec5[1] == 0;
+vec5[2] == 1;
+vec5[3] == 2;
+vec5[4] == 3;
+
+var vec5 = haxe.ds.Vector.fromArrayCopy([0,1,2,3,4]);
+haxe.ds.Vector.blit(vec5, 1, vec5, 0, 4);
+vec5[0] == 1;
+vec5[1] == 2;
+vec5[2] == 3;
+vec5[3] == 4;
+vec5[4] == 4;
+
+var vec5 = haxe.ds.Vector.fromArrayCopy([0,1,2,3,4]);
+haxe.ds.Vector.blit(vec5, 0, vec5, 0, 5);
+vec5[0] == 0;
+vec5[1] == 1;
+vec5[2] == 2;
+vec5[3] == 3;
+vec5[4] == 4;
+
 // test iteration
 
 var vec1 = new haxe.ds.Vector(2);