1pub mod noloss;
2
3use std::cell::UnsafeCell;
4use std::sync::Arc;
5use super::cb::{CircularBuffer, CircularBufferIterator};
6
7pub struct Sender<T> {
8 inner: Arc<UnsafeCell<CircularBuffer<T>>>,
9}
10
11unsafe impl<T> Send for Sender<T> { }
12
13pub struct Receiver<T> {
14 inner: Arc<UnsafeCell<CircularBuffer<T>>>,
15}
16
17unsafe impl<T> Send for Receiver<T> { }
18
19pub fn channel<T: Send>(size : usize) -> (Sender<T>, Receiver<T>) {
20 let a = Arc::new(UnsafeCell::new(CircularBuffer::new(size)));
21 (Sender::new(a.clone()), Receiver::new(a))
22}
23
24impl<T: Send> Sender<T> {
25 fn new(inner: Arc<UnsafeCell<CircularBuffer<T>>>) -> Sender<T> {
26 Sender { inner: inner, }
27 }
28
29 #[inline(always)]
30 pub fn put<F>(&mut self, setter: F) -> usize
31 where F : FnMut(&mut Option<T>) {
32 unsafe { (*self.inner.get()).put(setter) }
33 }
34
35 #[inline(always)]
36 pub fn tmp<F>(&mut self, setter: F)
37 where F : FnMut(&mut Option<T>){
38 unsafe { (*self.inner.get()).tmp(setter) }
39 }
40
41 #[inline(always)]
42 pub fn seqno(&self) -> usize{
43 unsafe { (*self.inner.get()).seqno() }
44 }
45}
46
47impl<T: Send> Receiver<T> {
48 fn new(inner: Arc<UnsafeCell<CircularBuffer<T>>>) -> Receiver<T> {
49 Receiver { inner: inner, }
50 }
51
52 #[inline(always)]
53 pub fn iter(&mut self) -> CircularBufferIterator<T> {
54 unsafe { (*self.inner.get()).iter() }
55 }
56
57 #[inline(always)]
58 pub fn seqno(&self) -> usize{
59 unsafe { (*self.inner.get()).seqno() }
60 }
61}
62
63#[cfg(test)]
64pub mod tests;