Bladeren bron

Update path/filepath to use new `slice.sort`; Add `sort.reverse_interface`

gingerBill 4 jaren geleden
bovenliggende
commit
7fc3030c63
3 gewijzigde bestanden met toevoegingen van 24 en 16 verwijderingen
  1. 3 3
      core/path/filepath/match.odin
  2. 3 3
      core/path/filepath/walk.odin
  3. 18 10
      core/sort/sort.odin

+ 3 - 3
core/path/filepath/match.odin

@@ -1,7 +1,7 @@
 package filepath
 
 import "core:os"
-import "core:sort"
+import "core:slice"
 import "core:strings"
 import "core:unicode/utf8"
 
@@ -284,8 +284,8 @@ _glob :: proc(dir, pattern: string, matches: ^[dynamic]string) -> (m: [dynamic]s
 
 
 	fis, _ := os.read_dir(d, -1);
-	sort.quick_sort_proc(fis, proc(a, b: os.File_Info) -> int {
-		return sort.compare_strings(a.name, b.name);
+	slice.sort_proc(fis, proc(a, b: os.File_Info) -> bool {
+		return a.name < b.name;
 	});
 	defer {
 		for fi in fis {

+ 3 - 3
core/path/filepath/walk.odin

@@ -1,7 +1,7 @@
 package filepath
 
 import "core:os"
-import "core:sort"
+import "core:slice"
 
 // Walk_Proc is the type of the procedure called for each file or directory visited by 'walk'
 // The 'path' parameter contains the parameter to walk as a prefix (this is the same as info.fullpath except on 'root')
@@ -81,8 +81,8 @@ read_dir :: proc(dir_name: string, allocator := context.temp_allocator) -> ([]os
 	if err != 0 {
 		return nil, err;
 	}
-	sort.quick_sort_proc(fis, proc(a, b: os.File_Info) -> int {
-		return sort.compare_strings(a.name, b.name);
+	slice.sort_proc(fis, proc(a, b: os.File_Info) -> bool {
+		return a.name < b.name;
 	});
 	return fis, 0;
 }

+ 18 - 10
core/sort/sort.odin

@@ -52,10 +52,9 @@ slice_interface :: proc(s: ^$T/[]$E) -> Interface where ORD(E) {
 	};
 }
 
-reverse_sort :: proc(it: Interface) {
-	it := it;
-	sort(Interface{
-		collection = &it,
+reverse_interface :: proc(it: ^Interface) -> Interface {
+	return Interface{
+		collection = it,
 
 		len = proc(rit: Interface) -> int {
 			it := (^Interface)(rit.collection);
@@ -69,7 +68,12 @@ reverse_sort :: proc(it: Interface) {
 			it := (^Interface)(rit.collection);
 			it.swap(it^, i, j);
 		},
-	});
+	};
+}
+
+reverse_sort :: proc(it: Interface) {
+	it := it;
+	sort(reverse_interface(&it));
 }
 
 reverse_slice :: proc(array: $T/[]$E) where ORD(E) {
@@ -269,11 +273,15 @@ _quick_sort :: proc(it: Interface, a, b, max_depth: int) {
 				it->swap(i, i-6);
 			}
 		}
-		// insertion sort
-		for i in a+1..<b {
-			for j := i; j > a && it->less(j, j-1); j -= 1 {
-				it->swap(j, j-1);
-			}
+		_insertion_sort(it, a, b);
+	}
+}
+
+@(private)
+_insertion_sort :: proc(it: Interface, a, b: int) {
+	for i in a+1..<b {
+		for j := i; j > a && it->less(j, j-1); j -= 1 {
+			it->swap(j, j-1);
 		}
 	}
 }