#![allow(unused_macros)]
#![allow(dead_code)]
use std::rc::Rc;
use std::cell::Cell;
use std::marker::PhantomData;
use std::fmt;
use std::fmt::Formatter;
use std::result::Result;
use std::default::Default;
pub type Cursor<N,S> = Option<Pointer<N,S>>;
type ListID = (std::thread::ThreadId, usize);
pub struct Link<N, S> where S : Selector<Node=N> {
pn : [ Cell<Cursor<N, S>> ; 2 ],
#[cfg(debug_assertions)] busy : Cell<Option<ListID>>,
}
pub struct List<N, S> where S : Selector<Node=N> {
ht : [ Cursor<N, S> ; 2 ],
#[cfg(debug_assertions)] id : ListID,
}
pub struct Pointer<N, S> where S : Selector<Node=N> + Clone {
node : Rc<N>, selector : S,
}
pub struct ListIterator<N,S : Selector<Node=N>> (Cursor<N,S>);
pub trait Selector : Sized + Copy {
type Node;
fn link(node : &Self::Node, selector : Self) -> &Link<Self::Node, Self>;
}
pub trait SelectorFmt : Selector {
fn fmt(&self, f : &mut Formatter) -> Result<(), fmt::Error>;
}
#[macro_export]
macro_rules! DlistDefineStaticSelector {
( $S:ident, $N:ty [ $($x:tt)* ]) => {
#[derive(Debug,Copy,Clone,PartialEq,Eq,Default)]
struct $S { }
DlistImplSelector!($S, $N, _s [ $($x)* ]);
}
}
#[macro_export]
macro_rules! DlistImplSelector {
($(+( $($typar:tt)* ))* $S:ty, $N:ty, $s:ident [ $($x:tt)* ])
=> {
impl $( $($typar)* )* $crate::dlist::Selector for $S {
type Node = $N;
fn link(n : &$N, $s : $S) -> &Link<$N,$S> { &( n $($x)* ) }
}
}
}
macro_rules! DefinePairArrayIndex {
{ $Enum:ident; $False:ident; $True:ident } => {
enum $Enum { $False, $True }
use self::$Enum::{$False,$True};
impl std::ops::BitXor<bool> for $Enum {
type Output = PairArrayIndexGeneralised<$Enum>;
fn bitxor(self, flip : bool) -> Self::Output {
PairArrayIndexGeneralised(
((self as usize) != 0) ^ flip,
std::marker::PhantomData,
)
}
}
impl $Enum {
fn index(s : PairArrayIndexGeneralised<$Enum>) -> usize {
s.0 as usize
}
}
}
}
struct PairArrayIndexGeneralised<T> (bool, std::marker::PhantomData<T>);
DefinePairArrayIndex!{ HT; HEAD; TAIL }
DefinePairArrayIndex!{ PN; PREV; NEXT }
fn clone_option_cell<T:Clone>(c : &Cell<Option<T>>) -> Option<T> {
let r = c.replace(None);
c.set(r.clone());
r
}
macro_rules! link {
($ptr:expr) => (<S as Selector>::link (&$ptr.node, $ptr.selector))
}
macro_rules! get {
($ptr:expr, $pn:expr) => (
clone_option_cell( &link!($ptr).pn[PN::index($pn)]) )
}
macro_rules! set {
($ptr:expr, $pn:expr, $nv:expr) => (
link!($ptr).pn[PN::index($pn)].set($nv)
)
}
macro_rules! end {
($list:expr, $ht:expr) => ( $list.ht[HT::index($ht)] )
}
macro_rules! setLinkB {
($ent:expr, $prev:expr,$next:expr, $rev:expr, $list:expr,) => (
setLinkB!($ent,$prev,$next,$rev,$list)
);
($ent:expr, $prev:expr,$next:expr, $rev:expr, $list:expr) => (
set!($ent,PREV^$rev, $prev);
set!($ent,NEXT^$rev, $next);
#[cfg(debug_assertions)] { link!($ent).busy.set( Some($list.id) ) };
)
}
macro_rules! setLinkI {
($ent:expr) => (
set!($ent,PREV^false, None);
set!($ent,NEXT^false, None);
#[cfg(debug_assertions)] { link!($ent).busy.set(None) };
)
}
#[cfg(debug_assertions)]
macro_rules! assert_busy{($p:expr,$i:expr)=>($p.debug_assert_busy(Some($i)) )}
macro_rules! assert_idle{($p:expr )=>($p.debug_assert_busy(None ) )}
#[cfg(not(debug_assertions))]
macro_rules! assert_busy{($p:expr,$i:expr)=>() }
macro_rules! imp {
{ $N:ident, $LE:ident, $tr:path, for $T:ident { $($body:tt)* } } =>
{ impl<$N, $LE : Selector<Node=$N>> $tr for $T<$N, $LE> { $($body)* } };
{ $N:ident, $LE:ident, $T:ident { $($body:tt)* } } =>
{ impl<$N, $LE : Selector<Node=$N>> $T<$N, $LE> { $($body)* } };
}
imp!{ N,S, Link {
pub fn new() -> Self { Link {
pn : [ Cell::new(None), Cell::new(None) ],
#[cfg(debug_assertions)] busy : Cell::new(None)
} }
}}
imp!{ N,S, Pointer {
pub fn new(p : &Rc<N>) -> Pointer<N, S> where S : Default {
Pointer::with_selector(p, Default::default())
}
pub fn with_selector(p : &Rc<N>, selector : S) -> Pointer<N, S> {
Pointer { node : p.clone(), selector }
}
pub fn from_data(data : N, selector : S) -> Pointer<N, S> {
Pointer { node : Rc::new(data), selector }
}
pub fn selector(&self) -> S { self.selector }
pub fn ptr_eq(a : &Pointer<N,S>, b : &Pointer<N,S>) -> bool
where S : PartialEq
{
Rc::ptr_eq(&a.node, &b.node) && a.selector == b.selector
}
pub fn cursor_eq(a : &Cursor<N,S>, b : &Cursor<N,S>) -> bool
where S : PartialEq
{
match (a, b) {
(None, None ) => true,
(Some(ref a), Some(ref b)) => Pointer::ptr_eq(a,b),
_ => false,
}
}
pub fn iter_at(&self) -> ListIterator<N,S> { ListIterator(
Some(self.clone())
)}
pub fn get_next_prev(&self, rev : bool) -> Cursor<N,S> {
get!(self,NEXT^rev)
}
#[allow(unused_variables)]
fn debug_assert_busy(&self, expected : Option<&ListID>) {
#[cfg(debug_assertions)] {
let got = link!(self).busy.get();
debug_assert_eq!(got.as_ref(), expected);
}
}
}}
fn set_next_prev<N,S : Selector<Node=N>> (
of : &Pointer<N,S>,
to : Cursor<N,S>,
head : &mut List<N,S>,
rev : bool
) {
match get!(of,NEXT^rev) {
None => {
end!(head,TAIL^rev) = to;
},
Some(ref next) => {
set!(next,PREV^rev, to);
},
}
}
imp!{ N,S, List {
pub fn new() -> Self {
List { ht : [ None, None],
#[cfg(debug_assertions)] id : {
use std::cell::Cell;
thread_local!{
static COUNTER : Cell<usize> = Cell::new(0);
}
(std::thread::current().id(),
COUNTER.with(|p| {
let r = p.get();
p.set(r + 1);
r
}))
}
}
}
pub fn is_empty(&self) -> bool { end!(self,HEAD^false).is_none() }
pub fn first_last(&self, tail : bool) -> Cursor<N,S> {
end!(self,HEAD^tail).clone()
}
pub fn first(&self) -> Cursor<N,S> { self.first_last(false) }
pub fn last (&self) -> Cursor<N,S> { self.first_last(true ) }
pub fn iter(&self) -> ListIterator<N,S> {
ListIterator( self.first_last(false) )
}
pub fn insert(&mut self,
new_entry : &Pointer<N,S>,
location : &Pointer<N,S>,
after : bool,
)
{
assert_idle!(new_entry);
assert_busy!(location, &self.id);
setLinkB!(
new_entry,
get!(location, PREV^after),
Some(location.clone()),
after,
self,
);
set!(location, PREV^after, Some(new_entry.clone()));
set_next_prev(new_entry, Some(new_entry.clone()), self, !after);
}
pub fn push_at(&mut self, new_entry : &Pointer<N,S>, tail : bool) {
assert_idle!(new_entry);
setLinkB!(
new_entry,
None,
end!(self,HEAD^tail).clone(),
tail,
self,
);
end!(self,HEAD^tail) = Some(new_entry.clone());
set_next_prev(new_entry, Some(new_entry.clone()), self, tail);
}
pub fn push_front(&mut self, n : &Pointer<N,S>) { self.push_at(n,false) }
pub fn push_back (&mut self, n : &Pointer<N,S>) { self.push_at(n,true ) }
pub fn pop_at(&mut self, tail : bool) -> Cursor<N,S> {
let was = end!(self,HEAD^tail).clone();
if let Some(ref node) = was {
set_next_prev(node, None, self, tail);
end!(self,HEAD^tail) = None;
setLinkI!(node);
}
was
}
pub fn pop_front(&mut self) -> Cursor<N,S> { self.pop_at(false) }
pub fn pop_back (&mut self) -> Cursor<N,S> { self.pop_at(true ) }
pub fn remove(&mut self, item : &Pointer<N,S>) {
assert_busy!(item, &self.id);
for &rev in &[false,true] {
set_next_prev(item, get!(item,PREV^rev), self, rev);
}
setLinkI!(item);
}
pub fn clear(&mut self) {
let mut node = end!(self,HEAD^false).clone();
while node.is_some() {
let inner = node.unwrap();
let next_node = get!(inner,NEXT^false);
setLinkI!(inner);
node = next_node;
}
self.ht = [ None, None ];
}
}}
imp!{N,S, Drop, for List {
fn drop(&mut self) { self.clear() }
}}
imp!{ N,S, ListIterator {
pub fn walk(&mut self, rev : bool) {
let c = self.0.as_ref().and_then(
|p| p.get_next_prev(rev)
);
*self = ListIterator(c);
}
pub fn next_prev(&mut self, rev : bool) -> Cursor<N,S> {
let was = self.0.clone();
self.walk(rev);
was
}
pub fn cursor(&self) -> Cursor<N,S> { self.0.clone() }
pub fn from_cursor(c : Cursor<N,S>) -> Self { ListIterator(c) }
}}
imp!{ N,S, Iterator, for ListIterator {
type Item = Pointer<N,S>;
fn next(&mut self) -> Option<Pointer<N,S>> { self.next_prev(false) }
}}
imp!{ N,S, std::ops::Deref , for ListIterator {
type Target = Cursor<N,S>;
fn deref (& self) -> & Cursor<N,S> { & self.0 }
}}
imp!{ N,S, std::ops::DerefMut, for ListIterator {
fn deref_mut(&mut self) -> &mut Cursor<N,S> { &mut self.0 }
}}
imp!{ N,S, std::iter::FusedIterator, for ListIterator {
}}
impl<'l, N, S : Selector<Node=N>> IntoIterator for &'l List<N,S> {
type Item = Pointer<N,S>;
type IntoIter = ListIterator<N,S>;
fn into_iter(self) -> ListIterator<N,S> { self.iter() }
}
imp!{ N,S, Clone, for Pointer {
fn clone(&self) -> Self { Pointer { node : self.node.clone(), ..*self } }
}}
imp!{ N,S, std::ops::Deref, for Pointer {
type Target = Rc<N>;
fn deref (& self) -> & Rc<N> { & self.node }
}}
imp!{ N,S, std::ops::DerefMut, for Pointer {
fn deref_mut(&mut self) -> &mut Rc<N> { &mut self.node }
}}
imp!{ N,S, Default, for Link { fn default() -> Self { Link ::new() } }}
imp!{ N,S, Default, for List { fn default() -> Self { List ::new() } }}
impl<N,S : Selector<Node=N> + SelectorFmt> fmt::Pointer for Pointer<N,S> {
fn fmt(&self, f : &mut Formatter) -> Result<(), fmt::Error> {
write!(f,"{:p}", self.node)?;
SelectorFmt::fmt(&self.selector, f)?;
Ok(())
}
}
impl<N,S : Selector<Node=N> + fmt::Debug> fmt::Debug for Pointer<N,S> {
fn fmt(&self, f : &mut Formatter) -> Result<(), fmt::Error> {
write!(f,"Pointer({:p}, {:?})", &self.node, &self.selector)
}
}
impl<N,S> From<Rc<N>> for Pointer<N,S>
where S : Default + Selector<Node=N> {
fn from(p : Rc<N>) -> Pointer<N,S> { Pointer {
node : p,
selector : Default::default()
}}
}
impl<'a,N,S> From<&'a Rc<N>> for Pointer<N,S>
where S : Default + Selector<Node=N>
{
fn from(p : &Rc<N>) -> Pointer<N,S> { Self::from(p.clone()) }
}
impl<N,S : Default + Selector<Node=N>> From<N> for Pointer<N,S> {
fn from(data : N) -> Pointer<N,S> { From::from( Rc::new( data ))}
}
pub type List1<T> = List<Node1<T>,List1Selector<T>>;
pub struct Node1<T> {
data : T,
ll : Link<
Node1<T>,
List1Selector<T>,
>,
}
pub type Pointer1<T> = Pointer<Node1<T>,List1Selector<T>>;
pub type Cursor1<T> = Option<Pointer1<T>>;
#[derive(Eq,PartialEq,Debug)]
pub struct List1Selector<T> { marker : PhantomData<T> }
DlistImplSelector!(+(<T>) List1Selector<T>, Node1<T>, _s [ .ll ]);
impl<T> Default for List1Selector<T> {
fn default() -> List1Selector<T> { List1Selector { marker : PhantomData } }
}
impl<T> SelectorFmt for List1Selector<T> {
fn fmt(&self, _f : &mut Formatter) -> Result<(), fmt::Error> { Ok(()) }
}
impl<T> Copy for List1Selector<T> {
}
impl<T> Clone for List1Selector<T> {
fn clone(&self) -> Self { *self }
}
impl<T> Node1<T> {
pub fn new(data : T) -> Self {
Node1 { data, ll : Default::default() }
}
pub fn pointer(data : T) -> Pointer1<T> { From::from( data ) }
}
impl<T> Default for Node1<T> where T : Default {
fn default() -> Node1<T> { Node1::new( T::default() ) }
}
impl<T> std::ops::Deref for Node1<T> {
type Target = T;
fn deref (& self) -> & T { & self.data }
}
impl<T> std::ops::DerefMut for Node1<T> {
fn deref_mut(&mut self) -> &mut T { &mut self.data }
}
impl<T> From<T> for Pointer1<T> {
fn from(data : T) -> Pointer1<T> {
Pointer::new( &Rc::new( Node1::new( data )))
}
}
mod test;