Browse Source

Merge pull request #2273 from ap29600/core_slice_rotate_fix

Fix `core:slice.rotate_left`
gingerBill 2 years ago
parent
commit
8f3b6738ff
2 changed files with 22 additions and 18 deletions
  1. 17 15
      core/slice/ptr.odin
  2. 5 3
      core/slice/slice.odin

+ 17 - 15
core/slice/ptr.odin

@@ -73,24 +73,26 @@ ptr_rotate :: proc(left: int, mid: ^$T, right: int) {
 		left, mid, right := left, mid, right
 
 		// TODO(bill): Optimization with a buffer for smaller ranges
-		if left >= right {
-			for {
-				ptr_swap_non_overlapping(ptr_sub(mid, right), mid, right)
-				mid = ptr_sub(mid, right)
+		for left > 0 && right > 0 {
+			if left >= right {
+				for {
+					ptr_swap_non_overlapping(ptr_sub(mid, right), mid, right * size_of(T))
+					mid = ptr_sub(mid, right)
 
-				left -= right
-				if left < right {
-					break
+					left -= right
+					if left < right {
+						break
+					}
 				}
-			}
-		} else {
-			for {
-				ptr_swap_non_overlapping(ptr_sub(mid, left), mid, left)
-				mid = ptr_add(mid, left)
+			} else {
+				for {
+					ptr_swap_non_overlapping(ptr_sub(mid, left), mid, left * size_of(T))
+					mid = ptr_add(mid, left)
 
-				right -= left
-				if right < left {
-					break
+					right -= left
+					if right < left {
+						break
+					}
 				}
 			}
 		}

+ 5 - 3
core/slice/slice.odin

@@ -218,8 +218,10 @@ rotate_left :: proc(array: $T/[]$E, mid: int) {
 	n := len(array)
 	m := mid %% n
 	k := n - m
-	p := raw_data(array)
-	ptr_rotate(mid, ptr_add(p, mid), k)
+	// FIXME: (ap29600) this cast is a temporary fix for the compiler not matching
+	// [^T] with $P/^$T
+	p := cast(^E)raw_data(array)
+	ptr_rotate(m, ptr_add(p, m), k)
 }
 rotate_right :: proc(array: $T/[]$E, k: int) {
 	rotate_left(array, -k)
@@ -515,4 +517,4 @@ dot_product :: proc(a, b: $S/[]$T) -> (r: T, ok: bool)
 enumerated_array :: proc(ptr: ^$T) -> []intrinsics.type_elem_type(T)
 	where intrinsics.type_is_enumerated_array(T) {
 	return ([^]intrinsics.type_elem_type(T))(ptr)[:len(T)]
-}
+}