MCPcopy Create free account
hub / github.com/Lymia/enumset / create_enum_const_opers

Function create_enum_const_opers

enumset_derive/src/gen.rs:625–804  ·  view source on GitHub ↗
(
    info: &EnumSetInfo,
    paths: &Paths,
    repr: &SynTokenStream,
)

Source from the content-addressed store, hash-verified

623}
624
625fn 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>,

Callers 1

generate_codeFunction · 0.85

Calls 6

is_emptyMethod · 0.80
uses_lsb_encodingMethod · 0.80
uses_msb_encodingMethod · 0.80
uses_mask_encodingMethod · 0.80
internal_reprMethod · 0.80
iterMethod · 0.45

Tested by

no test coverage detected