Skip to content

Commit fe9ce29

Browse files
Macro-ify StreamPack
Signed-off-by: Luca Della Vedova <lucadv@intrinsic.ai>
1 parent 018a756 commit fe9ce29

File tree

3 files changed

+218
-294
lines changed

3 files changed

+218
-294
lines changed

src/buffer/bufferable.rs

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*
1616
*/
1717

18+
use bevy::utils::all_tuples;
1819
use smallvec::SmallVec;
1920

2021
use crate::{
@@ -76,36 +77,26 @@ impl<T: 'static + Send + Sync> Bufferable for Output<T> {
7677
}
7778
}
7879

79-
impl<T0, T1> Bufferable for (T0, T1)
80-
where
81-
T0: Bufferable,
82-
T1: Bufferable,
83-
{
84-
type BufferType = (T0::BufferType, T1::BufferType);
85-
fn as_buffer(self, builder: &mut Builder) -> Self::BufferType {
86-
(
87-
self.0.as_buffer(builder),
88-
self.1.as_buffer(builder),
89-
)
90-
}
91-
}
92-
93-
impl<T0, T1, T2> Bufferable for (T0, T1, T2)
94-
where
95-
T0: Bufferable,
96-
T1: Bufferable,
97-
T2: Bufferable,
98-
{
99-
type BufferType = (T0::BufferType, T1::BufferType, T2::BufferType);
100-
fn as_buffer(self, builder: &mut Builder) -> Self::BufferType {
101-
(
102-
self.0.as_buffer(builder),
103-
self.1.as_buffer(builder),
104-
self.2.as_buffer(builder),
105-
)
80+
macro_rules! impl_bufferable_for_tuple {
81+
($($T:ident),*) => {
82+
#[allow(non_snake_case)]
83+
impl<$($T: Bufferable),*> Bufferable for ($($T,)*)
84+
{
85+
type BufferType = ($($T::BufferType,)*);
86+
fn as_buffer(self, builder: &mut Builder) -> Self::BufferType {
87+
let ($($T,)*) = self;
88+
($(
89+
$T.as_buffer(builder),
90+
)*)
91+
}
92+
93+
}
10694
}
10795
}
10896

97+
// Implements the `Bufferable` trait for all tuples between size 2 and 15
98+
// (inclusive) made of types that implement `Bufferable`
99+
all_tuples!(impl_bufferable_for_tuple, 2, 15, T);
109100

110101
impl<T: Bufferable, const N: usize> Bufferable for [T; N] {
111102
type BufferType = [T::BufferType; N];

src/buffer/buffered.rs

Lines changed: 52 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717

1818
use bevy::prelude::{Entity, World};
19+
use bevy::utils::all_tuples;
1920

2021
use smallvec::SmallVec;
2122

@@ -121,100 +122,63 @@ impl<T: 'static + Send + Sync + Clone> Buffered for CloneFromBuffer<T> {
121122
}
122123
}
123124

124-
impl<T0, T1> Buffered for (T0, T1)
125-
where
126-
T0: Buffered,
127-
T1: Buffered,
128-
{
129-
fn buffered_count(
130-
&self,
131-
session: Entity,
132-
world: &World,
133-
) -> Result<usize, OperationError> {
134-
Ok([
135-
self.0.buffered_count(session, world)?,
136-
self.1.buffered_count(session, world)?,
137-
].iter().copied().min().unwrap_or(0))
138-
}
125+
macro_rules! impl_buffered_for_tuple {
126+
($($T:ident),*) => {
127+
#[allow(non_snake_case)]
128+
impl<$($T: Buffered),*> Buffered for ($($T,)*)
129+
{
130+
fn buffered_count(
131+
&self,
132+
session: Entity,
133+
world: &World,
134+
) -> Result<usize, OperationError> {
135+
let ($($T,)*) = self;
136+
Ok([
137+
$(
138+
$T.buffered_count(session, world)?,
139+
)*
140+
].iter().copied().min().unwrap_or(0))
141+
}
139142

140-
type Item = (T0::Item, T1::Item);
141-
fn pull(
142-
&self,
143-
session: Entity,
144-
world: &mut World,
145-
) -> Result<Self::Item, OperationError> {
146-
let t0 = self.0.pull(session, world)?;
147-
let t1 = self.1.pull(session, world)?;
148-
Ok((t0, t1))
149-
}
143+
type Item = ($($T::Item),*);
144+
fn pull(
145+
&self,
146+
session: Entity,
147+
world: &mut World,
148+
) -> Result<Self::Item, OperationError> {
149+
let ($($T,)*) = self;
150+
Ok(($(
151+
$T.pull(session, world)?,
152+
)*))
153+
}
150154

151-
fn listen(
152-
&self,
153-
listener: Entity,
154-
world: &mut World,
155-
) -> OperationResult {
156-
self.0.listen(listener, world)?;
157-
self.1.listen(listener, world)?;
158-
Ok(())
159-
}
155+
fn listen(
156+
&self,
157+
listener: Entity,
158+
world: &mut World,
159+
) -> OperationResult {
160+
let ($($T,)*) = self;
161+
$(
162+
$T.listen(listener, world)?;
163+
)*
164+
Ok(())
165+
}
160166

161-
fn as_input(&self) -> SmallVec<[Entity; 8]> {
162-
let mut inputs = SmallVec::new();
163-
inputs.extend(self.0.as_input());
164-
inputs.extend(self.1.as_input());
165-
inputs
167+
fn as_input(&self) -> SmallVec<[Entity; 8]> {
168+
let mut inputs = SmallVec::new();
169+
let ($($T,)*) = self;
170+
$(
171+
inputs.extend($T.as_input());
172+
)*
173+
inputs
174+
}
175+
}
166176
}
167177
}
168178

169-
impl<T0, T1, T2> Buffered for (T0, T1, T2)
170-
where
171-
T0: Buffered,
172-
T1: Buffered,
173-
T2: Buffered,
174-
{
175-
fn buffered_count(
176-
&self,
177-
session: Entity,
178-
world: &World,
179-
) -> Result<usize, OperationError> {
180-
Ok([
181-
self.0.buffered_count(session, world)?,
182-
self.1.buffered_count(session, world)?,
183-
self.2.buffered_count(session, world)?,
184-
].iter().copied().min().unwrap_or(0))
185-
}
186-
187-
type Item = (T0::Item, T1::Item, T2::Item);
188-
fn pull(
189-
&self,
190-
session: Entity,
191-
world: &mut World,
192-
) -> Result<Self::Item, OperationError> {
193-
let t0 = self.0.pull(session, world)?;
194-
let t1 = self.1.pull(session, world)?;
195-
let t2 = self.2.pull(session, world)?;
196-
Ok((t0, t1, t2))
197-
}
198-
199-
fn listen(
200-
&self,
201-
listener: Entity,
202-
world: &mut World,
203-
) -> OperationResult {
204-
self.0.listen(listener, world)?;
205-
self.1.listen(listener, world)?;
206-
self.2.listen(listener, world)?;
207-
Ok(())
208-
}
209-
210-
fn as_input(&self) -> SmallVec<[Entity; 8]> {
211-
let mut inputs = SmallVec::new();
212-
inputs.extend(self.0.as_input());
213-
inputs.extend(self.1.as_input());
214-
inputs.extend(self.2.as_input());
215-
inputs
216-
}
217-
}
179+
// Implements the `Buffered` trait for all tuples between size 2 and 15
180+
// (inclusive) made of types that implement `Buffered`
181+
all_tuples!(impl_buffered_for_tuple, 2, 15, T);
218182

219183
impl<T: Buffered, const N: usize> Buffered for [T; N] {
220184
fn buffered_count(

0 commit comments

Comments
 (0)