From 7a55d875c466166263d0f743b874b933c51d687e Mon Sep 17 00:00:00 2001 From: chai2010 Date: Sat, 28 Apr 2018 07:41:04 +0800 Subject: [PATCH] =?UTF-8?q?examples/ch2-06-qsort:=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E5=90=8D=E7=A7=B0,=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{v1-qsort => 01-qsort-v1}/Makefile | 0 .../{v1-qsort => 01-qsort-v1}/main.c | 0 .../{v2-qsort => 02-qsort-v2}/main.go | 0 .../{v2-qsort => 02-qsort-v2}/qsort.go | 0 .../ch2-06-qsort/02-qsort-v2/qsort_test.go | 26 +++++++++++++++++ .../ch2-06-qsort/02-qsort-v2/test_helper.go | 21 ++++++++++++++ .../{v3-qsort => 03-qsort-v3}/main.go | 0 .../{v3-qsort => 03-qsort-v3}/sort.go | 0 .../ch2-06-qsort/03-qsort-v3/sort_test.go | 28 +++++++++++++++++++ .../{v4-qsort => 04-qsort-v4}/main.go | 0 .../{v4-qsort => 04-qsort-v4}/sort.go | 0 .../ch2-06-qsort/04-qsort-v4/sort_test.go | 24 ++++++++++++++++ 12 files changed, 99 insertions(+) rename examples/ch2-06-qsort/{v1-qsort => 01-qsort-v1}/Makefile (100%) rename examples/ch2-06-qsort/{v1-qsort => 01-qsort-v1}/main.c (100%) rename examples/ch2-06-qsort/{v2-qsort => 02-qsort-v2}/main.go (100%) rename examples/ch2-06-qsort/{v2-qsort => 02-qsort-v2}/qsort.go (100%) create mode 100644 examples/ch2-06-qsort/02-qsort-v2/qsort_test.go create mode 100644 examples/ch2-06-qsort/02-qsort-v2/test_helper.go rename examples/ch2-06-qsort/{v3-qsort => 03-qsort-v3}/main.go (100%) rename examples/ch2-06-qsort/{v3-qsort => 03-qsort-v3}/sort.go (100%) create mode 100644 examples/ch2-06-qsort/03-qsort-v3/sort_test.go rename examples/ch2-06-qsort/{v4-qsort => 04-qsort-v4}/main.go (100%) rename examples/ch2-06-qsort/{v4-qsort => 04-qsort-v4}/sort.go (100%) create mode 100644 examples/ch2-06-qsort/04-qsort-v4/sort_test.go diff --git a/examples/ch2-06-qsort/v1-qsort/Makefile b/examples/ch2-06-qsort/01-qsort-v1/Makefile similarity index 100% rename from examples/ch2-06-qsort/v1-qsort/Makefile rename to examples/ch2-06-qsort/01-qsort-v1/Makefile diff --git a/examples/ch2-06-qsort/v1-qsort/main.c b/examples/ch2-06-qsort/01-qsort-v1/main.c similarity index 100% rename from examples/ch2-06-qsort/v1-qsort/main.c rename to examples/ch2-06-qsort/01-qsort-v1/main.c diff --git a/examples/ch2-06-qsort/v2-qsort/main.go b/examples/ch2-06-qsort/02-qsort-v2/main.go similarity index 100% rename from examples/ch2-06-qsort/v2-qsort/main.go rename to examples/ch2-06-qsort/02-qsort-v2/main.go diff --git a/examples/ch2-06-qsort/v2-qsort/qsort.go b/examples/ch2-06-qsort/02-qsort-v2/qsort.go similarity index 100% rename from examples/ch2-06-qsort/v2-qsort/qsort.go rename to examples/ch2-06-qsort/02-qsort-v2/qsort.go diff --git a/examples/ch2-06-qsort/02-qsort-v2/qsort_test.go b/examples/ch2-06-qsort/02-qsort-v2/qsort_test.go new file mode 100644 index 0000000..e151f0b --- /dev/null +++ b/examples/ch2-06-qsort/02-qsort-v2/qsort_test.go @@ -0,0 +1,26 @@ +// Copyright © 2018 ChaiShushan . +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ + +package qsort + +import ( + "sort" + "testing" + "unsafe" +) + +func TestSort(t *testing.T) { + values := []int32{42, 9, 101, 95, 27, 25} + + Sort(unsafe.Pointer(&values[0]), + len(values), int(unsafe.Sizeof(values[0])), + t_get_go_qsort_compare(), + ) + + isSorted := sort.SliceIsSorted(values, func(i, j int) bool { + return values[i] < values[j] + }) + if !isSorted { + t.Fatal("should be sorted") + } +} diff --git a/examples/ch2-06-qsort/02-qsort-v2/test_helper.go b/examples/ch2-06-qsort/02-qsort-v2/test_helper.go new file mode 100644 index 0000000..c0d373b --- /dev/null +++ b/examples/ch2-06-qsort/02-qsort-v2/test_helper.go @@ -0,0 +1,21 @@ +// Copyright © 2018 ChaiShushan . +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ + +package qsort + +//extern int t_go_qsort_compare(void* a, void* b); +import "C" + +import ( + "unsafe" +) + +func t_get_go_qsort_compare() CompareFunc { + return CompareFunc(C.t_go_qsort_compare) +} + +//export t_go_qsort_compare +func t_go_qsort_compare(a, b unsafe.Pointer) C.int { + pa, pb := (*C.int)(a), (*C.int)(b) + return C.int(*pa - *pb) +} diff --git a/examples/ch2-06-qsort/v3-qsort/main.go b/examples/ch2-06-qsort/03-qsort-v3/main.go similarity index 100% rename from examples/ch2-06-qsort/v3-qsort/main.go rename to examples/ch2-06-qsort/03-qsort-v3/main.go diff --git a/examples/ch2-06-qsort/v3-qsort/sort.go b/examples/ch2-06-qsort/03-qsort-v3/sort.go similarity index 100% rename from examples/ch2-06-qsort/v3-qsort/sort.go rename to examples/ch2-06-qsort/03-qsort-v3/sort.go diff --git a/examples/ch2-06-qsort/03-qsort-v3/sort_test.go b/examples/ch2-06-qsort/03-qsort-v3/sort_test.go new file mode 100644 index 0000000..53d5238 --- /dev/null +++ b/examples/ch2-06-qsort/03-qsort-v3/sort_test.go @@ -0,0 +1,28 @@ +// Copyright © 2018 ChaiShushan . +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ + +package qsort + +import ( + "sort" + "testing" + "unsafe" +) + +func TestSort(t *testing.T) { + values := []int32{42, 9, 101, 95, 27, 25} + + Sort(unsafe.Pointer(&values[0]), len(values), int(unsafe.Sizeof(values[0])), + func(a, b unsafe.Pointer) int { + pa, pb := (*int32)(a), (*int32)(b) + return int(*pa - *pb) + }, + ) + + isSorted := sort.SliceIsSorted(values, func(i, j int) bool { + return values[i] < values[j] + }) + if !isSorted { + t.Fatal("should be sorted") + } +} diff --git a/examples/ch2-06-qsort/v4-qsort/main.go b/examples/ch2-06-qsort/04-qsort-v4/main.go similarity index 100% rename from examples/ch2-06-qsort/v4-qsort/main.go rename to examples/ch2-06-qsort/04-qsort-v4/main.go diff --git a/examples/ch2-06-qsort/v4-qsort/sort.go b/examples/ch2-06-qsort/04-qsort-v4/sort.go similarity index 100% rename from examples/ch2-06-qsort/v4-qsort/sort.go rename to examples/ch2-06-qsort/04-qsort-v4/sort.go diff --git a/examples/ch2-06-qsort/04-qsort-v4/sort_test.go b/examples/ch2-06-qsort/04-qsort-v4/sort_test.go new file mode 100644 index 0000000..472c64a --- /dev/null +++ b/examples/ch2-06-qsort/04-qsort-v4/sort_test.go @@ -0,0 +1,24 @@ +// Copyright © 2018 ChaiShushan . +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ + +package qsort + +import ( + "sort" + "testing" +) + +func TestSlice(t *testing.T) { + values := []int32{42, 9, 101, 95, 27, 25} + + Slice(values, func(i, j int) bool { + return values[i] < values[j] + }) + + isSorted := sort.SliceIsSorted(values, func(i, j int) bool { + return values[i] < values[j] + }) + if !isSorted { + t.Fatal("should be sorted") + } +}