Skip to content

Commit 4efa147

Browse files
authored
Merge pull request #9 from abonander/master
Manually implement `Clone` for `MPMCFut*` types
2 parents 3008f14 + 998c381 commit 4efa147

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

src/mpmc.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,12 @@ pub struct MPMCUniReceiver<T> {
8585

8686
/// This is the futures-compatible version of ```MPMCSender```
8787
/// It implements Sink
88-
#[derive(Clone)]
8988
pub struct MPMCFutSender<T> {
9089
sender: FutInnerSend<MPMC<T>, T>,
9190
}
9291

9392
/// This is the futures-compatible version of ```MPMCReceiver```
9493
/// It implements Stream
95-
#[derive(Clone)]
9694
pub struct MPMCFutReceiver<T> {
9795
receiver: FutInnerRecv<MPMC<T>, T>,
9896
}
@@ -512,6 +510,14 @@ impl<R, F: FnMut(&T) -> R, T> MPMCFutUniReceiver<R, F, T> {
512510
}
513511
}
514512

513+
impl<T> Clone for MPMCFutSender<T> {
514+
fn clone(&self) -> Self {
515+
MPMCFutSender {
516+
sender: self.sender.clone(),
517+
}
518+
}
519+
}
520+
515521
impl<T> Sink for MPMCFutSender<T> {
516522
type SinkItem = T;
517523
type SinkError = SendError<T>;
@@ -527,6 +533,14 @@ impl<T> Sink for MPMCFutSender<T> {
527533
}
528534
}
529535

536+
impl<T> Clone for MPMCFutReceiver<T> {
537+
fn clone(&self) -> Self {
538+
MPMCFutReceiver {
539+
receiver: self.receiver.clone(),
540+
}
541+
}
542+
}
543+
530544
impl<T> Stream for MPMCFutReceiver<T> {
531545
type Item = T;
532546
type Error = ();

src/multiqueue.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,13 @@ pub struct InnerRecv<RW: QueueRW<T>, T> {
180180
}
181181

182182
/// This is a sender that can transparently act as a futures stream
183-
#[derive(Clone)]
184183
pub struct FutInnerSend<RW: QueueRW<T>, T> {
185184
writer: InnerSend<RW, T>,
186185
wait: Arc<FutWait>,
187186
prod_wait: Arc<FutWait>,
188187
}
189188

190189
/// This is a receiver that can transparently act as a futures stream
191-
#[derive(Clone)]
192190
pub struct FutInnerRecv<RW: QueueRW<T>, T> {
193191
reader: InnerRecv<RW, T>,
194192
wait: Arc<FutWait>,
@@ -973,6 +971,26 @@ impl<RW: QueueRW<T>, T> Clone for InnerRecv<RW, T> {
973971
}
974972
}
975973

974+
impl<RW: QueueRW<T>, T> Clone for FutInnerSend<RW, T> {
975+
fn clone(&self) -> FutInnerSend<RW, T> {
976+
FutInnerSend {
977+
writer: self.writer.clone(),
978+
wait: self.wait.clone(),
979+
prod_wait: self.prod_wait.clone(),
980+
}
981+
}
982+
}
983+
984+
impl<RW: QueueRW<T>, T> Clone for FutInnerRecv<RW, T> {
985+
fn clone(&self) -> FutInnerRecv<RW, T> {
986+
FutInnerRecv {
987+
reader: self.reader.clone(),
988+
wait: self.wait.clone(),
989+
prod_wait: self.prod_wait.clone(),
990+
}
991+
}
992+
}
993+
976994
impl Clone for FutWait {
977995
fn clone(&self) -> FutWait {
978996
FutWait::with_spins(self.spins_first, self.spins_yield)

0 commit comments

Comments
 (0)