[libgee] TimSort: Fix sort of reference counted items
- From: Didier Villevalois <dvillevalois src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgee] TimSort: Fix sort of reference counted items
- Date: Sat, 24 Oct 2009 10:09:08 +0000 (UTC)
commit 06ec26321cd3a475ac10ca3d47a4e4dbb4e44e00
Author: Didier 'Ptitjes <ptitjes free fr>
Date: Sat Oct 24 03:52:51 2009 +0200
TimSort: Fix sort of reference counted items
gee/timsort.vala | 35 +++++++++++++++++------------------
1 files changed, 17 insertions(+), 18 deletions(-)
---
diff --git a/gee/timsort.vala b/gee/timsort.vala
index 933eb2b..1fbc10b 100644
--- a/gee/timsort.vala
+++ b/gee/timsort.vala
@@ -89,7 +89,7 @@ internal class Gee.TimSort<G> : Object {
private List<G> list_collection;
private G[] array;
- private unowned G[] list;
+ private void** list;
private int index;
private int size;
private Slice<G>*[] pending;
@@ -206,7 +206,7 @@ internal class Gee.TimSort<G> : Object {
for (int start = a->index + offset; start < a->index + a->length; start++) {
int left = a->index;
int right = start;
- G pivot = (owned) a->list[right];
+ void* pivot = a->list[right];
while (left < right) {
int p = left + ((right - left) >> 1);
@@ -218,8 +218,8 @@ internal class Gee.TimSort<G> : Object {
}
assert (left == right);
- a->list.move (left, left + 1, start - left);
- a->list[left] = (owned) pivot;
+ Memory.move (&a->list[left + 1], &a->list[left], sizeof (G) * (start - left));
+ a->list[left] = pivot;
}
}
@@ -645,29 +645,28 @@ internal class Gee.TimSort<G> : Object {
[Compact]
private class Slice<G> {
- public unowned G[] list;
- public G[]? new_list;
+ public void** list;
+ public void** new_list;
public int index;
public int length;
- public Slice (G[] list, int index, int length) {
+ public Slice (void** list, int index, int length) {
this.list = list;
this.index = index;
this.length = length;
}
public void copy () {
- new_list = new G[length];
- Memory.copy (&new_list[0], &list[index], sizeof (G) * length);
+ new_list = Memory.dup (&list[index], (uint) sizeof (G) * length);
list = new_list;
index = 0;
}
- public inline void merge_in (G[] dest_array, int index, int dest_index, int count) {
+ public inline void merge_in (void** dest_array, int index, int dest_index, int count) {
Memory.move (&dest_array[dest_index], &list[index], sizeof (G) * count);
}
- public inline void merge_in_reversed (G[] dest_array, int index, int dest_index, int count) {
+ public inline void merge_in_reversed (void** dest_array, int index, int dest_index, int count) {
Memory.move (&dest_array[dest_index], &list[index], sizeof (G) * count);
}
@@ -680,21 +679,21 @@ internal class Gee.TimSort<G> : Object {
length -= n;
}
- public inline unowned G pop_first () {
+ public inline void* pop_first () {
length--;
return list[index++];
}
- public inline unowned G pop_last () {
+ public inline void* pop_last () {
length--;
return list[index + length];
}
- public inline unowned G peek_first () {
+ public inline unowned void* peek_first () {
return list[index];
}
- public inline unowned G peek_last () {
+ public inline unowned void* peek_last () {
return list[index + length - 1];
}
@@ -707,9 +706,9 @@ internal class Gee.TimSort<G> : Object {
}
private inline void swap (int i, int j) {
- G temp = (owned) list[i];
- list[i] = (owned) list[j];
- list[j] = (owned) temp;
+ void* temp = list[i];
+ list[i] = list[j];
+ list[j] = temp;
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]