// codesnip-guard: DoublyLinkedList #[cfg_attr(any(),rustfmt::skip)]pub use self::doubly_linked_list::DoublyLinkedList;#[cfg_attr(any(),rustfmt::skip)]mod doubly_linked_list{#[doc=" Manages only prev/next links of indices."]#[doc=""]#[doc=" `usize::MAX` means no previous or next index."]#[derive(Debug,Clone)]pub struct DoublyLinkedList{prev:Vec,next:Vec}impl DoublyLinkedList{pub fn new(n:usize)->Self{Self{prev:vec![usize::MAX;n],next:vec![usize::MAX;n]}}pub fn len(&self)->usize{self.prev.len()}pub fn is_empty(&self)->bool{self.len()==0}pub fn prev(&self,index:usize)->usize{self.prev[index]}pub fn next(&self,index:usize)->usize{self.next[index]}#[doc=" Links `front` immediately before `back`."]#[doc=""]#[doc=" Panics if `front == back`, `front` already has a next index, or `back` already has a"]#[doc=" previous index."]pub fn link(&mut self,front:usize,back:usize){assert_ne!(front,back);assert_eq!(self.next[front],usize::MAX);assert_eq!(self.prev[back],usize::MAX);self.next[front]=back;self.prev[back]=front;}pub fn cut_before(&mut self,index:usize)->usize{let prev=self.prev[index];if prev!=usize::MAX{self.next[prev]=usize::MAX;self.prev[index]=usize::MAX;}prev}pub fn cut_after(&mut self,index:usize)->usize{let next=self.next[index];if next!=usize::MAX{self.prev[next]=usize::MAX;self.next[index]=usize::MAX;}next}#[doc=" Panics when removing an index from a two-node cycle."]pub fn detach(&mut self,index:usize)->(usize,usize){let prev=self.cut_before(index);let next=self.cut_after(index);if prev!=usize::MAX&&next!=usize::MAX{self.link(prev,next);}(prev,next)}}}