1
Fork 0

Make staged versions of the functions that use uninit

This commit is contained in:
James Miller 2013-05-09 23:05:17 +12:00
parent f5ab112e6b
commit 57509709b4
4 changed files with 184 additions and 0 deletions

View file

@ -132,6 +132,7 @@ pub impl <T:Ord> PriorityQueue<T> {
// vector over the junk element. This reduces the constant factor
// compared to using swaps, which involves twice as many moves.
#[cfg(not(stage0))]
priv fn siftup(&mut self, start: uint, mut pos: uint) {
unsafe {
let new = *ptr::to_unsafe_ptr(&self.data[pos]);
@ -151,6 +152,28 @@ pub impl <T:Ord> PriorityQueue<T> {
}
}
#[cfg(stage0)]
priv fn siftup(&mut self, start: uint, mut pos: uint) {
unsafe {
let new = *ptr::to_unsafe_ptr(&self.data[pos]);
while pos > start {
let parent = (pos - 1) >> 1;
if new > self.data[parent] {
let mut x = rusti::init();
x <-> self.data[parent];
rusti::move_val_init(&mut self.data[pos], x);
pos = parent;
loop
}
break
}
rusti::move_val_init(&mut self.data[pos], new);
}
}
#[cfg(not(stage0))]
priv fn siftdown_range(&mut self, mut pos: uint, end: uint) {
unsafe {
let start = pos;
@ -174,6 +197,30 @@ pub impl <T:Ord> PriorityQueue<T> {
}
}
#[cfg(stage0)]
priv fn siftdown_range(&mut self, mut pos: uint, end: uint) {
unsafe {
let start = pos;
let new = *ptr::to_unsafe_ptr(&self.data[pos]);
let mut child = 2 * pos + 1;
while child < end {
let right = child + 1;
if right < end && !(self.data[child] > self.data[right]) {
child = right;
}
let mut x = rusti::init();
x <-> self.data[child];
rusti::move_val_init(&mut self.data[pos], x);
pos = child;
child = 2 * pos + 1;
}
rusti::move_val_init(&mut self.data[pos], new);
self.siftup(start, pos);
}
}
priv fn siftdown(&mut self, pos: uint) {
let len = self.len();
self.siftdown_range(pos, len);