@@ -784,6 +784,35 @@ impl<T: sealed::Context> Features<T> {
784
784
} )
785
785
}
786
786
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
+
787
816
/// Returns true if this `Features` object contains unknown feature flags which are set as
788
817
/// "required".
789
818
pub fn requires_unknown_bits ( & self ) -> bool {
@@ -1034,11 +1063,24 @@ mod tests {
1034
1063
features. set_unknown_feature_required ( ) ;
1035
1064
assert ! ( features. requires_unknown_bits( ) ) ;
1036
1065
assert ! ( features. supports_unknown_bits( ) ) ;
1066
+ assert_eq ! ( features. required_unknown_bits_from( & ChannelFeatures :: empty( ) ) , vec![ 123456788 ] ) ;
1037
1067
1038
1068
let mut features = ChannelFeatures :: empty ( ) ;
1039
1069
features. set_unknown_feature_optional ( ) ;
1040
1070
assert ! ( !features. requires_unknown_bits( ) ) ;
1041
1071
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 ] ) ;
1042
1084
}
1043
1085
1044
1086
#[ test]
0 commit comments