dakv_skiplist/
skipnode.rs1use crate::{Arena, K_MAX_HEIGHT};
2use bytes::Bytes;
3use std::fmt::{Error, Formatter};
4use std::sync::atomic::{AtomicPtr, Ordering};
5use std::{fmt, mem, ptr};
6
7pub struct Node {
8 pub data: Bytes,
9 pub forward: [AtomicPtr<Self>; K_MAX_HEIGHT],
10}
11
12impl Node {
13 #[allow(clippy::mut_from_ref)]
14 pub fn new<A: Arena>(data: Bytes, height: usize, arena: &A) -> &mut Self {
15 let size = mem::size_of::<Self>() - (K_MAX_HEIGHT - height) * mem::size_of::<AtomicPtr<Self>>(); let ptr = arena.alloc(size) as *mut Node;
19
20 unsafe {
21 let node = &mut *ptr;
22 ptr::write(&mut node.data, data);
23 ptr::write_bytes(node.forward.as_mut_ptr(), 0, height);
24 node
25 }
26 }
27
28 #[allow(clippy::mut_from_ref)]
29 pub fn head<A: Arena>(arena: &A) -> &mut Self {
30 Self::new(Bytes::new(), K_MAX_HEIGHT, arena)
31 }
32
33 #[inline]
34 pub fn set_next(&self, n: usize, node: *mut Node) {
35 self.forward[n].store(node, Ordering::SeqCst);
36 }
37
38 #[inline]
39 pub fn get_next(&self, n: usize) -> *mut Node {
40 self.forward[n].load(Ordering::SeqCst)
41 }
42}
43
44impl fmt::Display for Node {
45 fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
46 write!(f, "{:?}", self.data.as_ref())
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::Node;
53 use crate::ArenaImpl;
54
55 #[test]
56 fn test_new_node() {
57 let arena = ArenaImpl::new();
58
59 let node = Node::head(&arena);
60 assert_eq!(format!("{}", node), "[]");
61
62 let node = Node::new("da".into(), 0, &arena);
63 assert_eq!(format!("{}", node), "[100, 97]");
64 }
65
66 #[test]
67 fn test_next() {
68 let arena = ArenaImpl::new();
69
70 let node = Node::new(vec![1].into(), 3, &arena);
71 let next = Node::new(vec![2].into(), 4, &arena);
72 let tail = Node::new(vec![3].into(), 1, &arena);
73 node.set_next(2, next);
74 let ret = node.get_next(1);
75 assert!(ret.is_null());
76 let ret = node.get_next(2);
77 assert!(!ret.is_null());
78 unsafe {
79 assert_eq!((*ret).data.as_ref(), &[2]);
80 }
81
82 next.set_next(3, tail);
83 let v = next.get_next(3);
84 unsafe {
85 assert_eq!((*v).data.as_ref(), &[3]);
86 }
87 }
88}