diff --git a/core/path/filepath/match.odin b/core/path/filepath/match.odin index 4ea0851d3..3e94d3fd9 100644 --- a/core/path/filepath/match.odin +++ b/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 { diff --git a/core/path/filepath/walk.odin b/core/path/filepath/walk.odin index 4143bc557..04424b92e 100644 --- a/core/path/filepath/walk.odin +++ b/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; } diff --git a/core/sort/sort.odin b/core/sort/sort.odin index 0501666ae..7927bfa11 100644 --- a/core/sort/sort.odin +++ b/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.. 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.. a && it->less(j, j-1); j -= 1 { + it->swap(j, j-1); } } }