Define core::ops::BitOr for Features<T>

The `lightning-custom-message` crate will need access to Features::or in
order combine features of a composite handler. Expose this via a
core::ops::BitOr implementation.
This commit is contained in:
Jeffrey Czyz 2023-04-13 13:06:14 -05:00
parent 818dbdf7ab
commit 687e587a73
No known key found for this signature in database
GPG key ID: 3A4E08275D5E96D2
3 changed files with 11 additions and 9 deletions

View file

@ -422,8 +422,10 @@ pub struct Features<T: sealed::Context> {
mark: PhantomData<T>,
}
impl <T: sealed::Context> Features<T> {
pub(crate) fn or(mut self, o: Self) -> Self {
impl<T: sealed::Context> core::ops::BitOr for Features<T> {
type Output = Self;
fn bitor(mut self, o: Self) -> Self {
let total_feature_len = cmp::max(self.flags.len(), o.flags.len());
self.flags.resize(total_feature_len, 0u8);
for (byte, o_byte) in self.flags.iter_mut().zip(o.flags.iter()) {

View file

@ -1392,7 +1392,7 @@ impl Readable for Init {
(3, remote_network_address, option)
});
Ok(Init {
features: features.or(global_features),
features: features | global_features,
remote_network_address,
})
}

View file

@ -1246,8 +1246,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
peer.set_their_node_id(their_node_id);
insert_node_id!();
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
.or(self.message_handler.route_handler.provided_init_features(&their_node_id))
.or(self.message_handler.onion_message_handler.provided_init_features(&their_node_id));
| self.message_handler.route_handler.provided_init_features(&their_node_id)
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id);
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
self.enqueue_message(peer, &resp);
peer.awaiting_pong_timer_tick_intervals = 0;
@ -1260,8 +1260,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
peer.set_their_node_id(their_node_id);
insert_node_id!();
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
.or(self.message_handler.route_handler.provided_init_features(&their_node_id))
.or(self.message_handler.onion_message_handler.provided_init_features(&their_node_id));
| self.message_handler.route_handler.provided_init_features(&their_node_id)
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id);
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
self.enqueue_message(peer, &resp);
peer.awaiting_pong_timer_tick_intervals = 0;
@ -2202,8 +2202,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
addresses.sort_by_key(|addr| addr.get_id());
let features = self.message_handler.chan_handler.provided_node_features()
.or(self.message_handler.route_handler.provided_node_features())
.or(self.message_handler.onion_message_handler.provided_node_features());
| self.message_handler.route_handler.provided_node_features()
| self.message_handler.onion_message_handler.provided_node_features();
let announcement = msgs::UnsignedNodeAnnouncement {
features,
timestamp: self.last_node_announcement_serial.fetch_add(1, Ordering::AcqRel),