1 //! Generate the user-facing flags type. 2 //! 3 //! The code here belongs to the end-user, so new trait implementations and methods can't be 4 //! added without potentially breaking users. 5 6 /// Declare the user-facing bitflags struct. 7 /// 8 /// This type is guaranteed to be a newtype with a `bitflags`-facing type as its single field. 9 #[macro_export] 10 #[doc(hidden)] 11 macro_rules! __declare_public_bitflags { 12 ( 13 $(#[$outer:meta])* 14 $vis:vis struct $PublicBitFlags:ident 15 ) => { 16 $(#[$outer])* 17 $vis struct $PublicBitFlags(<$PublicBitFlags as $crate::__private::PublicFlags>::Internal); 18 }; 19 } 20 21 /// Implement functions on the public (user-facing) bitflags type. 22 /// 23 /// We need to be careful about adding new methods and trait implementations here because they 24 /// could conflict with items added by the end-user. 25 #[macro_export] 26 #[doc(hidden)] 27 macro_rules! __impl_public_bitflags_forward { 28 ( 29 $(#[$outer:meta])* 30 $PublicBitFlags:ident: $T:ty, $InternalBitFlags:ident 31 ) => { 32 $crate::__impl_bitflags! { 33 $(#[$outer])* 34 $PublicBitFlags: $T { 35 fn empty() { 36 Self($InternalBitFlags::empty()) 37 } 38 39 fn all() { 40 Self($InternalBitFlags::all()) 41 } 42 43 fn bits(f) { 44 f.0.bits() 45 } 46 47 fn from_bits(bits) { 48 match $InternalBitFlags::from_bits(bits) { 49 $crate::__private::core::option::Option::Some(bits) => $crate::__private::core::option::Option::Some(Self(bits)), 50 $crate::__private::core::option::Option::None => $crate::__private::core::option::Option::None, 51 } 52 } 53 54 fn from_bits_truncate(bits) { 55 Self($InternalBitFlags::from_bits_truncate(bits)) 56 } 57 58 fn from_bits_retain(bits) { 59 Self($InternalBitFlags::from_bits_retain(bits)) 60 } 61 62 fn from_name(name) { 63 match $InternalBitFlags::from_name(name) { 64 $crate::__private::core::option::Option::Some(bits) => $crate::__private::core::option::Option::Some(Self(bits)), 65 $crate::__private::core::option::Option::None => $crate::__private::core::option::Option::None, 66 } 67 } 68 69 fn is_empty(f) { 70 f.0.is_empty() 71 } 72 73 fn is_all(f) { 74 f.0.is_all() 75 } 76 77 fn intersects(f, other) { 78 f.0.intersects(other.0) 79 } 80 81 fn contains(f, other) { 82 f.0.contains(other.0) 83 } 84 85 fn insert(f, other) { 86 f.0.insert(other.0) 87 } 88 89 fn remove(f, other) { 90 f.0.remove(other.0) 91 } 92 93 fn toggle(f, other) { 94 f.0.toggle(other.0) 95 } 96 97 fn set(f, other, value) { 98 f.0.set(other.0, value) 99 } 100 101 fn intersection(f, other) { 102 Self(f.0.intersection(other.0)) 103 } 104 105 fn union(f, other) { 106 Self(f.0.union(other.0)) 107 } 108 109 fn difference(f, other) { 110 Self(f.0.difference(other.0)) 111 } 112 113 fn symmetric_difference(f, other) { 114 Self(f.0.symmetric_difference(other.0)) 115 } 116 117 fn complement(f) { 118 Self(f.0.complement()) 119 } 120 } 121 } 122 }; 123 } 124 125 /// Implement functions on the public (user-facing) bitflags type. 126 /// 127 /// We need to be careful about adding new methods and trait implementations here because they 128 /// could conflict with items added by the end-user. 129 #[macro_export] 130 #[doc(hidden)] 131 macro_rules! __impl_public_bitflags { 132 ( 133 $(#[$outer:meta])* 134 $BitFlags:ident: $T:ty, $PublicBitFlags:ident { 135 $( 136 $(#[$inner:ident $($args:tt)*])* 137 const $Flag:tt = $value:expr; 138 )* 139 } 140 ) => { 141 $crate::__impl_bitflags! { 142 $(#[$outer])* 143 $BitFlags: $T { 144 fn empty() { 145 Self(<$T as $crate::Bits>::EMPTY) 146 } 147 148 fn all() { 149 let mut truncated = <$T as $crate::Bits>::EMPTY; 150 let mut i = 0; 151 152 $( 153 $crate::__bitflags_expr_safe_attrs!( 154 $(#[$inner $($args)*])* 155 {{ 156 let flag = <$PublicBitFlags as $crate::Flags>::FLAGS[i].value().bits(); 157 158 truncated = truncated | flag; 159 i += 1; 160 }} 161 ); 162 )* 163 164 let _ = i; 165 Self::from_bits_retain(truncated) 166 } 167 168 fn bits(f) { 169 f.0 170 } 171 172 fn from_bits(bits) { 173 let truncated = Self::from_bits_truncate(bits).0; 174 175 if truncated == bits { 176 $crate::__private::core::option::Option::Some(Self(bits)) 177 } else { 178 $crate::__private::core::option::Option::None 179 } 180 } 181 182 fn from_bits_truncate(bits) { 183 Self(bits & Self::all().bits()) 184 } 185 186 fn from_bits_retain(bits) { 187 Self(bits) 188 } 189 190 fn from_name(name) { 191 $( 192 $crate::__bitflags_flag!({ 193 name: $Flag, 194 named: { 195 $crate::__bitflags_expr_safe_attrs!( 196 $(#[$inner $($args)*])* 197 { 198 if name == $crate::__private::core::stringify!($Flag) { 199 return $crate::__private::core::option::Option::Some(Self($PublicBitFlags::$Flag.bits())); 200 } 201 } 202 ); 203 }, 204 unnamed: {}, 205 }); 206 )* 207 208 let _ = name; 209 $crate::__private::core::option::Option::None 210 } 211 212 fn is_empty(f) { 213 f.bits() == <$T as $crate::Bits>::EMPTY 214 } 215 216 fn is_all(f) { 217 // NOTE: We check against `Self::all` here, not `Self::Bits::ALL` 218 // because the set of all flags may not use all bits 219 Self::all().bits() | f.bits() == f.bits() 220 } 221 222 fn intersects(f, other) { 223 f.bits() & other.bits() != <$T as $crate::Bits>::EMPTY 224 } 225 226 fn contains(f, other) { 227 f.bits() & other.bits() == other.bits() 228 } 229 230 fn insert(f, other) { 231 *f = Self::from_bits_retain(f.bits()).union(other); 232 } 233 234 fn remove(f, other) { 235 *f = Self::from_bits_retain(f.bits()).difference(other); 236 } 237 238 fn toggle(f, other) { 239 *f = Self::from_bits_retain(f.bits()).symmetric_difference(other); 240 } 241 242 fn set(f, other, value) { 243 if value { 244 f.insert(other); 245 } else { 246 f.remove(other); 247 } 248 } 249 250 fn intersection(f, other) { 251 Self::from_bits_retain(f.bits() & other.bits()) 252 } 253 254 fn union(f, other) { 255 Self::from_bits_retain(f.bits() | other.bits()) 256 } 257 258 fn difference(f, other) { 259 Self::from_bits_retain(f.bits() & !other.bits()) 260 } 261 262 fn symmetric_difference(f, other) { 263 Self::from_bits_retain(f.bits() ^ other.bits()) 264 } 265 266 fn complement(f) { 267 Self::from_bits_truncate(!f.bits()) 268 } 269 } 270 } 271 }; 272 } 273 274 /// Implement iterators on the public (user-facing) bitflags type. 275 #[macro_export] 276 #[doc(hidden)] 277 macro_rules! __impl_public_bitflags_iter { 278 ( 279 $(#[$outer:meta])* 280 $BitFlags:ident: $T:ty, $PublicBitFlags:ident 281 ) => { 282 $(#[$outer])* 283 impl $BitFlags { 284 /// Yield a set of contained flags values. 285 /// 286 /// Each yielded flags value will correspond to a defined named flag. Any unknown bits 287 /// will be yielded together as a final flags value. 288 #[inline] 289 pub const fn iter(&self) -> $crate::iter::Iter<$PublicBitFlags> { 290 $crate::iter::Iter::__private_const_new( 291 <$PublicBitFlags as $crate::Flags>::FLAGS, 292 $PublicBitFlags::from_bits_retain(self.bits()), 293 $PublicBitFlags::from_bits_retain(self.bits()), 294 ) 295 } 296 297 /// Yield a set of contained named flags values. 298 /// 299 /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags. 300 /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded. 301 #[inline] 302 pub const fn iter_names(&self) -> $crate::iter::IterNames<$PublicBitFlags> { 303 $crate::iter::IterNames::__private_const_new( 304 <$PublicBitFlags as $crate::Flags>::FLAGS, 305 $PublicBitFlags::from_bits_retain(self.bits()), 306 $PublicBitFlags::from_bits_retain(self.bits()), 307 ) 308 } 309 } 310 311 $(#[$outer:meta])* 312 impl $crate::__private::core::iter::IntoIterator for $BitFlags { 313 type Item = $PublicBitFlags; 314 type IntoIter = $crate::iter::Iter<$PublicBitFlags>; 315 316 fn into_iter(self) -> Self::IntoIter { 317 self.iter() 318 } 319 } 320 }; 321 } 322 323 /// Implement traits on the public (user-facing) bitflags type. 324 #[macro_export] 325 #[doc(hidden)] 326 macro_rules! __impl_public_bitflags_ops { 327 ( 328 $(#[$outer:meta])* 329 $PublicBitFlags:ident 330 ) => { 331 332 $(#[$outer])* 333 impl $crate::__private::core::fmt::Binary for $PublicBitFlags { 334 fn fmt( 335 &self, 336 f: &mut $crate::__private::core::fmt::Formatter, 337 ) -> $crate::__private::core::fmt::Result { 338 let inner = self.0; 339 $crate::__private::core::fmt::Binary::fmt(&inner, f) 340 } 341 } 342 343 $(#[$outer])* 344 impl $crate::__private::core::fmt::Octal for $PublicBitFlags { 345 fn fmt( 346 &self, 347 f: &mut $crate::__private::core::fmt::Formatter, 348 ) -> $crate::__private::core::fmt::Result { 349 let inner = self.0; 350 $crate::__private::core::fmt::Octal::fmt(&inner, f) 351 } 352 } 353 354 $(#[$outer])* 355 impl $crate::__private::core::fmt::LowerHex for $PublicBitFlags { 356 fn fmt( 357 &self, 358 f: &mut $crate::__private::core::fmt::Formatter, 359 ) -> $crate::__private::core::fmt::Result { 360 let inner = self.0; 361 $crate::__private::core::fmt::LowerHex::fmt(&inner, f) 362 } 363 } 364 365 $(#[$outer])* 366 impl $crate::__private::core::fmt::UpperHex for $PublicBitFlags { 367 fn fmt( 368 &self, 369 f: &mut $crate::__private::core::fmt::Formatter, 370 ) -> $crate::__private::core::fmt::Result { 371 let inner = self.0; 372 $crate::__private::core::fmt::UpperHex::fmt(&inner, f) 373 } 374 } 375 376 $(#[$outer])* 377 impl $crate::__private::core::ops::BitOr for $PublicBitFlags { 378 type Output = Self; 379 380 /// The bitwise or (`|`) of the bits in two flags values. 381 #[inline] 382 fn bitor(self, other: $PublicBitFlags) -> Self { 383 self.union(other) 384 } 385 } 386 387 $(#[$outer])* 388 impl $crate::__private::core::ops::BitOrAssign for $PublicBitFlags { 389 /// The bitwise or (`|`) of the bits in two flags values. 390 #[inline] 391 fn bitor_assign(&mut self, other: Self) { 392 self.insert(other); 393 } 394 } 395 396 $(#[$outer])* 397 impl $crate::__private::core::ops::BitXor for $PublicBitFlags { 398 type Output = Self; 399 400 /// The bitwise exclusive-or (`^`) of the bits in two flags values. 401 #[inline] 402 fn bitxor(self, other: Self) -> Self { 403 self.symmetric_difference(other) 404 } 405 } 406 407 $(#[$outer])* 408 impl $crate::__private::core::ops::BitXorAssign for $PublicBitFlags { 409 /// The bitwise exclusive-or (`^`) of the bits in two flags values. 410 #[inline] 411 fn bitxor_assign(&mut self, other: Self) { 412 self.toggle(other); 413 } 414 } 415 416 $(#[$outer])* 417 impl $crate::__private::core::ops::BitAnd for $PublicBitFlags { 418 type Output = Self; 419 420 /// The bitwise and (`&`) of the bits in two flags values. 421 #[inline] 422 fn bitand(self, other: Self) -> Self { 423 self.intersection(other) 424 } 425 } 426 427 $(#[$outer])* 428 impl $crate::__private::core::ops::BitAndAssign for $PublicBitFlags { 429 /// The bitwise and (`&`) of the bits in two flags values. 430 #[inline] 431 fn bitand_assign(&mut self, other: Self) { 432 *self = Self::from_bits_retain(self.bits()).intersection(other); 433 } 434 } 435 436 $(#[$outer])* 437 impl $crate::__private::core::ops::Sub for $PublicBitFlags { 438 type Output = Self; 439 440 /// The intersection of a source flags value with the complement of a target flags value (`&!`). 441 /// 442 /// This method is not equivalent to `self & !other` when `other` has unknown bits set. 443 /// `difference` won't truncate `other`, but the `!` operator will. 444 #[inline] 445 fn sub(self, other: Self) -> Self { 446 self.difference(other) 447 } 448 } 449 450 $(#[$outer])* 451 impl $crate::__private::core::ops::SubAssign for $PublicBitFlags { 452 /// The intersection of a source flags value with the complement of a target flags value (`&!`). 453 /// 454 /// This method is not equivalent to `self & !other` when `other` has unknown bits set. 455 /// `difference` won't truncate `other`, but the `!` operator will. 456 #[inline] 457 fn sub_assign(&mut self, other: Self) { 458 self.remove(other); 459 } 460 } 461 462 $(#[$outer])* 463 impl $crate::__private::core::ops::Not for $PublicBitFlags { 464 type Output = Self; 465 466 /// The bitwise negation (`!`) of the bits in a flags value, truncating the result. 467 #[inline] 468 fn not(self) -> Self { 469 self.complement() 470 } 471 } 472 473 $(#[$outer])* 474 impl $crate::__private::core::iter::Extend<$PublicBitFlags> for $PublicBitFlags { 475 /// The bitwise or (`|`) of the bits in each flags value. 476 fn extend<T: $crate::__private::core::iter::IntoIterator<Item = Self>>( 477 &mut self, 478 iterator: T, 479 ) { 480 for item in iterator { 481 self.insert(item) 482 } 483 } 484 } 485 486 $(#[$outer])* 487 impl $crate::__private::core::iter::FromIterator<$PublicBitFlags> for $PublicBitFlags { 488 /// The bitwise or (`|`) of the bits in each flags value. 489 fn from_iter<T: $crate::__private::core::iter::IntoIterator<Item = Self>>( 490 iterator: T, 491 ) -> Self { 492 use $crate::__private::core::iter::Extend; 493 494 let mut result = Self::empty(); 495 result.extend(iterator); 496 result 497 } 498 } 499 }; 500 } 501 502 /// Implement constants on the public (user-facing) bitflags type. 503 #[macro_export] 504 #[doc(hidden)] 505 macro_rules! __impl_public_bitflags_consts { 506 ( 507 $(#[$outer:meta])* 508 $PublicBitFlags:ident: $T:ty { 509 $( 510 $(#[$inner:ident $($args:tt)*])* 511 const $Flag:tt = $value:expr; 512 )* 513 } 514 ) => { 515 $(#[$outer])* 516 impl $PublicBitFlags { 517 $( 518 $crate::__bitflags_flag!({ 519 name: $Flag, 520 named: { 521 $(#[$inner $($args)*])* 522 #[allow( 523 deprecated, 524 non_upper_case_globals, 525 )] 526 pub const $Flag: Self = Self::from_bits_retain($value); 527 }, 528 unnamed: {}, 529 }); 530 )* 531 } 532 533 $(#[$outer])* 534 impl $crate::Flags for $PublicBitFlags { 535 const FLAGS: &'static [$crate::Flag<$PublicBitFlags>] = &[ 536 $( 537 $crate::__bitflags_flag!({ 538 name: $Flag, 539 named: { 540 $crate::__bitflags_expr_safe_attrs!( 541 $(#[$inner $($args)*])* 542 { 543 #[allow( 544 deprecated, 545 non_upper_case_globals, 546 )] 547 $crate::Flag::new($crate::__private::core::stringify!($Flag), $PublicBitFlags::$Flag) 548 } 549 ) 550 }, 551 unnamed: { 552 $crate::__bitflags_expr_safe_attrs!( 553 $(#[$inner $($args)*])* 554 { 555 #[allow( 556 deprecated, 557 non_upper_case_globals, 558 )] 559 $crate::Flag::new("", $PublicBitFlags::from_bits_retain($value)) 560 } 561 ) 562 }, 563 }), 564 )* 565 ]; 566 567 type Bits = $T; 568 569 fn bits(&self) -> $T { 570 $PublicBitFlags::bits(self) 571 } 572 573 fn from_bits_retain(bits: $T) -> $PublicBitFlags { 574 $PublicBitFlags::from_bits_retain(bits) 575 } 576 } 577 }; 578 } 579