annotate libphobos/libdruntime/rt/qsort.d @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 * This is a public domain version of qsort.d. All it does is call C's
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 * qsort().
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * Copyright: Copyright Digital Mars 2000 - 2010.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 * Authors: Walter Bright, Martin Nowak
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 /* Copyright Digital Mars 2000 - 2010.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 * (See accompanying file LICENSE_1_0.txt or copy at
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 * http://www.boost.org/LICENSE_1_0.txt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 module rt.qsort;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 //debug=qsort;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 private import core.stdc.stdlib;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 version (OSX)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 version = Darwin;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 else version (iOS)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 version = Darwin;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 else version (TVOS)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 version = Darwin;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 else version (WatchOS)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 version = Darwin;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 // qsort_r was added in glibc in 2.8. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88127
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 version (CRuntime_Glibc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 version (GNU)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 import gcc.config : Have_Qsort_R;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 enum Glibc_Qsort_R = Have_Qsort_R;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 enum Glibc_Qsort_R = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 enum Glibc_Qsort_R = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 static if (Glibc_Qsort_R)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 alias extern (C) int function(scope const void *, scope const void *, scope void *) Cmp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 extern (C) void qsort_r(scope void *base, size_t nmemb, size_t size, Cmp cmp, scope void *arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 extern (C) void[] _adSort(return scope void[] a, TypeInfo ti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 extern (C) int cmp(scope const void* p1, scope const void* p2, scope void* ti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 return (cast(TypeInfo)ti).compare(p1, p2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 qsort_r(a.ptr, a.length, ti.tsize, &cmp, cast(void*)ti);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 return a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 else version (FreeBSD)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 alias extern (C) int function(scope void *, scope const void *, scope const void *) Cmp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 extern (C) void qsort_r(scope void *base, size_t nmemb, size_t size, scope void *thunk, Cmp cmp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 extern (C) void[] _adSort(return scope void[] a, TypeInfo ti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 extern (C) int cmp(scope void* ti, scope const void* p1, scope const void* p2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 return (cast(TypeInfo)ti).compare(p1, p2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 qsort_r(a.ptr, a.length, ti.tsize, cast(void*)ti, &cmp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 return a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 else version (DragonFlyBSD)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 alias extern (C) int function(scope void *, scope const void *, scope const void *) Cmp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 extern (C) void qsort_r(scope void *base, size_t nmemb, size_t size, scope void *thunk, Cmp cmp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 extern (C) void[] _adSort(return scope void[] a, TypeInfo ti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 extern (C) int cmp(scope void* ti, scope const void* p1, scope const void* p2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 return (cast(TypeInfo)ti).compare(p1, p2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 qsort_r(a.ptr, a.length, ti.tsize, cast(void*)ti, &cmp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 return a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 else version (Darwin)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 alias extern (C) int function(scope void *, scope const void *, scope const void *) Cmp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 extern (C) void qsort_r(scope void *base, size_t nmemb, size_t size, scope void *thunk, Cmp cmp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 extern (C) void[] _adSort(return scope void[] a, TypeInfo ti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 extern (C) int cmp(scope void* ti, scope const void* p1, scope const void* p2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 return (cast(TypeInfo)ti).compare(p1, p2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 qsort_r(a.ptr, a.length, ti.tsize, cast(void*)ti, &cmp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 return a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 else version (CRuntime_UClibc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 alias extern (C) int function(scope const void *, scope const void *, scope void *) __compar_d_fn_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 extern (C) void qsort_r(scope void *base, size_t nmemb, size_t size, __compar_d_fn_t cmp, scope void *arg);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 extern (C) void[] _adSort(return scope void[] a, TypeInfo ti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 extern (C) int cmp(scope const void* p1, scope const void* p2, scope void* ti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 return (cast(TypeInfo)ti).compare(p1, p2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 qsort_r(a.ptr, a.length, ti.tsize, &cmp, cast(void*)ti);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 return a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 private TypeInfo tiglobal;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 extern (C) void[] _adSort(return scope void[] a, TypeInfo ti)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 extern (C) int cmp(scope const void* p1, scope const void* p2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 return tiglobal.compare(p1, p2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 tiglobal = ti;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 qsort(a.ptr, a.length, ti.tsize, &cmp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 return a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 debug(qsort) printf("array.sort.unittest()\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 int[] a = new int[10];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 a[0] = 23;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 a[1] = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 a[2] = 64;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 a[3] = 5;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 a[4] = 6;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 a[5] = 5;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 a[6] = 17;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 a[7] = 3;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 a[8] = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 a[9] = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 _adSort(*cast(void[]*)&a, typeid(a[0]));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 for (int i = 0; i < a.length - 1; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 //printf("i = %d", i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 //printf(" %d %d\n", a[i], a[i + 1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 assert(a[i] <= a[i + 1]);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 }