Skip to content

Instantly share code, notes, and snippets.

@nidev
Created April 1, 2017 05:23
Show Gist options
  • Save nidev/4af0cdfeb706ea89a3d116332a351890 to your computer and use it in GitHub Desktop.
Save nidev/4af0cdfeb706ea89a3d116332a351890 to your computer and use it in GitHub Desktop.
It loops!
use std::mem;
use std::ptr;
type Link<T> = *mut DoubleLinkNode<T>;
struct DoubleLinkNode<T> {
prev: Link<T>,
next: Link<T>,
value: T
}
impl<T> DoubleLinkNode<T> where T: std::fmt::Debug {
fn push_back(&mut self, value: T) {
let mut juggling: Link<T> = self as *mut Self;
loop {
unsafe {
if (*juggling).next.is_null() {
println!("found null, stop loop.");
break;
}
else {
let tmp_ptr: Link<T> = (*juggling).next;
println!("found not-null. move to next <- {:?}", (*tmp_ptr).value);
juggling = (*juggling).next;
}
}
}
unsafe {
println!("assign <- {:?}", value);
(*juggling).next = &mut DoubleLinkNode { prev: juggling as *mut DoubleLinkNode<T>, next:ptr::null_mut::<DoubleLinkNode<T>>(), value:value } as *mut DoubleLinkNode<T>;
}
}
}
fn main() {
let mut l1: DoubleLinkNode<i32> = DoubleLinkNode { prev: ptr::null_mut::<DoubleLinkNode<i32>>(), next: ptr::null_mut::<DoubleLinkNode<i32>>(), value:1 };
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
l1.push_back(5);
println!("{}", l1.value);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment