(
info: &EnumSetInfo,
paths: &Paths,
repr: &SynTokenStream,
)
| 623 | } |
| 624 | |
| 625 | fn create_enum_const_opers( |
| 626 | info: &EnumSetInfo, |
| 627 | paths: &Paths, |
| 628 | repr: &SynTokenStream, |
| 629 | ) -> SynTokenStream { |
| 630 | let name = &info.name; |
| 631 | let enumset = &paths.enumset; |
| 632 | let internal = &paths.internal; |
| 633 | let vis = &info.vis; |
| 634 | |
| 635 | let value_to_bit = if info.variants.is_empty() { |
| 636 | quote! { 0 } |
| 637 | } else if info.uses_lsb_encoding() { |
| 638 | quote! { value as u32 } |
| 639 | } else if let Some(size) = info.uses_msb_encoding() { |
| 640 | quote! { ((#size as u32) - 1 - (value as u32)) } |
| 641 | } else if info.uses_mask_encoding() { |
| 642 | quote! { (value as i64).trailing_zeros() } |
| 643 | } else { |
| 644 | let variant_bits: Vec<_> = info.variants.iter().map(|x| x.variant_bit).collect(); |
| 645 | let variant_names: Vec<_> = info.variants.iter().map(|x| x.name.clone()).collect(); |
| 646 | quote! { |
| 647 | match value { |
| 648 | #(#name::#variant_names => #variant_bits,)* |
| 649 | } |
| 650 | } |
| 651 | }; |
| 652 | |
| 653 | let const_impls = match info.internal_repr() { |
| 654 | InternalRepr::U8 |
| 655 | | InternalRepr::U16 |
| 656 | | InternalRepr::U32 |
| 657 | | InternalRepr::U64 |
| 658 | | InternalRepr::U128 => { |
| 659 | quote! { |
| 660 | #[automatically_derived] |
| 661 | #[doc(hidden)] |
| 662 | impl __EnumSetInitHelper { |
| 663 | pub const fn const_only(&self, value: #name) -> #enumset::EnumSet<#name> { |
| 664 | #internal::set::new(1 << (#value_to_bit as #repr)) |
| 665 | } |
| 666 | } |
| 667 | |
| 668 | #[automatically_derived] |
| 669 | #[doc(hidden)] |
| 670 | impl __EnumSetOpHelper { |
| 671 | pub const fn const_union( |
| 672 | &self, |
| 673 | a: #enumset::EnumSet<#name>, |
| 674 | b: #enumset::EnumSet<#name>, |
| 675 | ) -> #enumset::EnumSet<#name> { |
| 676 | #internal::set::new(#internal::set::get(a) | #internal::set::get(b)) |
| 677 | } |
| 678 | |
| 679 | pub const fn const_intersection( |
| 680 | &self, |
| 681 | a: #enumset::EnumSet<#name>, |
| 682 | b: #enumset::EnumSet<#name>, |
no test coverage detected