Skip to content

Commit ffb5459

Browse files
committed
Implement Extend for BitFlags
1 parent bdae026 commit ffb5459

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

benches/from_iterator.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub enum Test {
1616
Flag11 = 1 << 10,
1717
}
1818

19-
pub fn from_iterator(c: &mut Criterion) {
19+
pub fn iterators(c: &mut Criterion) {
2020
let v = vec![
2121
Test::Flag3,
2222
Test::Flag7,
@@ -31,17 +31,32 @@ pub fn from_iterator(c: &mut Criterion) {
3131
Test::Flag4,
3232
];
3333

34-
c.bench_function("simple iterator", |b| b.iter(|| {
34+
c.bench_function("simple iterator collect", |b| b.iter(|| {
3535
black_box(&v).iter().copied().collect::<BitFlags<_>>()
3636
}));
3737

38-
c.bench_function("chained iterator", |b| b.iter(|| {
38+
c.bench_function("chained iterator collect", |b| b.iter(|| {
3939
black_box(&v).iter()
4040
.chain(black_box(&v2).iter())
4141
.copied()
4242
.collect::<BitFlags<_>>()
4343
}));
44+
45+
c.bench_function("simple iterator extend", |b| b.iter(|| {
46+
let mut flags = BitFlags::empty();
47+
flags.extend(black_box(&v).iter().copied());
48+
flags
49+
}));
50+
51+
c.bench_function("chained iterator extend", |b| b.iter(|| {
52+
let mut flags = BitFlags::empty();
53+
flags.extend(
54+
black_box(&v).iter()
55+
.chain(black_box(&v2).iter())
56+
.copied());
57+
flags
58+
}));
4459
}
4560

46-
criterion_group!(benches, from_iterator);
61+
criterion_group!(benches, iterators);
4762
criterion_main!(benches);

enumflags/src/lib.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,13 +375,26 @@ where
375375
B: Into<BitFlags<T>>
376376
{
377377
fn from_iter<I>(it: I) -> BitFlags<T>
378-
where
378+
where
379379
I: IntoIterator<Item = B>
380380
{
381381
it.into_iter().fold(BitFlags::empty(), |acc, flag| acc | flag)
382382
}
383383
}
384384

385+
impl<T, B> Extend<B> for BitFlags<T>
386+
where
387+
T: RawBitFlags,
388+
B: Into<BitFlags<T>>
389+
{
390+
fn extend<I>(&mut self, it: I)
391+
where
392+
I: IntoIterator<Item = B>
393+
{
394+
*self = it.into_iter().fold(*self, |acc, flag| acc | flag)
395+
}
396+
}
397+
385398
#[cfg(feature = "serde")]
386399
mod impl_serde {
387400
use serde::{Serialize, Deserialize};

0 commit comments

Comments
 (0)