
    "fe                         d Z ddlZddlZddlmZmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ  G d de          Z e	d	d
          Z G d d
e          Z e            Zej        j         Zej        j         ZdS )z2Classes and utilities for packing/unpacking bytes.    N)AnyListOptionalTupleTypeTypeVarUnion   )dump)
exceptionsc                      e Zd ZU dZdZeedf         ed<   eee	eee	edf         f         f         ed<   dZ
ee         ed<   edefd            Zedefd	            Zedefd
            Zedefd            Zej        deddfd            Z	 ddedee         deej                 ddfdZ	 ddededeej                 de	eef         fdZdefdZdefdZdS )DataMetazMeta class for plum types.N
__nbytes__.__implementation____format_name__returnc                     | j         S )z
Type hint.)__name__clss    M/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/plum/data.py__hint__zDataMeta.__hint__   s     |    c                 &    | j         }|| j        }|S )z1Transform format name (for dump "Format" column).)r   r   )r   names     r   r   zDataMeta.name   s     "<<Dr   c                 P    | j         }|t          j        | j        d          |S )Transform format size in bytes.Nz instance sizes vary)r   r   	SizeErrorr   )r   nbytess     r   r   zDataMeta.nbytes%   s1     >&#,'N'N'NOOOr   c                 B    | j         }t          |t                    rd}|S )zGenerated implementation code. )r   
isinstancetuple)r   codes     r   implementationzDataMeta.implementation/   s(     %dE"" 	Dr   valuec                 >   t          t          j                              d         j        }|j        }t
          j                            |j        j	                  }|dk    rdn+t          d |                    d          D                       }||j        |f|d<   d S )Nr
   all c              3   >   K   | ]}|                                 V  d S N)strip).0vs     r   	<genexpr>z*DataMeta.implementation.<locals>.<genexpr>@   s*      +P+P!AGGII+P+P+P+P+P+Pr   ,r   )listinspectstackframef_localsospathabspathf_codeco_filenamer#   splitf_lineno)r   r&   r4   	namespacer7   
selectionss         r   r%   zDataMeta.implementation9   s     W]__%%a(.N	wu|7885..BBe+P+Pu{{3?O?O+P+P+P&P&P 	 ,0*L	&'''r   piecesr   c                 0    t          | j        d          Nz does not support pack	TypeErrorr   r   r&   r?   r   s       r   __pack__zDataMeta.__pack__D   s     3<AAABBBr   bufferoffsetc                 0    t          | j        d          Nz does not support unpackrB   r   rF   rG   r   s       r   
__unpack__zDataMeta.__unpack__I        3<CCCDDDr   c                     d| j         dS Nz<transform class >r   r   s    r   __str__zDataMeta.__str__N       0380000r   c                     d| j         dS rN   rP   r   s    r   __repr__zDataMeta.__repr__Q   rR   r   r+   )r   
__module____qualname____doc__r   r	   int__annotations__strr   r   r   propertyr   r   r   r%   setterr   r   bytes_dumpRecordrE   rK   rQ   rT   r)   r   r   r   r      s'        $$#'Jc4i '''c5c5c?)B#CCDDDD%)OXc])))    X S    X s    X s    X M3 M4 M M M M NRC CC!%eC4<U\4JC	C C C C IME EE$'E/7/EE	sCxE E E E
1 1 1 1 11 1 1 1 1 1 1r   r   CLSData)boundc                   b   e Zd ZU dZdZeedf         ed<   eed<   e	defd            Z
e	 ddee         ded	ee         d
eej                 ddf
d            Ze	 ddee         deded
eej                 deeef         f
d            Zedd            Ze	dej        fd            Zededefd            ZdefdZededeeej        f         fd            Zdeeej        f         fdZededefd            Zededeeej        f         fd            Zedde dedefd            Z!dS )ra   z#Packable/Unpacked bytes base class.Nr   r   r   c                 Z    | j         }|!t          |                                           }|S )r   )r   lenipack)selfr   s     r   r   zData.nbytes_   s*     >&&Fr   r   r&   r?   r   c                 0    t          | j        d          rA   rB   rD   s       r   rE   zData.__pack__i   s     3<AAABBBr   rF   rG   c                 0    t          | j        d          rI   rB   rJ   s       r   rK   zData.__unpack__r   s    
 3<CCCDDDr   r   c                 0    t          | j        d          )Create view of bytes buffer.z does not support view()rB   r   rF   rG   s      r   __view__zData.__view__y   rL   r   c                 4    |                                  \  }}|S )z/Summary containing details of bytes and layout.)ipack_and_dump)rg   _bufferr   s      r   r   z	Data.dump~   s     ++--r   c                     g }	 |                      ||d           n;# t          $ r.}|                     |           t          j                    |d}~ww xY wd                    |          S )ziPack value as formatted bytes.

        :raises: ``PackError`` if type error, value error, etc.

        Nr   )rE   	Exceptionpack_and_dumpr   ImplementationErrorjoin)r   r&   r?   excs       r   packz	Data.pack   s     !	<LL---- 	< 	< 	<e$$$022;		< xxs    
A)AAc                     g }	 |                      | |d           n:# t          $ r-}|                                  t          j                    |d}~ww xY wd                    |          S )zbPack instance as bytes.

        :raises: ``PackError`` if type error, value error, etc.

        Nr   )rE   rr   ro   r   rt   ru   )rg   r?   rv   s      r   rf   z
Data.ipack   s}     !	<MM$---- 	< 	< 	<!!!022;		< xxs    
A(AAc                    t          j                    }g }	 |                     |||                    | j                             n)# t
          $ r}t          j        ||          |d}~ww xY wd                    |          |fS )zPack value as formatted bytes and produce bytes summary.

        :raises: ``PackError`` if type error, value error, etc.

        fmtr   	exceptionNr   )	r^   DumprE   
add_recordr   rr   r   	PackErrorru   )r   r&   r   r?   rv   s        r   rs   zData.pack_and_dump   s     z|| 	JLLCH(E(EFFFF 	J 	J 	J&DC@@@cI	J xx%%s   0A 
A.A))A.c           	      *   t          j                    }g }	 |                     | ||                    t	          |           j                             n)# t          $ r}t          j        ||          |d}~ww xY wd	                    |          |fS )z|Pack instance as bytes and produce bytes summary.

        :raises: ``PackError`` if type error, value error, etc.

        rz   r|   Nr   )
r^   r~   rE   r   typer   rr   r   r   ru   )rg   dmpr?   rv   s       r   ro   zData.ipack_and_dump   s     jll 	IMM$4::?(K(KLLLL 	I 	I 	I&C3???SH	I xx$$s   =A 
A;A66A;c                     	 |                      |dd          \  }}||d         rt          j                    |S # t          $ r.}|                     |           t          j                    |d}~ww xY w)zUnpack value from formatted bytes.

        :raises: ``UnpackError`` if insufficient bytes, excess bytes, or value error

        r   N)rK   r   ExcessMemoryErrorrr   unpack_and_dumprt   )r   rF   itemrG   rv   s        r   unpackzData.unpack   s    
	<>>&!T::LD&fgg 5 2444K 	< 	< 	<'''022;	<s   8; 
A3)A..A3c                    t          j                    }	 |                     |d|                    | j                            \  }}||d         }|rft          dt          |          d          D ]3}|                    |||dz                      }|sd|_        d|_        4t          j
        |          n(# t          $ r}t          j        ||          |d}~ww xY w||fS )zUnpack value from bytes and produce packed bytes summary.

        :raises: ``UnpackError`` if insufficient bytes, excess bytes, or value error

        r   rz   N   )memoryTz<excess bytes>)r^   r~   rK   r   r   rangere   separater&   r   r   rr   UnpackError)	r   rF   r   r   rG   extra_bytesirecordrv   s	            r   r   zData.unpack_and_dump   s    jll	<>>&!S^^^5Q5QRRLD& /K @q#k"2"2B77 8 8A ^^;q1r6z3J^KKF 8*.'7 2;???@  	< 	< 	<(c22;	< Sys   B%B; ;
C CC c                 .    |                      ||          S )rk   )rm   rl   s      r   viewz	Data.view   s     ||FF+++r   r+   )r   )"r   rU   rV   rW   r   r	   rX   rY   rZ   r[   r   classmethodr   r`   r   r   r]   r   r^   r_   rE   r   rK   rm   r~   r   rw   rf   rs   ro   r   r   	bytearrayr   r)   r   r   ra   ra   X   s        --#'Jc4i '''    X 
 (,	C C#YCC UC u|$	C
 
C C C [C SWE E#YE %E/2E:B5<:PE	sCxE E E [E E E E [E ej    X
           [ $ u        $ &# &%uz0A*B & & & [&%eUZ&7 8 % % % % <E <c < < < [<$ U uS%*_/E    [4 , ,) ,S , , , , [, , ,r   )	metaclass)rW   r2   r6   typingr   r   r   r   r   r   r	   r!   r   r^   r   r   r   r`   ra   globalsplum_namespacerf   packmethod_docr   unpackmethod_docr)   r   r   <module>r      s#   9 8  				 C C C C C C C C C C C C C C C C C C            D1 D1 D1 D1 D1t D1 D1 D1N ge6"""a, a, a, a, a,X a, a, a, a,J #;&   r   