projects
/
rust-lightning
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #1092 from TheBlueMatt/2021-09-type-explicit-bounds
[rust-lightning]
/
lightning
/
src
/
ln
/
features.rs
diff --git
a/lightning/src/ln/features.rs
b/lightning/src/ln/features.rs
index b90748aa87b7e5cd55bf0461244fd2c654feb7eb..8f251d8478c7048f33cfb003725f4c94b388a209 100644
(file)
--- a/
lightning/src/ln/features.rs
+++ b/
lightning/src/ln/features.rs
@@
-22,8
+22,10
@@
//! [BOLT #9]: https://github.com/lightningnetwork/lightning-rfc/blob/master/09-features.md
//! [messages]: crate::ln::msgs
//! [BOLT #9]: https://github.com/lightningnetwork/lightning-rfc/blob/master/09-features.md
//! [messages]: crate::ln::msgs
+use io;
use prelude::*;
use core::{cmp, fmt};
use prelude::*;
use core::{cmp, fmt};
+use core::hash::{Hash, Hasher};
use core::marker::PhantomData;
use bitcoin::bech32;
use core::marker::PhantomData;
use bitcoin::bech32;
@@
-361,6
+363,11
@@
impl<T: sealed::Context> Clone for Features<T> {
}
}
}
}
}
}
+impl<T: sealed::Context> Hash for Features<T> {
+ fn hash<H: Hasher>(&self, hasher: &mut H) {
+ self.flags.hash(hasher);
+ }
+}
impl<T: sealed::Context> PartialEq for Features<T> {
fn eq(&self, o: &Self) -> bool {
self.flags.eq(&o.flags)
impl<T: sealed::Context> PartialEq for Features<T> {
fn eq(&self, o: &Self) -> bool {
self.flags.eq(&o.flags)
@@
-383,9
+390,8
@@
pub type InvoiceFeatures = Features<sealed::InvoiceContext>;
impl InitFeatures {
/// Writes all features present up to, and including, 13.
impl InitFeatures {
/// Writes all features present up to, and including, 13.
- pub(crate) fn write_up_to_13<W: Writer>(&self, w: &mut W) -> Result<(),
::std::
io::Error> {
+ pub(crate) fn write_up_to_13<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
let len = cmp::min(2, self.flags.len());
let len = cmp::min(2, self.flags.len());
- w.size_hint(len + 2);
(len as u16).write(w)?;
for i in (0..len).rev() {
if i == 0 {
(len as u16).write(w)?;
for i in (0..len).rev() {
if i == 0 {
@@
-547,7
+553,9
@@
impl<T: sealed::Context> Features<T> {
&self.flags
}
&self.flags
}
- pub(crate) fn requires_unknown_bits(&self) -> bool {
+ /// Returns true if this `Features` object contains unknown feature flags which are set as
+ /// "required".
+ pub fn requires_unknown_bits(&self) -> bool {
// Bitwise AND-ing with all even bits set except for known features will select required
// unknown features.
let byte_count = T::KNOWN_FEATURE_MASK.len();
// Bitwise AND-ing with all even bits set except for known features will select required
// unknown features.
let byte_count = T::KNOWN_FEATURE_MASK.len();
@@
-575,12
+583,6
@@
impl<T: sealed::Context> Features<T> {
(byte & unknown_features) != 0
})
}
(byte & unknown_features) != 0
})
}
-
- /// The number of bytes required to represent the feature flags present. This does not include
- /// the length bytes which are included in the serialized form.
- pub(crate) fn byte_count(&self) -> usize {
- self.flags.len()
- }
}
impl<T: sealed::DataLossProtect> Features<T> {
}
impl<T: sealed::DataLossProtect> Features<T> {
@@
-692,8
+694,7
@@
impl<T: sealed::ShutdownAnySegwit> Features<T> {
}
impl<T: sealed::Context> Writeable for Features<T> {
}
impl<T: sealed::Context> Writeable for Features<T> {
- fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
- w.size_hint(self.flags.len() + 2);
+ fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
(self.flags.len() as u16).write(w)?;
for f in self.flags.iter().rev() { // Swap back to big-endian
f.write(w)?;
(self.flags.len() as u16).write(w)?;
for f in self.flags.iter().rev() { // Swap back to big-endian
f.write(w)?;
@@
-703,7
+704,7
@@
impl<T: sealed::Context> Writeable for Features<T> {
}
impl<T: sealed::Context> Readable for Features<T> {
}
impl<T: sealed::Context> Readable for Features<T> {
- fn read<R:
::std::
io::Read>(r: &mut R) -> Result<Self, DecodeError> {
+ fn read<R: io::Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut flags: Vec<u8> = Readable::read(r)?;
flags.reverse(); // Swap to little-endian
Ok(Self {
let mut flags: Vec<u8> = Readable::read(r)?;
flags.reverse(); // Swap to little-endian
Ok(Self {
@@
-826,7
+827,7
@@
mod tests {
#[test]
fn convert_to_context_with_unknown_flags() {
// Ensure the `from` context has fewer known feature bytes than the `to` context.
#[test]
fn convert_to_context_with_unknown_flags() {
// Ensure the `from` context has fewer known feature bytes than the `to` context.
- assert!(InvoiceFeatures::known().
byte_count() < NodeFeatures::known().byte_count
());
+ assert!(InvoiceFeatures::known().
flags.len() < NodeFeatures::known().flags.len
());
let invoice_features = InvoiceFeatures::known().set_unknown_feature_optional();
assert!(invoice_features.supports_unknown_bits());
let node_features: NodeFeatures = invoice_features.to_context();
let invoice_features = InvoiceFeatures::known().set_unknown_feature_optional();
assert!(invoice_features.supports_unknown_bits());
let node_features: NodeFeatures = invoice_features.to_context();