@@ -6,26 +6,29 @@ namespace cppcore {
6
6
7
7
typedef int32_t (*ComparisonFn)(const void * _lhs, const void * _rhs);
8
8
9
- int32_t int_comp (const void *lhs, const void *rhs) {
10
- int32_t _lhs=0 , _rhs=0 ;
11
- memcpy (&_lhs, lhs, sizeof (int32_t ));
12
- memcpy (&_rhs, rhs, sizeof (int32_t ));
13
- if (_lhs > _rhs) {
14
- return 1 ;
15
- } else if (lhs == rhs) {
16
- return 0 ;
17
- }
18
- return -1 ;
9
+ template <class T >
10
+ int32_t compAscending (const void *lhs, const void *rhs) {
11
+ const T _lhs = *static_cast <const T *>(lhs);
12
+ const T _rhs = *static_cast <const T *>(rhs);
13
+ return (_lhs > _rhs) - (_lhs < _rhs);
19
14
}
20
15
21
- template <class T >
22
- void swap (T *v1, T *v2) {
23
- T tmp = *v1;
24
- *v1 = *v2;
25
- *v2 = *tmp;
16
+ inline void swap (uint8_t &lhs, uint8_t &rhs) {
17
+ uint8_t tmp = lhs;
18
+ lhs = rhs;
19
+ rhs = tmp;
26
20
}
27
21
28
- inline void quicksort (void *pivot, void *_data, size_t num, ComparisonFn func=int_comp) {
22
+ inline void swap (void *v1, void *v2, size_t stride) {
23
+ uint8_t *lhs = (uint8_t *) v1;
24
+ uint8_t *rhs = (uint8_t *) v2;
25
+ const uint8_t *end = rhs + stride;
26
+ while (rhs != end) {
27
+ swap (*lhs++, *rhs++);
28
+ }
29
+ }
30
+
31
+ inline void quicksort (void *pivot, void *_data, size_t num, size_t stride, ComparisonFn func) {
29
32
if (num < 2 ) {
30
33
return ;
31
34
}
@@ -40,28 +43,28 @@ namespace cppcore {
40
43
for (size_t i=1 ; i<num;) {
41
44
int32_t result = func (&data[i], pivot);
42
45
if (result > 0 ) {
43
- swap (&data[l], &data[i] );
46
+ swap (&data[l*stride ], &data[i*stride], stride );
44
47
++l;
45
48
} else if (result == 0 ) {
46
- swap (&data[g], &data[i] );
49
+ swap (&data[g*stride ], &data[i*stride], stride );
47
50
++g;
48
51
++i;
49
52
} else {
50
53
++i;
51
54
}
52
55
}
53
56
54
- quicksort (pivot, &data[0 ], l, func);
55
- quicksort (pivot, &data[g], num-g , func);
57
+ quicksort (pivot, &data[0 ], l, stride, func);
58
+ quicksort (pivot, &data[g], num - g, stride , func);
56
59
}
57
60
58
- bool isSorted (void *data, size_t num, ComparisonFn func) {
61
+ bool isSorted (const void *data, size_t num, size_t stride , ComparisonFn func) {
59
62
if (num < 2 ) {
60
63
return true ;
61
64
}
62
-
63
- for (size_t i=0 ; i<num- 1 ; ++i) {
64
- const int32_t result = func (&data[i ], &data[i+ 1 ]);
65
+ uint8_t *data_ = ( uint8_t *)data;
66
+ for (size_t i=1 ; i<num; ++i) {
67
+ const int32_t result = func (&data_[(i- 1 )*stride ], &data_[i * stride ]);
65
68
if (result == -1 ) {
66
69
return false ;
67
70
}
0 commit comments