1use std::{fmt, mem::transmute, ptr::null_mut};
2
3pub struct EmbeddedListNode {
4 pub prev: *mut EmbeddedListNode,
5 pub next: *mut EmbeddedListNode,
6 l: *mut EmbeddedList,
7}
8
9unsafe impl Sync for EmbeddedListNode {}
10unsafe impl Send for EmbeddedListNode {}
11
12impl Default for EmbeddedListNode {
13 #[inline(always)]
14 fn default() -> Self {
15 Self { prev: null_mut(), next: null_mut(), l: null_mut() }
16 }
17}
18
19impl fmt::Debug for EmbeddedListNode {
20 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
21 write!(f, "(")?;
22
23 if !self.prev.is_null() {
24 write!(f, "prev: {:p} ", self.prev)?;
25 } else {
26 write!(f, "prev: none ")?;
27 }
28
29 if !self.next.is_null() {
30 write!(f, "next: {:p} ", self.next)?;
31 } else {
32 write!(f, "next: none ")?;
33 }
34 write!(f, ")")
35 }
36}
37
38pub struct EmbeddedList {
39 length: u64,
40 head: *mut EmbeddedListNode,
41 tail: *mut EmbeddedListNode,
42 node_offset: usize,
43}
44
45unsafe impl Sync for EmbeddedList {}
46unsafe impl Send for EmbeddedList {}
47
48impl fmt::Debug for EmbeddedList {
49 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
50 write!(f, "{{ length: {} ", self.length)?;
51
52 if !self.head.is_null() {
53 write!(f, "head: {:?} ", self.head)?;
54 } else {
55 write!(f, "head: none ")?;
56 }
57
58 if !self.tail.is_null() {
59 write!(f, "tail: {:?} ", self.tail)?;
60 } else {
61 write!(f, "tail: none ")?;
62 }
63
64 write!(f, "}}")
65 }
66}
67
68impl EmbeddedList {
69 #[inline(always)]
70 pub fn new(node_offset: usize) -> Self {
71 EmbeddedList { length: 0, head: null_mut(), tail: null_mut(), node_offset }
72 }
73
74 #[inline]
75 pub fn clear(&mut self) {
76 self.length = 0;
77 self.head = null_mut();
78 self.tail = null_mut();
79 }
80
81 #[inline(always)]
82 fn to_item_mut<T>(&self, data: *mut EmbeddedListNode) -> *mut T {
83 let off = unsafe { transmute::<*mut EmbeddedListNode, usize>(data) };
84 (off - self.node_offset) as *mut T
85 }
86
87 #[inline(always)]
88 pub fn get_length(&self) -> u64 {
89 return self.length;
90 }
91
92 #[inline(always)]
93 pub fn len(&self) -> usize {
94 return self.length as usize;
95 }
96
97 #[inline(always)]
98 pub fn remove(&mut self, del: &mut EmbeddedListNode) {
99 if del.l != self {
100 return;
101 }
102 self.remove_node(del);
103 }
104
105 #[inline(always)]
106 fn remove_node(&mut self, del: &mut EmbeddedListNode) {
107 let prev = del.prev;
108 let next = del.next;
109 if prev.is_null() {
110 self.head = next;
111 } else {
112 unsafe {
113 (*prev).next = next;
114 }
115 del.prev = null_mut();
116 }
117 if next.is_null() {
118 self.tail = prev;
119 } else {
120 unsafe {
121 (*next).prev = prev;
122 }
123 del.next = null_mut();
124 }
125 del.l = null_mut();
126 debug_assert!(del.next.is_null());
127 debug_assert!(del.prev.is_null());
128 self.length -= 1;
129 }
130
131 #[inline(always)]
132 pub fn peak(&mut self, node: &mut EmbeddedListNode) {
133 let node_raw = node as *mut EmbeddedListNode;
134 let head = self.head;
135 if head == node_raw {
136 return;
137 }
138 debug_assert!(!head.is_null());
139 let prev = node.prev;
141 let next = node.next;
142 debug_assert!(!prev.is_null());
143 unsafe {
144 (*head).prev = node_raw;
145 (*prev).next = next;
146 if next.is_null() {
147 self.tail = prev;
148 } else {
149 (*next).prev = prev;
150 }
151 }
152 node.next = head;
154 node.prev = null_mut();
155 self.head = node_raw;
156 }
157
158 #[inline]
159 pub fn push_front(&mut self, new_node: &mut EmbeddedListNode) {
160 let head = self.head;
161 new_node.next = head;
162 new_node.l = self as *mut EmbeddedList;
163 new_node.prev = null_mut();
164 if head.is_null() {
165 self.tail = new_node as *mut EmbeddedListNode;
166 } else {
167 unsafe {
168 (*head).prev = new_node as *mut EmbeddedListNode;
169 }
170 }
171 self.head = new_node as *mut EmbeddedListNode;
172 self.length += 1;
173 }
174
175 #[inline]
176 pub fn push_back(&mut self, new_node: &mut EmbeddedListNode) {
177 let tail = self.tail;
178 new_node.prev = tail;
180 new_node.l = self as *mut EmbeddedList;
181 new_node.next = null_mut();
182
183 if tail.is_null() {
184 self.head = new_node as *mut EmbeddedListNode;
185 } else {
186 unsafe {
187 (*tail).next = new_node as *mut EmbeddedListNode;
188 }
189 }
190 self.tail = new_node as *mut EmbeddedListNode;
191 self.length += 1;
192 }
193
194 #[inline]
195 pub fn pop_back<T>(&mut self) -> Option<*mut T> {
196 if self.tail.is_null() {
197 None
198 } else {
199 let item = self.to_item_mut(self.tail);
200 self.remove_node(unsafe { transmute(self.tail) });
201 Some(item)
202 }
203 }
204
205 #[inline]
206 pub fn pop_front<T>(&mut self) -> Option<*mut T> {
207 if self.head.is_null() {
208 None
209 } else {
210 let item = self.to_item_mut(self.head);
211 self.remove_node(unsafe { transmute(self.head) });
212 Some(item)
213 }
214 }
215
216 #[inline]
217 pub fn get_front<T>(&self) -> Option<&mut T> {
218 if self.head.is_null() {
219 None
220 } else {
221 Some(unsafe { transmute(self.to_item_mut::<T>(self.head)) })
222 }
223 }
224
225 #[inline]
226 pub fn get_back<T>(&self) -> Option<&mut T> {
227 if self.tail.is_null() {
228 None
229 } else {
230 Some(unsafe { transmute(self.to_item_mut::<T>(self.tail)) })
231 }
232 }
233
234 #[inline(always)]
235 pub fn remove_front(&mut self) {
236 if !self.head.is_null() {
237 self.remove_node(unsafe { transmute(self.head) });
238 }
239 }
240
241 #[inline(always)]
242 pub fn remove_back(&mut self) {
243 if !self.tail.is_null() {
244 self.remove_node(unsafe { transmute(self.tail) });
245 }
246 }
247
248 #[inline(always)]
249 pub fn is_front(&self, node: &mut EmbeddedListNode) -> bool {
250 if self.head.is_null() {
251 return false;
252 } else {
253 return self.head == node as *mut EmbeddedListNode;
254 }
255 }
256
257 #[inline]
258 pub fn has_node(&self, node: &EmbeddedListNode) -> bool {
259 node.l as *const EmbeddedList == self as *const EmbeddedList
260 }
261
262 pub fn print<T: std::fmt::Debug>(&self) {
263 println!("print list begin! length={}", self.length);
264 let mut node = self.head;
265 while !node.is_null() {
266 unsafe {
267 let node_item = self.to_item_mut::<T>(node);
268 println!("node={:?}", *node_item);
269 node = (*node).next;
270 }
271 }
272 println!("print list end:");
273 }
274
275 #[inline(always)]
277 pub fn iter<'a, T>(&'a self) -> EmbeddedListIterator<'a, T> {
278 EmbeddedListIterator { list: self, cur: null_mut(), phan: Default::default() }
279 }
280
281 #[inline(always)]
282 pub fn drain<'a, T>(&'a mut self) -> EmbeddedListDrainer<'a, T> {
283 EmbeddedListDrainer { list: self, phan: Default::default() }
284 }
285}
286
287pub struct EmbeddedListIterator<'a, T> {
288 list: &'a EmbeddedList,
289 cur: *mut EmbeddedListNode,
290 phan: std::marker::PhantomData<T>,
291}
292
293unsafe impl<'a, T> Sync for EmbeddedListIterator<'a, T> {}
294unsafe impl<'a, T> Send for EmbeddedListIterator<'a, T> {}
295
296impl<'a, T> Iterator for EmbeddedListIterator<'a, T> {
297 type Item = *mut T;
298
299 fn next(&mut self) -> Option<*mut T> {
300 if self.cur == null_mut() {
301 if self.list.head == null_mut() {
302 return None;
303 } else {
304 self.cur = self.list.head;
305 Some(self.list.to_item_mut::<T>(self.cur))
306 }
307 } else {
308 let next = unsafe { (*self.cur).next };
309 if next == null_mut() {
310 None
311 } else {
312 self.cur = next;
313 Some(self.list.to_item_mut::<T>(self.cur))
314 }
315 }
316 }
317}
318
319pub struct EmbeddedListDrainer<'a, T> {
320 list: &'a mut EmbeddedList,
321 phan: std::marker::PhantomData<T>,
322}
323
324unsafe impl<'a, T> Sync for EmbeddedListDrainer<'a, T> {}
325unsafe impl<'a, T> Send for EmbeddedListDrainer<'a, T> {}
326
327impl<'a, T> Iterator for EmbeddedListDrainer<'a, T> {
328 type Item = *mut T;
329
330 #[inline]
331 fn next(&mut self) -> Option<*mut T> {
332 self.list.pop_front::<T>()
333 }
334}
335
336#[cfg(test)]
337mod tests {
338 use super::*;
339
340 pub struct IntListNode {
341 pub value: i64,
342 pub node: EmbeddedListNode,
343 }
344
345 impl fmt::Debug for IntListNode {
346 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
347 write!(f, "{} {:#?}", self.value, self.node)
348 }
349 }
350
351 impl fmt::Display for IntListNode {
352 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
353 write!(f, "{}", self.value)
354 }
355 }
356
357 type IntLinkList = EmbeddedList;
358
359 fn new_intnode(i: i64) -> Box<IntListNode> {
360 Box::new(IntListNode { node: EmbeddedListNode::default(), value: i })
361 }
362
363 fn new_intlist() -> IntLinkList {
364 let off = std::mem::offset_of!(IntListNode, node);
365 EmbeddedList::new(off)
366 }
367
368 #[test]
369 fn list_push_back() {
370 println!();
371 let mut l = new_intlist();
372 println!("empty list:{:?}", l);
373 let mut node1 = new_intnode(1);
374 l.push_back(&mut node1.node);
375 let mut node2 = new_intnode(2);
376 l.push_back(&mut node2.node);
377 let mut node3 = new_intnode(3);
378 l.push_back(&mut node3.node);
379 println!("list:{:?}", l);
380 l.print::<IntListNode>();
381
382 assert_eq!(3, l.get_length());
383
384 assert!(node1.node.prev.is_null());
386 assert_eq!(node1.node.next, &mut node2.node as *mut EmbeddedListNode);
387
388 assert_eq!(node2.node.prev, &mut node1.node as *mut EmbeddedListNode);
390 assert_eq!(node2.node.next, &mut node3.node as *mut EmbeddedListNode);
391
392 assert_eq!(node3.node.prev, &mut node2.node as *mut EmbeddedListNode);
394 assert!(node3.node.next.is_null());
395
396 assert!(l.is_front(&mut node1.node));
397
398 l.peak(&mut node2.node);
400 println!("list:{:?}", l);
401 l.print::<IntListNode>();
402
403 assert!(node2.node.prev.is_null());
405 assert_eq!(node2.node.next, &mut node1.node as *mut EmbeddedListNode);
406
407 assert_eq!(node1.node.prev, &mut node2.node as *mut EmbeddedListNode);
409 assert_eq!(node1.node.next, &mut node3.node as *mut EmbeddedListNode);
410
411 assert_eq!(node3.node.prev, &mut node1.node as *mut EmbeddedListNode);
413 assert!(node3.node.next.is_null());
414
415 assert!(l.is_front(&mut node2.node));
416
417 l.peak(&mut node3.node);
419 println!("list:{:?}", l);
420 l.print::<IntListNode>();
421
422 assert!(node3.node.prev.is_null());
424 assert_eq!(node3.node.next, &mut node2.node as *mut EmbeddedListNode);
425
426 assert_eq!(node2.node.prev, &mut node3.node as *mut EmbeddedListNode);
428 assert_eq!(node2.node.next, &mut node1.node as *mut EmbeddedListNode);
429
430 assert_eq!(node1.node.prev, &mut node2.node as *mut EmbeddedListNode);
432 assert!(node1.node.next.is_null());
433
434 assert!(l.is_front(&mut node3.node));
435
436 l.peak(&mut node3.node);
438 println!("list:{:?}", l);
439 l.print::<IntListNode>();
440
441 assert!(node3.node.prev.is_null());
443 assert_eq!(node3.node.next, &mut node2.node as *mut EmbeddedListNode);
444
445 assert_eq!(node2.node.prev, &mut node3.node as *mut EmbeddedListNode);
447 assert_eq!(node2.node.next, &mut node1.node as *mut EmbeddedListNode);
448
449 assert_eq!(node1.node.prev, &mut node2.node as *mut EmbeddedListNode);
451 assert!(node1.node.next.is_null());
452
453 assert!(l.is_front(&mut node3.node));
454 }
455
456 #[test]
457 fn list_push_front() {
458 println!();
459 let mut l = new_intlist();
460 println!("empty list:{:?}", l);
461 let mut node3 = new_intnode(3);
462 l.push_front(&mut node3.node);
463 let mut node2 = new_intnode(2);
464 l.push_front(&mut node2.node);
465 let mut node1 = new_intnode(1);
466 l.push_front(&mut node1.node);
467 println!("list:{:?}", l);
468 l.print::<IntListNode>();
469
470 assert_eq!(3, l.get_length());
471
472 assert!(node1.node.prev.is_null());
474 assert_eq!(node1.node.next, &mut node2.node as *mut EmbeddedListNode);
475
476 assert_eq!(node2.node.prev, &mut node1.node as *mut EmbeddedListNode);
478 assert_eq!(node2.node.next, &mut node3.node as *mut EmbeddedListNode);
479
480 assert_eq!(node3.node.prev, &mut node2.node as *mut EmbeddedListNode);
482 assert!(node3.node.next.is_null());
483
484 assert!(l.is_front(&mut node1.node));
485 }
486
487 #[test]
488 fn list_remove_node() {
489 println!();
490 let mut l = new_intlist();
491 println!("empty list:{:?}", l);
492 let mut node1 = new_intnode(1);
493 l.push_back(&mut node1.node);
494 let mut node2 = new_intnode(2);
495 l.push_back(&mut node2.node);
496 let mut node3 = new_intnode(3);
497 l.push_back(&mut node3.node);
498 println!("list:{:?}", l);
499 l.print::<IntListNode>();
500
501 assert_eq!(3, l.get_length());
502
503 l.remove(&mut node2.node);
505 assert_eq!(2, l.get_length());
506 println!("after remove node2...");
507 println!("list:{:?}", l);
508 l.print::<IntListNode>();
509
510 assert!(node1.node.prev.is_null());
512 assert_eq!(node1.node.next, &mut node3.node as *mut EmbeddedListNode);
513
514 assert!(node2.node.prev.is_null());
516 assert!(node2.node.next.is_null());
517
518 assert_eq!(node3.node.prev, &mut node1.node as *mut EmbeddedListNode);
520 assert!(node3.node.next.is_null());
521
522 assert_eq!(l.head, &mut node1.node as *mut EmbeddedListNode);
524 assert_eq!(l.tail, &mut node3.node as *mut EmbeddedListNode);
525
526 l.remove(&mut node1.node);
528 assert_eq!(1, l.get_length());
529 println!("after remove node1...");
530 println!("list:{:?}", l);
531 l.print::<IntListNode>();
532
533 assert!(node1.node.prev.is_null());
535 assert!(node1.node.next.is_null());
536
537 assert!(node3.node.prev.is_null());
539 assert!(node3.node.next.is_null());
540
541 assert_eq!(l.head, &mut node3.node as *mut EmbeddedListNode);
543 assert_eq!(l.tail, &mut node3.node as *mut EmbeddedListNode);
544
545 assert!(node1.node.l.is_null());
546 l.remove(&mut node1.node);
548 assert_eq!(1, l.get_length());
549
550 l.remove(&mut node3.node);
552 assert_eq!(0, l.get_length());
553 println!("after remove node3...");
554 println!("list:{:?}", l);
555 l.print::<IntListNode>();
556
557 assert!(node3.node.prev.is_null());
559 assert!(node3.node.next.is_null());
560
561 assert!(l.head.is_null());
563 assert!(l.tail.is_null());
564 }
565
566 #[test]
567 fn list_pop_front() {
568 println!();
569 let mut l = new_intlist();
570 println!("empty list:{:?}", l);
571 let mut node1 = new_intnode(1);
572 l.push_back(&mut node1.node);
573 let mut node2 = new_intnode(2);
574 l.push_back(&mut node2.node);
575 let mut node3 = new_intnode(3);
576 l.push_back(&mut node3.node);
577 println!("list:{:?}", l);
578 l.print::<IntListNode>();
579
580 let del_node = l.pop_front::<IntListNode>();
581 assert_eq!(2, l.get_length());
582 println!("after pop front...");
583 println!("list:{:?}", l);
584 l.print::<IntListNode>();
585
586 assert!(del_node.is_some());
587 unsafe {
588 assert_eq!((*del_node.unwrap()).value, 1);
589 }
590
591 assert_eq!(l.head, &mut node2.node as *mut EmbeddedListNode);
593 assert_eq!(l.tail, &mut node3.node as *mut EmbeddedListNode);
594 }
595
596 #[test]
597 fn list_pop_back() {
598 println!();
599 let mut l = new_intlist();
600 println!("empty list:{:?}", l);
601 let mut node1 = new_intnode(1);
602 l.push_back(&mut node1.node);
603 let mut node2 = new_intnode(2);
604 l.push_back(&mut node2.node);
605 let mut node3 = new_intnode(3);
606 l.push_back(&mut node3.node);
607 println!("list:{:?}", l);
608 l.print::<IntListNode>();
609
610 let del_node = l.pop_back::<IntListNode>();
611 assert_eq!(2, l.get_length());
612 println!("after pop back...");
613 println!("list:{:?}", l);
614 l.print::<IntListNode>();
615
616 assert!(del_node.is_some());
618 unsafe {
619 assert_eq!((*del_node.unwrap()).value, 3);
620 }
621
622 assert_eq!(l.head, &mut node1.node as *mut EmbeddedListNode);
624 assert_eq!(l.tail, &mut node2.node as *mut EmbeddedListNode);
625 }
626
627 #[test]
628 fn list_iter() {
629 println!();
630 let mut l = new_intlist();
631 let mut count = 0;
632 for _item in l.iter::<IntListNode>() {
633 count += 1;
634 }
635 assert_eq!(count, 0);
636 let mut node1 = new_intnode(1);
637 l.push_back(&mut node1.node);
638 let mut node2 = new_intnode(2);
639 l.push_back(&mut node2.node);
640 let mut node3 = new_intnode(3);
641 l.push_back(&mut node3.node);
642 for _item in l.iter::<IntListNode>() {
643 count += 1;
644 println!("{}", unsafe { (*_item).value });
645 }
646 assert_eq!(count, 3);
647 }
648
649 #[test]
650 fn push_front_pop_front_one() {
651 let mut l = new_intlist();
652 let mut node1 = new_intnode(1);
653 l.push_front(&mut node1.node);
654 let del_node = l.pop_front::<IntListNode>();
655 unsafe {
656 assert_eq!((*del_node.unwrap()).value, 1);
657 }
658 assert_eq!(0, l.get_length());
659 assert!(l.pop_front::<IntListNode>().is_none());
660 }
661
662 #[test]
663 fn push_front_pop_back_one() {
664 let mut l = new_intlist();
665 let mut node1 = new_intnode(1);
666 l.push_front(&mut node1.node);
667 let del_node = l.pop_back::<IntListNode>();
668 unsafe {
669 assert_eq!((*del_node.unwrap()).value, 1);
670 }
671 assert_eq!(0, l.get_length());
672 assert!(l.pop_front::<IntListNode>().is_none());
673 }
674
675 #[test]
676 fn push_back_pop_front_one() {
677 let mut l = new_intlist();
678 let mut node1 = new_intnode(1);
679 l.push_back(&mut node1.node);
680 let del_node = l.pop_front::<IntListNode>();
681 unsafe {
682 assert_eq!((*del_node.unwrap()).value, 1);
683 }
684 assert_eq!(0, l.get_length());
685 assert!(l.pop_front::<IntListNode>().is_none());
686 }
687
688 #[test]
689 fn push_back_pop_back_one() {
690 let mut l = new_intlist();
691 let mut node1 = new_intnode(1);
692 l.push_back(&mut node1.node);
693 let del_node = l.pop_back::<IntListNode>();
694 unsafe {
695 assert_eq!((*del_node.unwrap()).value, 1);
696 }
697 assert_eq!(0, l.get_length());
698 assert!(l.pop_back::<IntListNode>().is_none());
699 }
700}