pub( crate ) mod private
{
  use crate::*;
                                                                  
  pub fn add_to_item( input : &syn::ItemStruct ) -> syn::ItemStruct
  {
        if input.generics.params.is_empty()
    {
      return item::ensure_comma( input );
    }
        let mut input = input.clone();
        let phantom = tuple( &input.generics.params );
        match &mut input.fields
    {
      syn::Fields::Named( fields ) =>
      {
        let phantom_field : syn::Field = syn::parse_quote!
        {
          _phantom : #phantom
        };
                if !fields.named.empty_or_trailing()
        {
          fields.named.push_punct( Default::default() );
        }
        fields.named.push( phantom_field );
        fields.named.push_punct( Default::default() );       },
      syn::Fields::Unnamed( fields ) =>
      {
        let phantom_field : syn::Field = syn::parse_quote!
        {
          #phantom
        };
                if !fields.unnamed.empty_or_trailing()
        {
          fields.unnamed.push_punct( Default::default() );
        }
        fields.unnamed.push_value( phantom_field );
        fields.unnamed.push_punct( Default::default() );       },
      syn::Fields::Unit =>
      {
              }
    };
    input
  }
                                                pub fn tuple( input : &syn::punctuated::Punctuated< syn::GenericParam, syn::token::Comma > ) -> syn::Type
  {
    use proc_macro2::Span;
    use syn::{ GenericParam, Type };
        let generics_tuple_type =
    {
      let generics_list = input.iter().map( | param |
      {
        match param
        {
          GenericParam::Type( type_param ) =>
          {
            let path = &type_param.ident;
            let path2 : syn::Type = parse_quote!{ *const #path };
            path2
          },
          GenericParam::Lifetime( lifetime_param ) => Type::Reference( syn::TypeReference
          {
            and_token : Default::default(),
            lifetime : Some( lifetime_param.lifetime.clone() ),
            mutability : None,
            elem : Box::new( Type::Tuple( syn::TypeTuple
            {
              paren_token : syn::token::Paren( Span::call_site() ),
              elems : syn::punctuated::Punctuated::new(),
            })),
          }),
          GenericParam::Const( const_param ) => Type::Path( syn::TypePath
          {
            qself : None,
            path : const_param.ident.clone().into(),
          }),
        }
      }).collect::< syn::punctuated::Punctuated< _, syn::token::Comma > >();
      Type::Tuple( syn::TypeTuple
      {
        paren_token : syn::token::Paren( Span::call_site() ),
        elems : generics_list,
      })
    };
    let result : syn::Type = syn::parse_quote!
    {
      ::core::marker::PhantomData< #generics_tuple_type >
    };
    result
  }
}
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
pub use protected::*;
pub mod protected
{
          
  #[ doc( inline ) ]
  #[ allow( unused_imports ) ]
  pub use super::orphan::*;
  #[ doc( inline ) ]
  #[ allow( unused_imports ) ]
  pub use super::private::
  {
    add_to_item,
    tuple,
  };
}
pub mod orphan
{
  #[ doc( inline ) ]
  #[ allow( unused_imports ) ]
  pub use super::exposed::*;
  #[ doc( inline ) ]
  #[ allow( unused_imports ) ]
  pub use super::private::
  {
  };
}
pub mod exposed
{
  pub use super::protected as phantom;
  #[ doc( inline ) ]
  #[ allow( unused_imports ) ]
  pub use super::
  {
    prelude::*,
  };
}
pub mod prelude
{
}