
    [f              	           d Z ddlmZmZmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZmZmZmZmZ ddlmZmZmZ dd	lmZ d
e_        dedefdZddededefdZddededeeef   fdZdededefdZdedefdZy)zUtility functions.    )AnyListTuple   )getbytes)DataDataMeta)Dump)ExcessMemoryErrorImplementationError	PackError	SizeErrorUnpackError)calcsizeitemsItemsFormat)	Transformplumfmtreturnc                     t        | t              rt        | d      }n.t        | t        t        f      r| j
                  }nt        |       }|t        d      |S )z:Calculate format size (raise SizeError if variably sized).
__nbytes__zsize varies)
isinstancer	   getattrr   r   nbytes	_calcsizer   )r   r   s     ]/mounts/lovelace/software/anaconda3/envs/py312/lib/python3.12/site-packages/plum/utilities.pyr   r      sP    #x l+	C$	*	+ 3~&&M    Nvaluec                     g }	 t        j                  | |d|       dj                  |      S # t        $ r}t        | |       t	               |d}~ww xY w)zaPack value as formatted bytes.

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

    Nr   )r   __pack__	Exceptionpack_and_dumpr   join)r   r   piecesexcs       r   packr'   )   sX     F-ufdC0 88F  -eS!!#,	-s   - 	AAAc                    t               }g }	 t        j                  | ||j                         |       |j                          dj                  |      |fS # t        $ r#}|j                          t        ||      |d}~ww xY w)z{Pack value as formatted bytes and produce bytes summary.

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

    )dump	exceptionNr   )r
   r   r!   
add_recordr"   trim_blank_recordr   r$   )r   r   r)   r%   r&   s        r   r#   r#   <   s}     6DF;ufdoo&7= 	88FT!!  ; TS1s:;s   &A 	B A>>Bbufferc                     	 t        j                  |dd|       \  }}||d rt        d      	 |S # t        $ r}t	        | |       t               |d}~ww xY w)zkUnpack value from formatted bytes.

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

    r   Nz)too many bytes, retry with dump to follow)r   
__unpack__r   r"   unpack_and_dumpr   )r   r-   r   offsetr&   s        r   unpackr2   Q   si    -((D#>v&'?#$OPP  L  -V$!#,-s   +0 	AAAc                    t               }	 |j                         }t        j                  |d||       \  }}||d }|rOt	        dt        |      d      D ]+  }|j                  |||dz          }|rd|_        d|_        - t        |      	 |j                          ||fS # t        $ r"}	|j                          t        ||	      |	d}	~	ww xY w)zUnpack value from formatted bytes and produce a packed bytes summary.

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

    r   N   )memoryTz<excess bytes>)r
   r+   r   r/   rangelenseparater   r   r"   r,   r   )
r   r-   r)   dump_recordr   r1   extra_bytesirecordr&   s
             r   r0   r0   d   s     6D.oo'((KEvVWo1c+.3 4$//{1q2v7N/O&*FO#3FL4 $K00 " 	$;  . $$#-.s   A%B" 2B" "	C+CC)N)__doc__typingr   r   r   	_getbytesr   datar   r	   r)   r
   
exceptionsr   r   r   r   r   r   r   r   r   	transformr   
__module__intbytesr'   r#   r2   r0    r   r   <module>rG      s     # #      = <   + # " +  &" "; "%t:L "* U s &# #e #r   