Browse Source

Fix `core:slice.rotate_left`

This commit includes two fixes:
- a temporary cast to make the function compile
- a fix to a logic error that caused the function to hang or return
  incorrect results
Andrea Piseri 2 years ago
parent
commit
385d2a143c
2 changed files with 10 additions and 16 deletions
  1. 5 13
      core/slice/ptr.odin
  2. 5 3
      core/slice/slice.odin

+ 5 - 13
core/slice/ptr.odin

@@ -73,25 +73,17 @@ ptr_rotate :: proc(left: int, mid: ^$T, right: int) {
 		left, mid, right := left, mid, right
 		left, mid, right := left, mid, right
 
 
 		// TODO(bill): Optimization with a buffer for smaller ranges
 		// TODO(bill): Optimization with a buffer for smaller ranges
-		if left >= right {
-			for {
-				ptr_swap_non_overlapping(ptr_sub(mid, right), mid, right)
+		for left > 0 && right > 0 {
+			if left >= right {
+				ptr_swap_non_overlapping(ptr_sub(mid, right), mid, right * size_of(T))
 				mid = ptr_sub(mid, right)
 				mid = ptr_sub(mid, right)
 
 
 				left -= right
 				left -= right
-				if left < right {
-					break
-				}
-			}
-		} else {
-			for {
-				ptr_swap_non_overlapping(ptr_sub(mid, left), mid, left)
+			} else {
+				ptr_swap_non_overlapping(ptr_sub(mid, left), mid, left * size_of(T))
 				mid = ptr_add(mid, left)
 				mid = ptr_add(mid, left)
 
 
 				right -= left
 				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)
 	n := len(array)
 	m := mid %% n
 	m := mid %% n
 	k := n - m
 	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(^int)raw_data(array)
+	ptr_rotate(m, ptr_add(p, m), k)
 }
 }
 rotate_right :: proc(array: $T/[]$E, k: int) {
 rotate_right :: proc(array: $T/[]$E, k: int) {
 	rotate_left(array, -k)
 	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)
 enumerated_array :: proc(ptr: ^$T) -> []intrinsics.type_elem_type(T)
 	where intrinsics.type_is_enumerated_array(T) {
 	where intrinsics.type_is_enumerated_array(T) {
 	return ([^]intrinsics.type_elem_type(T))(ptr)[:len(T)]
 	return ([^]intrinsics.type_elem_type(T))(ptr)[:len(T)]
-}
+}