@@ -784,6 +784,35 @@ impl<T: sealed::Context> Features<T> {
784784 } )
785785 }
786786
787+ pub ( crate ) fn required_unknown_bits_from ( & self , other : & Self ) -> Vec < usize > {
788+ let mut unknown_bits = Vec :: new ( ) ;
789+
790+ // Bitwise AND-ing with all even bits set except for known features will select required
791+ // unknown features.
792+ self . flags . iter ( ) . enumerate ( ) . for_each ( |( i, & byte) | {
793+ const REQUIRED_FEATURES : u8 = 0b01_01_01_01 ;
794+ const OPTIONAL_FEATURES : u8 = 0b10_10_10_10 ;
795+ let unknown_features = if i < other. flags . len ( ) {
796+ // Form a mask similar to !T::KNOWN_FEATURE_MASK only for `other`
797+ !( other. flags [ i]
798+ | ( ( other. flags [ i] >> 1 ) & REQUIRED_FEATURES )
799+ | ( ( other. flags [ i] << 1 ) & OPTIONAL_FEATURES ) )
800+ } else {
801+ 0b11_11_11_11
802+ } ;
803+
804+ if byte & unknown_features != 0 {
805+ for bit in ( 0 ..8 ) . step_by ( 2 ) {
806+ if ( ( byte & unknown_features) >> bit) & 1 == 1 {
807+ unknown_bits. push ( i * 8 + bit) ;
808+ }
809+ }
810+ }
811+ } ) ;
812+
813+ unknown_bits
814+ }
815+
787816 /// Returns true if this `Features` object contains unknown feature flags which are set as
788817 /// "required".
789818 pub fn requires_unknown_bits ( & self ) -> bool {
@@ -1034,11 +1063,24 @@ mod tests {
10341063 features. set_unknown_feature_required ( ) ;
10351064 assert ! ( features. requires_unknown_bits( ) ) ;
10361065 assert ! ( features. supports_unknown_bits( ) ) ;
1066+ assert_eq ! ( features. required_unknown_bits_from( & ChannelFeatures :: empty( ) ) , vec![ 123456788 ] ) ;
10371067
10381068 let mut features = ChannelFeatures :: empty ( ) ;
10391069 features. set_unknown_feature_optional ( ) ;
10401070 assert ! ( !features. requires_unknown_bits( ) ) ;
10411071 assert ! ( features. supports_unknown_bits( ) ) ;
1072+ assert_eq ! ( features. required_unknown_bits_from( & ChannelFeatures :: empty( ) ) , vec![ ] ) ;
1073+
1074+ let mut features = ChannelFeatures :: empty ( ) ;
1075+ features. set_unknown_feature_required ( ) ;
1076+ features. set_custom_bit ( 123456786 ) . unwrap ( ) ;
1077+ assert ! ( features. requires_unknown_bits( ) ) ;
1078+ assert ! ( features. supports_unknown_bits( ) ) ;
1079+ assert_eq ! ( features. required_unknown_bits_from( & ChannelFeatures :: empty( ) ) , vec![ 123456786 , 123456788 ] ) ;
1080+
1081+ let mut limiter = ChannelFeatures :: empty ( ) ;
1082+ limiter. set_unknown_feature_optional ( ) ;
1083+ assert_eq ! ( features. required_unknown_bits_from( & limiter) , vec![ 123456786 ] ) ;
10421084 }
10431085
10441086 #[ test]
0 commit comments