
    "f+                     h    d Z ddlmZ ddlmZmZmZmZmZ ddlm	Z	 ddl
mZ dZ G d	 d
          ZdS )z2BitFields __init__ and property methods generator.    )EnumMeta)AnyDict	GeneratorTuple
ValuesView   )EnumX   )BitFieldz    c                       e Zd ZU dZeedf         ed<   dee         ddfdZde	de
eddf         fdZd	efd
Zd	edefdZde
eddf         fdZdeeef         de	dede
eddf         fdZdS )	CodeMakerz BitFields method code generator..	bitfieldsreturnNc                    t          |          | _        i | _        i | _        i | _        |D ]}|j        }|j        }|t          t          hv r
|j	        x}}n>t          |t                    rd|j        j	         d}d}nt          |j	                  }d}|dk    rd| d| j        |<   n
d| j        |<   || j        |<   || j        |<   d S )NzUnion[int, 'z']_typz, _typ=z.typ )tupler   hints
typ_params	typ_namesnametypintbool__name__
isinstancer
   enumrepr)selfr   bitfieldbitfield_namebitfield_typhinttyp_names          ]/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/plum/bitfields/code_maker.py__init__zCodeMaker.__init__   s     y))
! 	- 	-H$MM#<LT{**"."77xxL%00 "Dl&7&@DDD! L122!6!!1N=1N1N1N..13.,4DN=)(,DJ}%%/	- 	-    defaultc              #   f  K   g }| j         D ]G}|j         d| j        |j                  }|j        |d|j         z  }|                    |           Hd                    |          }|r	d| dV  ndV  t          d| z   V  | j         D ]}t          d	|j         d|j         z   V  d
V  dS )zGenerate __init__ method lines.z: Nz = , zdef __init__(self, *, 
) -> None:zdef __init__(self) -> None:zself.__value__ = zself.r   )r   r   r   r)   appendjoinINDENT)r    r)   
parametersr!   	parameterargss         r&   iter_init_lineszCodeMaker.iter_init_lines8   s     
 	) 	)H#=GGDJx},EGGI+58#3555	i((((yy$$ 	0;4;;;;;;;////47444444 	E 	EHD8=DDX]DDDDDDDr(   r!   c              #     K   |j         }d| dV  d| d| j        |          d| j        |          dV  |j        rt          d|j         dz   V  |j        rd|j         d	|j         }n
d
|j         }|j        r.t          d| z   V  t          d|j         d|j	         dz   V  d}t          |j        d          rt          d| dz   V  t          dz   V  t          dz   V  t          dz   V  t          d|j         dz   V  |j        r t          dz   V  t          d|j         z   V  t          dz   V  d}n$| j        |         dk    r| j        |          d| d}t          d| z   V  dV  dS ) zGenerate getter.@z.getterdef z(selfz) -> :"""z(int(self) >> z) & zint(self) & zvalue = zvalue = -((1 << z) - value) if z & value else valuevalue
__fields__zvalue = _typ.from_int()try:/    bitoffset, store = self.__bitoffset_store__except AttributeError:    bitoffset, store = , selfelse:    bitoffset += z,value.__bitoffset_store__ = bitoffset, storer   (zreturn r   N)r   r   r   docr/   lsbmasksignedsizesignbithasattrr   r   )r    r!   r"   retvals       r&   iter_getter_lineszCodeMaker.iter_getter_linesQ   s6      (-((((((j]jj)GjjdjYfNgjjjjjj< 	322222222< 	4GhlGGGGFF3HM33F? 	.f......phmpp8K[pppppppF8<.. 	B=F=======6/!!!LLLLL33333IX\IIIIIII| Bw&&&&A8<AAAAAAIIIIIFF^M*e33}5AAAAAF)))))))r(   nestedc              #     K   |j         }|j        }| j        |         }| j        |         }| j        |         }d| dV  d| d| | dV  |j        rt          d|j         dz   V  t          |j        d          rt          dz   V  n#|d	k    rt          d
z   V  nt          d| dz   V  t          |d          s[t          |t                    sF|t          ur=t          d|j         d|j         dz   V  t          d|d|j         d|j         dz   V  |r~t          dz   V  t          dz   V  t          dz   V  t          d|j         dz   V  |j        r t          dz   V  t          d|j         z   V  t          d|j         d|j         dz   V  nT|j        r/t          d|j        |j        z    d|j         d |j         d!z   V  nt          d|j          d"|j         d!z   V  d#V  d$S )%zGenerate setter.r5   z.setterr6   z(self, value: r,   r8   r:   z!value = int(_typ.from_int(value))r   zvalue = int(value)zvalue = int(z(value))zif not (z <= value <= z):z     raise ValueError("bit field z
 requires z <= number <= z")r<   r=   r>   r?   r@   rA   rB   z'store.__value__ = (store.__value__ & ~(z << bitoffset)) | ((value & z) << bitoffset)z#self.__value__ = (self.__value__ & z) | ((value & z) << r;   z) | (value & r   N)r   r   r   r   r   rD   r/   rJ   r   r   r   minvaluemaxvaluerE   rF   )r    r!   rM   r"   r   r$   	typ_paramr%   s           r&   iter_setter_lineszCodeMaker.iter_setter_linesv   s^      lz-(OM2	>-0(-((((((M]MM$M	MMMMMM< 	3222222228<.. 	=>>>>>>//////<(<<<<<<< \**	PsH--	P 4[h&7[[hFW[[[[[[[  Pm  P  PYaYj  P  P  {C  {L  P  P  P  P  P  P  P 	o6/!!!LLLLL33333IX\IIIIIII| Bw&&&&A8<AAAAAA  OX]  O  Opxp}  O  O  O  O  O  O  O  O\ 	o  U8=T\T`C`Aa  U  Uqyq~  U  U  FN  FR  U  U  U  U  U  U  U  Un(-nn^f^knnnnnnnr(   c              #      K   d                     d | j        D                       }d}dV  dV  d| d| dV  d	V  d| d
V  dV  dS )z$Bitfields __repr__ method generator.r+   c              3   2   K   | ]}|j         	|j         V  d S )N)argrepr).0fs     r&   	<genexpr>z,CodeMaker.iter_repr_lines.<locals>.<genexpr>   s+      MMA19MaiMMMMMMr(   z{type(self).__name__}zdef __repr__(self) -> str:z    try:z        return f"rC   z)"z    except Exception:z()"r   N)r.   r   )r    	arg_reprs
class_names      r&   iter_repr_lineszCodeMaker.iter_repr_lines   s      IIMMMMMMM	,
****<*<<y<<<<<<%%%%1*111111r(   	namespacec              #   4  K   d|vr|                      |          E d{V  | j        D ]N}|j        |                     |          E d{V  |j        #|j        s|                     ||          E d{V  Od|vr|                                 E d{V  dS dS )z+Generate BitFields class method code lines.r'   N__repr__)r3   r   fgetrL   fsetreadonlyrR   r[   )r    r\   r)   rM   r!   s        r&   
iter_lineszCodeMaker.iter_lines   s       Y&&++G444444444 	D 	DH}$11(;;;;;;;;;}$X->$11(FCCCCCCCCCY&&++----------- '&r(   )r   
__module____qualname____doc__r   r   __annotations__r   r'   r   r   strr3   rL   r   rR   r[   r   r   rb    r(   r&   r   r      s6        **Xs]####!-h'!- 
!- !- !- !-Fs ydD/I    2#( # # # #J*( *D * * * *X
3d?!; 
 
 
 
.c3h.25.?C.	3d?	#. . . . . .r(   r   N)re   r   r   typingr   r   r   r   r   r
   r!   r   r/   r   rh   r(   r&   <module>rj      s    9 8       : : : : : : : : : : : : : :            	m. m. m. m. m. m. m. m. m. m.r(   