Skip to content

Commit 7fca90c

Browse files
committed
Pre-allocate bytes in Features::to_context_internal
This avoids vec doubling while doing `Features` conversions.
1 parent 85185d8 commit 7fca90c

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

lightning-types/src/features.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -903,15 +903,17 @@ impl<T: sealed::Context> Features<T> {
903903
/// Converts `Features<T>` to `Features<C>`. Only known `T` features relevant to context `C` are
904904
/// included in the result.
905905
fn to_context_internal<C: sealed::Context>(&self) -> Features<C> {
906-
let from_byte_count = T::KNOWN_FEATURE_MASK.len();
907-
let to_byte_count = C::KNOWN_FEATURE_MASK.len();
908-
let mut flags = Vec::new();
909-
for (i, byte) in self.flags.iter().enumerate() {
910-
if i < from_byte_count && i < to_byte_count {
911-
let from_known_features = T::KNOWN_FEATURE_MASK[i];
912-
let to_known_features = C::KNOWN_FEATURE_MASK[i];
913-
flags.push(byte & from_known_features & to_known_features);
906+
let flag_iter = self.flags.iter().enumerate().filter_map(|(i, byte)| {
907+
if i < T::KNOWN_FEATURE_MASK.len() && i < C::KNOWN_FEATURE_MASK.len() {
908+
Some((i, *byte & T::KNOWN_FEATURE_MASK[i] & C::KNOWN_FEATURE_MASK[i]))
909+
} else {
910+
None
914911
}
912+
});
913+
let mut flags = Vec::new();
914+
flags.resize(flag_iter.clone().count(), 0);
915+
for (i, byte) in flag_iter {
916+
flags[i] = byte;
915917
}
916918
Features::<C> { flags, mark: PhantomData }
917919
}

0 commit comments

Comments
 (0)