diff options
Diffstat (limited to 'Menes/radixSortWithSelector.mm')
-rw-r--r-- | Menes/radixSortWithSelector.mm | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/Menes/radixSortWithSelector.mm b/Menes/radixSortWithSelector.mm index 5523e3c..0c38a33 100644 --- a/Menes/radixSortWithSelector.mm +++ b/Menes/radixSortWithSelector.mm @@ -30,20 +30,7 @@ struct RadixItem_ { uint32_t key; }; -@implementation NSMutableArray (MenesRadixSortWithSelector) - -- (void) radixSortUsingFunction:(MenesRadixSortFunction)function withContext:(void *)argument { - size_t count([self count]); - struct RadixItem_ *swap(new RadixItem_[count * 2]); - - for (size_t i(0); i != count; ++i) { - RadixItem_ &item(swap[i]); - item.index = i; - - id object([self objectAtIndex:i]); - item.key = function(object, argument); - } - +static RadixItem_ *CYRadixSort(struct RadixItem_ *swap, size_t count) { struct RadixItem_ *lhs(swap), *rhs(swap + count); static const size_t width = 32; @@ -83,6 +70,42 @@ struct RadixItem_ { } delete [] hist; + return lhs; +} + +void CYRadixSortUsingFunction(id *self, size_t count, MenesRadixSortFunction function, void *argument) { + struct RadixItem_ *swap(new RadixItem_[count * 2]); + + for (size_t i(0); i != count; ++i) { + RadixItem_ &item(swap[i]); + item.index = i; + item.key = function(self[i], argument); + } + + auto lhs(CYRadixSort(swap, count)); + + const void **values(new const void *[count]); + for (size_t i(0); i != count; ++i) + values[i] = self[lhs[i].index]; + memcpy(self, values, count * sizeof(id)); + delete [] values; + + delete [] swap; +} + +@implementation NSMutableArray (MenesRadixSortWithSelector) + +- (void) radixSortUsingFunction:(MenesRadixSortFunction)function withContext:(void *)argument { + size_t count([self count]); + struct RadixItem_ *swap(new RadixItem_[count * 2]); + + for (size_t i(0); i != count; ++i) { + RadixItem_ &item(swap[i]); + item.index = i; + item.key = function([self objectAtIndex:i], argument); + } + + auto lhs(CYRadixSort(swap, count)); const void **values(new const void *[count]); for (size_t i(0); i != count; ++i) |