30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
static struct {
Class isa;
} placeholder;
@interface OFMutableArrayPlaceholder: OFMutableArray
@end
static of_comparison_result_t
compare(id left, id right, SEL selector)
{
of_comparison_result_t (*comparator)(id, SEL, id) =
(of_comparison_result_t (*)(id, SEL, id))
[left methodForSelector: selector];
return comparator(left, selector, right);
}
static void
quicksort(OFMutableArray *array, size_t left, size_t right, SEL selector,
int options)
{
of_comparison_result_t ascending, descending;
if (options & OF_ARRAY_SORT_DESCENDING) {
ascending = OF_ORDERED_DESCENDING;
descending = OF_ORDERED_ASCENDING;
} else {
ascending = OF_ORDERED_ASCENDING;
descending = OF_ORDERED_DESCENDING;
}
while (left < right) {
size_t i = left;
size_t j = right - 1;
id pivot = [array objectAtIndex: right];
|
|
|
|
|
|
|
|
|
|
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
static struct {
Class isa;
} placeholder;
@interface OFMutableArrayPlaceholder: OFMutableArray
@end
static OFComparisonResult
compare(id left, id right, SEL selector)
{
OFComparisonResult (*comparator)(id, SEL, id) =
(OFComparisonResult (*)(id, SEL, id))
[left methodForSelector: selector];
return comparator(left, selector, right);
}
static void
quicksort(OFMutableArray *array, size_t left, size_t right, SEL selector,
int options)
{
OFComparisonResult ascending, descending;
if (options & OF_ARRAY_SORT_DESCENDING) {
ascending = OFOrderedDescending;
descending = OFOrderedAscending;
} else {
ascending = OFOrderedAscending;
descending = OFOrderedDescending;
}
while (left < right) {
size_t i = left;
size_t j = right - 1;
id pivot = [array objectAtIndex: right];
|
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
}
#ifdef OF_HAVE_BLOCKS
static void
quicksortWithBlock(OFMutableArray *array, size_t left, size_t right,
of_comparator_t comparator, int options)
{
of_comparison_result_t ascending, descending;
if (options & OF_ARRAY_SORT_DESCENDING) {
ascending = OF_ORDERED_DESCENDING;
descending = OF_ORDERED_ASCENDING;
} else {
ascending = OF_ORDERED_ASCENDING;
descending = OF_ORDERED_DESCENDING;
}
while (left < right) {
size_t i = left;
size_t j = right - 1;
id pivot = [array objectAtIndex: right];
|
|
|
|
|
|
|
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
}
#ifdef OF_HAVE_BLOCKS
static void
quicksortWithBlock(OFMutableArray *array, size_t left, size_t right,
of_comparator_t comparator, int options)
{
OFComparisonResult ascending, descending;
if (options & OF_ARRAY_SORT_DESCENDING) {
ascending = OFOrderedDescending;
descending = OFOrderedAscending;
} else {
ascending = OFOrderedAscending;
descending = OFOrderedDescending;
}
while (left < right) {
size_t i = left;
size_t j = right - 1;
id pivot = [array objectAtIndex: right];
|