o
    Rh                     @   s  d Z ddlZddlZddlZddlZdZG dd dejZdddd	d
Zddddd
Z	dddZ
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# fd$d%ZG d&d' d'ejZG d(d) d)ZG d*d+ d+ZG d,d- d-eZG d.d/ d/eZG d0d1 d1eZG d2d3 d3eZG d4d5 d5eZG d6d7 d7eZG d8d9 d9eZG d:d; d;Zd<d= ZG d>d? d?Z d@dA Z!dBdC Z"G dDdE dEZ#G dFdG dGZ$dHdI Z%dJdK Z&dLdM Z'dS )NzImplementation of FlexBuffers binary format.

For more info check https://google.github.io/flatbuffers/flexbuffers.html and
corresponding C++ implementation at
https://github.com/google/flatbuffers/blob/master/include/flatbuffers/flexbuffers.h
    N)TypeBuilderGetRootDumpsLoadsc                   @   sP   e Zd ZdZdZdZdZdZedd Z	edd	 Z
ed
d Zedd ZdS )BitWidthzSupported bit widths of value types.

  These are used in the lower 2 bits of a type field to determine the size of
  the elements (and or size field) of the item pointed to (e.g. vector).
  r            c                 C   sP   | dksJ | dk rt jS | dk rt jS | dk rt jS | dk r"t jS td|  )z@Returns the minimum `BitWidth` to encode unsigned integer value.r      i   l        l            zvalue is too big to encode: %s)r   W8W16W32W64
ValueErrorvalue r   Y/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/flatbuffers/flexbuffers.pyU,   s   z
BitWidth.Uc                 C   s"   | d9 } t | dkr| S |  S )z>Returns the minimum `BitWidth` to encode signed integer value.r	   r   )r   r   r   r   r   r   I<   s   z
BitWidth.Ic                 C   s(   t dt d| d | krtjS tjS )z6Returns the `BitWidth` to encode floating point value.z<fr   )structunpackpackr   r   r   r   r   r   r   FK   s   z
BitWidth.Fc                 C   s   t jt jt jt jd|  S )Nr   r	         )r   r   r   r   r   
byte_widthr   r   r   BR   s   z
BitWidth.BN)__name__
__module____qualname____doc__r   r   r   r   staticmethodr   r   r   r    r   r   r   r   r   !   s    


r   bhiqr   r    Hr   Qfd)r   r   c                 C   s   t d| t|  |d S )N<%sr   )r   r   len)fmtbufr   r   r   _Unpacka   s   r2   c                 C   s$   t || }td|| | f |S Nz<%d%s)r/   r   r   )r0   r1   lengthr   r   r   r   _UnpackVectore   s   r5   c                 C   s   t d| |  |S )Nr.   )r   r   )r0   r   r   r   r   r   _Packj      r6   c                 C   s"   t jdt|| | f g|R  S r3   )r   r   r/   )r0   valuesr   r   r   r   _PackVectorn   s   "r9   c                 C   s(   d|> |krt | |||d |< dS dS )Nr   TF)r6   )r0   r1   r   r   value_bit_widthr   r   r   _Mutater   s   r;   c                 C   s   |  |d @ S Nr   r   )buf_sizescalar_sizer   r   r   _PaddingBytes|      r?   c                 C   s>   || j d u rdn| j  }|| jd u r|n| j }t||| jS Nr   )startstopslicestep)soffsetr4   rB   rC   r   r   r   _ShiftSlice   s   rH   c                 C   sj   dt | }}|| }|dkr3|}|d }||7 }|| | |r-|d7 }|}||d 8 }n|}|dks|S )z3Implementation of C++ std::lower_bound() algorithm.r   r	   r   )r/   )r8   r   predfirstlastcountr(   rE   r   r   r   _LowerBound   s   
rM   c                 C   s   | |k S Nr   )xyr   r   r   <lambda>   s    rQ   c                 C   s.   t | ||}|t| kr||| | s|S dS )z5Implementation of C++ std::binary_search() algorithm.)rM   r/   )r8   r   rI   indexr   r   r   _BinarySearch   s   rT   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZe dd Z!e d d! Z"e d"d# Z#e d$d% Z$e d&d' Z%e d(d) Z&e d*d+ Z'e d,d- Z(e d.d/ Z)e d3d0d1Z*d2S )4r   zxSupported types of encoded data.

  These are used as the upper 6 bits of a type field to indicate the actual
  type.
  r   r   r	   r
   r            r   	   
                                                   $   c                 C   s   t | d> |B S )Nr	   )int)type_	bit_widthr   r   r   Pack      z	Type.Packc                 C   s   d| d@ > t | d? fS )Nr   r
   r	   )r   packed_typer   r   r   Unpack      zType.Unpackc                 C   s   | t jkp	| t jkS rN   )r   FLOATBOOLrl   r   r   r   IsInline      zType.IsInlinec                 C   &   t j|   kot jkn  p| t jkS rN   )r   
VECTOR_INTVECTOR_STRING_DEPRECATEDVECTOR_BOOLrv   r   r   r   IsTypedVector   s   zType.IsTypedVectorc                 C   ry   rN   )r   INTSTRINGru   rv   r   r   r   IsTypedVectorElementType   s   &zType.IsTypedVectorElementTypec                 C   s&   t | s	tdt | t j t j S )Nzmust be typed vector type)r   r}   r   rz   r~   rv   r   r   r   ToTypedVectorElementType   s   
zType.ToTypedVectorElementTypec                 C      t j|   kot jkS   S rN   )r   VECTOR_INT2VECTOR_FLOAT4rv   r   r   r   IsFixedTypedVector      zType.IsFixedTypedVectorc                 C   r   rN   )r   r~   rt   rv   r   r   r   IsFixedTypedVectorElementType   r   z"Type.IsFixedTypedVectorElementTypec                 C   s:   t | s	td| t j }t |d t j |d d fS )Nzmust be fixed typed vector typer
   r	   )r   r   r   r   r~   )rl   
fixed_typer   r   r   ToFixedTypedVectorElementType   s   

z"Type.ToFixedTypedVectorElementTypec                 C   s   |dkrt | stdn	t | std| t j }|dkr't |t j S |dkr2t |t j S |dkr=t |t j S |dkrHt |t j S td| )a  Converts element type to corresponding vector type.

    Args:
      element_type: vector element type
      fixed_len: number of elements: 0 for typed vector; 2, 3, or 4 for fixed
        typed vector.

    Returns:
      Typed vector type or fixed typed vector type.
    r   z!must be typed vector element type'must be fixed typed vector element typer	   r
   r   zunsupported fixed_len: %s)	r   r   r   r   r~   rz   r   VECTOR_INT3VECTOR_INT4)element_type	fixed_lenrG   r   r   r   ToTypedVector   s    


zType.ToTypedVectorNr   )+r!   r"   r#   r$   NULLr~   UINTrt   KEYr   INDIRECT_INTINDIRECT_UINTINDIRECT_FLOATMAPVECTORrz   VECTOR_UINTVECTOR_FLOAT
VECTOR_KEYr{   r   VECTOR_UINT2VECTOR_FLOAT2r   VECTOR_UINT3VECTOR_FLOAT3r   VECTOR_UINT4r   BLOBru   r|   r%   rn   rr   rw   r}   r   r   r   r   r   r   r   r   r   r   r      sd    








r   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )BufzHClass to access underlying buffer object starting from the given offset.c                 C   s4   || _ |dkr	|nt|| | _t|| j | _d S rA   )_bufr/   _offset_length)selfr1   rG   r   r   r   __init__  s   zBuf.__init__c                 C   sB   t |tr| jt|| j| j S t |tr| j| j|  S tdNzinvalid key type
isinstancerD   r   rH   r   r   rk   	TypeErrorr   keyr   r   r   __getitem__   s
   

zBuf.__getitem__c                 C   sJ   t |tr|| jt|| j| j< d S t |tr!|| j| j| < d S tdr   r   )r   r   r   r   r   r   __setitem__(  s
   

zBuf.__setitem__c                 C   s
   d| j  S )Nzbuf[%d:])r   r   r   r   r   __repr__0     
zBuf.__repr__c                 C   s   | j | jd |S )z<Returns the lowest index where the sub subsequence is found.N)r   r   find)r   subr   r   r   Find3  s   zBuf.Findc                 C   s   t | j| j| S )z5Returns new `Buf` which starts from the given offset.)r   r   r   )r   rG   r   r   r   Slice7     z	Buf.Slicec              	   C   s    |  |tt| |||   S )zAReturn new `Buf` based on the encoded offset (indirect encoding).)r   r2   r   )r   rG   r   r   r   r   Indirect;  s    zBuf.IndirectN)r!   r"   r#   r$   r   r   r   r   r   r   r   r   r   r   r   r     s    r   c                   @   s(   e Zd ZdZdZdd Zedd ZdS )Objectz.Base class for all non-trivial data accessors.r   _byte_widthc                 C   s   || _ || _d S rN   r   r   r1   r   r   r   r   r   D  s   
zObject.__init__c                 C      | j S rN   )r   r   r   r   r   	ByteWidthH     zObject.ByteWidthN)r!   r"   r#   r$   	__slots__r   propertyr   r   r   r   r   r   @  s    r   c                       s:   e Zd ZdZdZd
 fdd	Zedd Zdd	 Z  Z	S )SizedzBBase class for all data accessors which need to read encoded size._sizer   c                    s2   t  || |dkrtt| j| _d S || _d S rA   )superr   r2   r   	SizeBytesr   )r   r1   r   size	__class__r   r   r   Q  s   
zSized.__init__c                 C   s   | j | j d S rA   r   r   r   r   r   r   X  r   zSized.SizeBytesc                 C   r   rN   r   r   r   r   r   __len__\  s   zSized.__len__r   )
r!   r"   r#   r$   r   r   r   r   r   __classcell__r   r   r   r   r   M  s    
r   c                   @   s(   e Zd ZdZdZedd Zdd ZdS )Blobz)Data accessor for the encoded blob bytes.r   c                 C      | j dt|  S rA   r   r/   r   r   r   r   Bytesd  r   z
Blob.Bytesc                 C      d| j t| f S )NzBlob(%s, size=%d)r   r   r   r   r   r   h     zBlob.__repr__N)r!   r"   r#   r$   r   r   r   r   r   r   r   r   r   `  s    
r   c                   @   s8   e Zd ZdZdZedd Zdd Zdd Zd	d
 Z	dS )Stringz+Data accessor for the encoded string bytes.r   c                 C   r   rA   r   r   r   r   r   r   p  r   zString.Bytesc                 C   sn   | d}t|}|t| kr5tt|| j| j| j d< || jd|< tt| | | j|t| < dS dS )a4  Mutates underlying string bytes in place.

    Args:
      value: New string to replace the existing one. New string must have less
        or equal UTF-8-encoded bytes than the existing one to successfully
        mutate underlying byte buffer.

    Returns:
      Whether the value was mutated or not.
    utf-8r   TF)encoder/   r6   r   r   r   	bytearray)r   r   encodednr   r   r   Mutatet  s   
zString.Mutatec                 C      | j dS )Nr   r   decoder   r   r   r   __str__     zString.__str__c                 C   r   )NzString(%s, size=%d)r   r   r   r   r   r     r   zString.__repr__N)
r!   r"   r#   r$   r   r   r   r   r   r   r   r   r   r   r   l  s    
r   c                       sH   e Zd ZdZdZ fddZedd Zdd Zd	d
 Z	dd Z
  ZS )Keyz(Data accessor for the encoded key bytes.r   c                    s   |dksJ t  || d S r<   )r   r   r   r   r   r   r     s   zKey.__init__c                 C   r   rA   r   r   r   r   r   r     r   z	Key.Bytesc                 C   r   rA   )r   r   r   r   r   r   r     r   zKey.__len__c                 C   r   )Nasciir   r   r   r   r   r     r   zKey.__str__c                 C   r   )NzKey(%s, size=%d)r   r   r   r   r   r     r   zKey.__repr__)r!   r"   r#   r$   r   r   r   r   r   r   r   r   r   r   r   r   r     s    
r   c                   @   s0   e Zd ZdZdZdd Zedd Zdd Zd	S )
Vectorz+Data accessor for the encoded vector bytes.r   c                 C   sb   |dk s
|t | krtd|t | f | jt | | j |  }| j|| j }t|| j|S )Nr   'vector index %s is out of [0, %d) range)r/   
IndexErrorr   r   r   Ref
PackedType)r   rS   rq   r1   r   r   r   r     s   
zVector.__getitem__c                 C   s   dd | D S )z5Returns the underlying encoded data as a list object.c                 S      g | ]}|j qS r   Value.0er   r   r   
<listcomp>      z Vector.Value.<locals>.<listcomp>r   r   r   r   r   r     s   zVector.Valuec                 C      d| j | j| jf S )Nz"Vector(%s, byte_width=%d, size=%d))r   r   r   r   r   r   r   r     s   zVector.__repr__N)	r!   r"   r#   r$   r   r   r   r   r   r   r   r   r   r     s    	
r   c                       sZ   e Zd ZdZdZd fdd	Zedd Zedd	 Zd
d Z	edd Z
dd Z  ZS )TypedVectorzGData accessor for the encoded typed vector or fixed typed vector bytes.)_element_typer   r   c                    s*   t  ||| |tjkrtj}|| _d S rN   )r   r   r   r   r   r   )r   r1   r   r   r   r   r   r   r     s   

zTypedVector.__init__c                 C   s   | j d | jt|   S rN   )r   r   r/   r   r   r   r   r     rs   zTypedVector.Bytesc                 C   r   rN   )r   r   r   r   r   ElementType  r   zTypedVector.ElementTypec                 C   sL   |dk s
|t | krtd|t | f | j|| j }t|| jd| jS )Nr   r   r   )r/   r   r   r   r   r   r   )r   rS   r1   r   r   r   r     s   
zTypedVector.__getitem__c                 C   s   | sg S | j tju rdd tt| jt| D S | j tju r)ttt	| jt| S | j tj
u r:ttt| jt| S | j tju rKttt| jt| S | j tju rXdd | D S | j tju redd | D S td| j  )z'Returns underlying data as list object.c                 S   s   g | ]}t |qS r   )boolr   r   r   r   r         z%TypedVector.Value.<locals>.<listcomp>c                 S   r   r   )AsKeyr   r   r   r   r     r   c                 S   r   r   )AsStringr   r   r   r   r     r   unsupported element_type: %s)r   r   ru   r5   r   r   r/   r~   listr   r   rt   r   r   r   r   r   r   r   r   r     s   zTypedVector.Valuec                 C      d| j | j| j| jf S )Nz8TypedVector(%s, byte_width=%d, element_type=%s, size=%d))r   r   r   r   r   r   r   r   r        zTypedVector.__repr__r   )r!   r"   r#   r$   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    


r   c                       sX   e Zd ZdZedd Z fddZedd Zedd	 Z	ed
d Z
dd Z  ZS )Mapz(Data accessor for the encoded map bytes.c                 C   s(   t | tr| j} t |tr|j}| |k S rN   )r   r   
AsKeyBytesar&   r   r   r   CompareKeys  s
   

zMap.CompareKeysc                    sH   t |trt |S t| j|d| j}|dkr t |S t|)Nr   rR   )	r   rk   r   r   rT   Keysr   r   KeyError)r   r   rS   r   r   r   r     s   
zMap.__getitem__c                 C   sB   t t| jd| j | j  }| jd| j | j}t||tjS )N)r2   r   r   r   r   r   r   r   )r   r   r1   r   r   r   r     s   zMap.Keysc                 C   s   t | j| jS rN   )r   r   r   r   r   r   r   Values  r@   z
Map.Valuesc                 C   s   dd t | j| jD S )Nc                 S   s   i | ]	\}}|j |j qS r   r   )r   kvr   r   r   
<dictcomp>  s    zMap.Value.<locals>.<dictcomp>)zipr   r  r   r   r   r   r     rs   z	Map.Valuec                 C   r   )NzMap(%s, size=%d)r   r   r   r   r   r     r   zMap.__repr__)r!   r"   r#   r$   r%   r   r   r   r   r  r   r   r   r   r   r   r   r     s    




r   c                   @   s  e Zd ZdZdZedd Zdd Zdd Ze	d	d
 Z
dd Zdd Ze	dd Ze	dd Ze	dd Zdd Ze	dd Ze	dd Ze	dd Zdd Ze	dd  Ze	d!d" Zd#d$ Ze	d%d& Ze	d'd( Ze	d)d* Ze	d+d, Ze	d-d. Ze	d/d0 Zd1d2 Ze	d3d4 Ze	d5d6 Z e	d7d8 Z!e	d9d: Z"e	d;d< Z#e	d=d> Z$e	d?d@ Z%e	dAdB Z&e	dCdD Z'e	dEdF Z(e	dGdH Z)e	dIdJ Z*dKS )Lr   z)Data accessor for the encoded data bytes.r   _parent_widthr   _typec                 C   s   t |\}}t| |||S rN   )r   rr   r   )r1   parent_widthrq   r   rl   r   r   r   r   #  s   zRef.PackedTypec                 C   s   || _ || _|| _|| _d S rN   r  )r   r1   r
  r   rl   r   r   r   r   (  s   
zRef.__init__c                 C   r   )Nz1Ref(%s, parent_width=%d, byte_width=%d, type_=%s)r  r   r   r   r   r   .  r   zRef.__repr__c                 C   s   | j d | j S rN   )r   r  r   r   r   r   _Bytes2  ro   z
Ref._Bytesc                 C   s   t d| j|f )Nzcannot convert %s to %s)r   r	  )r   target_typer   r   r   _ConvertError6  r   zRef._ConvertErrorc                 C   s   | j d| jS rA   )r   r   r  r   r   r   r   	_Indirect9  s   zRef._Indirectc                 C      | j tju S rN   )r	  r   r   r   r   r   r   IsNull<     z
Ref.IsNullc                 C   r  rN   )r	  r   ru   r   r   r   r   IsBool@  r  z
Ref.IsBoolc                 C   s&   | j tju rttt| jS | jdkS rA   )r	  r   ru   r   r2   r   r  AsIntr   r   r   r   AsBoolD  s   
z
Ref.AsBoolc                 C   s   | j ott| j|| jtjS )zMutates underlying boolean value bytes in place.

    Args:
      value: New boolean value.

    Returns:
      Whether the value was mutated or not.
    )r  r;   r   r   r  r   r   r   r   r   r   r   
MutateBoolK  s   	zRef.MutateBoolc                 C   s   | j p| jS rN   )IsIntIsFloatr   r   r   r   	IsNumericW  r  zRef.IsNumericc                 C   s   | j tjtjtjtjfv S rN   )r	  r   r~   r   r   r   r   r   r   r   r  [  s   z	Ref.IsIntc                 C   s   | j rdS | jrt| jS | jtju rtt| j	S | jtj
u r+tt|  d| j S | jtju r7tt| j	S | jtju rItt|  d| j S | jrQt| jS | jrYt| jS | jrat| jS | jrit| jS | jrqt| jS | jryt| jS | tj)z+Returns current reference as integer value.r   N)r  r  rk   r  r	  r   r~   r2   r   r  r   r  r   r   r   r   IsStringr/   r   IsKeyr   IsBlobAsBlobIsVectorAsVectorr}   AsTypedVectorr   AsFixedTypedVectorr  r   r   r   r   r  `  s2   






z	Ref.AsIntc                 C   s   | j tju rtt| j|| jt|S | j tju r'tt| 	 || j
t|S | j tju r:tt| j|| jt|S | j tju rNtt| 	 || j
t|S dS )zMutates underlying integer value bytes in place.

    Args:
      value: New integer value. It must fit to the byte size of the existing
        encoded value.

    Returns:
      Whether the value was mutated or not.
    F)r	  r   r~   r;   r   r   r  r   r   r  r   r   r   r   r  r   r   r   	MutateInt~  s   
zRef.MutateIntc                 C      | j tjtjfv S rN   )r	  r   rt   r   r   r   r   r   r    r   zRef.IsFloatc                 C   s   | j rdS | jrt| jS | jrt| jS | jtju r!t	t
| jS | jtju r3t	t
|  d| j S | jr;t| jS | jrEtt| jS |  rPtt| jS |  r[tt| jS | tj)z2Returns current reference as floating point value.g        N)r  r  floatr  r  r  r	  r   rt   r2   r   r  r   r  r   r  r   r  r/   r  r}   r   r   FixedTypedVectorr  r   r   r   r   AsFloat  s&   


zRef.AsFloatc                 C   sV   | j tju rtt| j|| jt| jS | j tj	u r)tt| 
 || jt| jS dS )zMutates underlying floating point value bytes in place.

    Args:
      value: New float value. It must fit to the byte size of the existing
        encoded value.

    Returns:
      Whether the value was mutated or not.
    F)r	  r   rt   r;   r   r   r  r   r    r   r  r   r  r   r   r   MutateFloat  s   


zRef.MutateFloatc                 C   r  rN   )r	  r   r   r   r   r   r   r    r  z	Ref.IsKeyc                 C   $   | j rt|  | jjS | tjrN   )r  r   r  r   r   r  r   r   r   r   r   r   r        zRef.AsKeyBytesc                 C   s&   | j rtt|  | jS | tjrN   )r  strr   r  r   r  r   r   r   r   r   r   r     s   z	Ref.AsKeyc                 C   r  rN   )r	  r   r   r   r   r   r   r    r  zRef.IsStringc                 C   s0   | j rt|  | jjS | jr| jS | tj	rN   )
r  r   r  r   r   r  r   r  r   r   r   r   r   r   AsStringBytes  s
   zRef.AsStringBytesc                 C   s2   | j rtt|  | jS | jr| jS | tj	rN   )
r  r*  r   r  r   r  r   r  r   r   r   r   r   r   r     s
   zRef.AsStringc                 C   s   t |  | j|S rN   )r   r  r   r   r  r   r   r   MutateString  s   zRef.MutateStringc                 C   r  rN   )r	  r   r   r   r   r   r   r    r  z
Ref.IsBlobc                 C   r(  rN   )r  r   r  r   r   r  r   r   r   r   r   r   r    r)  z
Ref.AsBlobc                 C   s   | j p	| jp	|  S rN   )r  r}   r   r   r   r   r   IsAnyVector  rx   zRef.IsAnyVectorc                 C   r#  rN   )r	  r   r   r   r   r   r   r   r    r   zRef.IsVectorc                 C   "   | j rt|  | jS | tjrN   )r  r   r  r   r  r   r   r   r   r   r   r       zRef.AsVectorc                 C      t | jS rN   )r   r}   r	  r   r   r   r   r}   	  r  zRef.IsTypedVectorc                 C   s*   | j rt|  | jt| jS | d)NTYPED_VECTOR)r}   r   r  r   r   r   r	  r  r   r   r   r   r     s
   

zRef.AsTypedVectorc                 C   r0  rN   )r   r   r	  r   r   r   r   r     r  zRef.IsFixedTypedVectorc                 C   s4   | j rt| j\}}t|  | j||S | d)NFIXED_TYPED_VECTOR)r   r   r   r	  r   r  r   r  )r   r   r   r   r   r   r!    s   
zRef.AsFixedTypedVectorc                 C   r  rN   )r	  r   r   r   r   r   r   IsMap!  r  z	Ref.IsMapc                 C   r.  rN   )r3  r   r  r   r  r   r   r   r   r   r   AsMap%  r/  z	Ref.AsMapc                 C   s   | j rdS | jr| jS | jr| jS | jr| jS | jr| jS | j	r#| j
S | jr)| jS | jr0| jjS | jr7| jjS | jr>| jjS | jrE| jjS td|  )zConverts current reference to value of corresponding type.

    This is equivalent to calling `AsInt` for integer values, `AsFloat` for
    floating point values, etc.

    Returns:
      Value of corresponding type.
    Nzcannot convert %r to value)r  r  r  r  r  r  r&  r  r   r  r   r  r  r3  r4  r   r  r  r}   r   r   r!  r   r   r   r   r   r   ,  s.   
z	Ref.ValueN)+r!   r"   r#   r$   r   r%   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r"  r  r&  r'  r  r   r   r  r+  r   r,  r  r  r-  r  r  r}   r   r   r!  r3  r4  r   r   r   r   r   r     s    


























r   c                 C   s$   zt |  W dS  ty   Y dS w )NTF)iterr   )objr   r   r   _IsIterableP  s   r7  c                   @   s   e Zd ZdZedd Zedd Zedd Zedd	 Zed
d Z	edd Z
dd Zedd Zedd Zedd ZejfddZd"ddZejfddZdd Zdd  Zd!S )#r   z;Class to represent given value during the encoding process.c                   C   s   t dtjtjS rA   )r   r   r   r   r   r   r   r   r   Null[  ro   z
Value.Nullc                 C      t | tjtjS rN   )r   r   ru   r   r   r   r   r   r   Bool_  ro   z
Value.Boolc                 C      t | tj|S rN   )r   r   r~   r   rm   r   r   r   Intc  r@   z	Value.Intc                 C   r;  rN   )r   r   r   r<  r   r   r   UIntg  r@   z
Value.UIntc                 C   r;  rN   )r   r   rt   r<  r   r   r   Floatk  r@   zValue.Floatc                 C   r9  rN   )r   r   r   r   r   )rG   r   r   r   r   o  ro   z	Value.Keyc                 C   s   || _ || _|| _d S rN   _valuer	  _min_bit_width)r   r   rl   min_bit_widthr   r   r   r   s  s   
zValue.__init__c                 C   r   rN   )rA  r   r   r   r   r   z  r   zValue.Valuec                 C   r   rN   )r	  r   r   r   r   r   ~  r   z
Value.Typec                 C   r   rN   )rB  r   r   r   r   MinBitWidth  r   zValue.MinBitWidthc                 C   s   t | j| |S rN   )r   rn   r	  StoredWidthr   parent_bit_widthr   r   r   StoredPackedType  r7   zValue.StoredPackedTyper   c                 C   s^   t | jr	| jS dD ]}|t|| ||  }t|| j }|d|> kr*|  S qtd)Nr   r   zrelative offset is too big)	r   rw   r	  rB  r?   r   r   rA  r   )r   r=   
elem_indexr   
offset_locrm   r   r   r   	ElemWidth  s   zValue.ElemWidthc                 C   s   t | jrt| j|S | jS rN   )r   rw   r	  maxrB  rF  r   r   r   rE    s   zValue.StoredWidthc                 C   r   )NzValue(%s, %s, %s)r@  r   r   r   r   r     r7   zValue.__repr__c                 C   
   t | jS rN   )r*  rA  r   r   r   r   r     r   zValue.__str__Nr   )r!   r"   r#   r$   r%   r8  r:  r=  r>  r?  r   r   r   r   r   rD  r   r   rH  rK  rE  r   r   r   r   r   r   r   X  s4    









r   c                        fdd}|S )Nc                    sX   t |d tr| |d   | g|dd  R i | d S  | g|R i | d S )Nr   r   )r   r*  r   )r   argskwargsfuncr   r   wrapper  s   "zInMap.<locals>.wrapperr   rR  rS  r   rQ  r   InMap  s   rU  c                    rN  )Nc                    sR   t |dkr | |d  d S t |dkr%| |d   | |d  d S td)Nr   r   r	   zinvalid number of arguments)r/   r   r   )r   rO  rQ  r   r   rS    s   zInMapForString.<locals>.wrapperr   rT  r   rQ  r   InMapForString  s   rV  c                   @   s4   e Zd ZdZdd Zdd Zdd Zedd	 Zd
S )PoolzCCollection of (data, offset) pairs sorted by data for quick access.c                 C   
   g | _ d S rN   _poolr   r   r   r   r     r   zPool.__init__c                 C   sF   ||f}t | j|dd }|dkr| j| \}}|S | j|| d S )Nc                 S   s   | d |d k S rA   r   r   r   r   r   rQ         z#Pool.FindOrInsert.<locals>.<lambda>rR   )rT   rZ  insert)r   datarG   dorS   _r   r   r   FindOrInsert  s   zPool.FindOrInsertc                 C   rX  rN   rY  r   r   r   r   Clear  r   z
Pool.Clearc                 C   s   dd | j D S )Nc                 S   s   g | ]\}}|qS r   r   )r   r]  r_  r   r   r   r     r   z!Pool.Elements.<locals>.<listcomp>rY  r   r   r   r   Elements  ro   zPool.ElementsN)	r!   r"   r#   r$   r   r`  ra  r   rb  r   r   r   r   rW    s    	rW  c                   @   s  e Zd ZdZddejfddZdd Zedd	 Z	ed
d Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdZd!d"Zd#d$ Zed%d& Zed'd( Zd)d* ZdZd+d,Zed-d. Zed[d0d1Zed[d2d3Zed[d4d5Z ed[d6d7Z!ed[d8d9Z"ed[d:d;Z#d<d= Z$d>d? Z%e&j'dZd@dAZ(edBdC Z)e&j'dZdDdEZ*edZdFdGZ+e	 	/d\dHdIZ,dJdK Z-dLdM Z.e&j'dZdNdOZ/dPdQ Z0dRdS Z1edTdU Z2edVdW Z3edXdY Z4d S )]r   z?Helper class to encode structural data into flexbuffers format.FTc                 C   s:   || _ || _|| _t | _t | _d| _t | _g | _	d S NF)
_share_strings_share_keys_force_min_bit_widthrW  _string_pool	_key_pool	_finishedr   r   _stack)r   share_strings
share_keysforce_min_bit_widthr   r   r   r     s   
zBuilder.__init__c                 C   rM  rN   )r/   r   r   r   r   r   r     r   zBuilder.__len__c                 C   r   rN   )rg  r   r   r   r   
StringPool  r   zBuilder.StringPoolc                 C   r   rN   )rh  r   r   r   r   KeyPool  r   zBuilder.KeyPoolc                 C   s,   | j   | j  d| _t | _g | _d S rc  )rg  ra  rh  ri  r   r   rj  r   r   r   r   ra    s
   


zBuilder.Clearc                 C   s   | j rtdt| jdkrtd| jd }| |t| j}| j||d | jt	|
 dd | jt	|dd d| _| jS )z8Finishes encoding process and returns underlying buffer.z!builder has been already finishedr   zinternal stack size must be oner   r   T)ri  RuntimeErrorr/   rj  _AlignrK  r   	_WriteAny_Writer   rH  finished)r   r   r   r   r   r   Finish  s   
zBuilder.Finishc                 C   s    | j |d  }|d |d S rA   )r   r   )r   rG   r   r   r   r   _ReadKey  s   zBuilder._ReadKeyc                 C   s(   d|> }| j dtt| j |  |S )Nr       )r   extendr?   r/   )r   	alignmentr   r   r   r   rq    s   zBuilder._Alignc                 C      | j t||| d S rN   )r   rx  r6   )r   r0   r   r   r   r   r   rs       zBuilder._Writec                 C   rz  rN   )r   rx  r9   )r   r0   r8   r   r   r   r   _WriteVector  r{  zBuilder._WriteVectorc                 C   s<   t | j| }|dks|dd| > k sJ | t|| d S )Nr   r   )r/   r   rs  r   )r   rG   r   relative_offsetr   r   r   _WriteOffset  s   zBuilder._WriteOffsetc              
   C   sT   t jtt jtt jtt jtt jti	|j }|r!| 
||j| d S | |j| d S rN   )r   r   r   ru   r~   r   r   rt   r   getrs  r   r~  )r   r   r   r0   r   r   r   rr    s   zBuilder._WriteAnyc                 C   sh   t t|}| |}| tt|| t| j}| j| |r(| jd | jt	||| |S rA   )
r   r   r/   rq  rs  r   rx  appendrj  r   )r   r]  append_zerorl   rm   r   locr   r   r   
_WriteBlob(  s   

zBuilder._WriteBlobc           	      C   s   t |}t t||krtd| | |s"| tt|| t| j}tj	t
tjttjti|}|s;td| ||| t||rKt|nd}| jt||| |S )z7Writes scalar vector elements to the underlying buffer.z*too many elements for the given byte_widthzunsupported element_typer   )r   r    r   r/   r   rq  rs  r   r   r~   r   r   rt   r   r  r   r|  r   rj  r  r   )	r   r   r   elementsfixedrm   r  r0   rl   r   r   r   _WriteScalarVector3  s   


zBuilder._WriteScalarVectorNc                 C   sz  t |}|r|stdt| jt|}d}|r(t||t | j}|d7 }tj	}t
|D ]%\}	}
t||
t | j||	 }|rT|	dkrK|
j}q/||
jkrTtdq/|r`t|s`td| |}|rx| |j| | td|j> | |s| t|| t | j}|D ]}
| |
| q|s|D ]}
| j|
| q|rtj}n|rt||r|nd}ntj}t|||S )z0Writes vector elements to the underlying buffer.zfixed vector must be typedr   r	   r   z.typed vector elements must be of the same typer   )r/   r   rL  rf  r   r   rK  r   r   r   	enumeraterp  r   rq  r~  r   rs  rD  rr  r  rH  r   r   r   )r   r  typedr  keysr4   rm   prefix_elemsvector_typer(   r   r   r  rl   r   r   r   _CreateVectorK  sJ   


zBuilder._CreateVectorc                 C   sT   |  |}t| j}tjttjttjt	i| }| 
||| | jt||| d S rN   )rq  r/   r   r   r   r   r   r   r   r   rs  rj  r  r   )r   r   rl   rm   r   r  r0   r   r   r   _PushIndirect  s   

zBuilder._PushIndirectc                 C   sb   t | j}|d}| j|dtjd}| jr/| j||}|dur/| j|d= | | j	d _
}|S )zEncodes string value.r   Tr  rl   NrR   )r/   r   r   r  r   r   rd  rg  r`  rj  rA  )r   r   reset_tor   r  prev_locr   r   r   r     s   

zBuilder.Stringc                 C   s   | j |dtjdS )zEncodes binary blob value.

    Args:
      value: A byte/bytearray value to encode

    Returns:
      Offset of the encoded value in underlying the byte buffer.
    Fr  )r  r   r   r  r   r   r   r     s   
zBuilder.Blobc                 C   s   t |ttfr
|}n|d}d|v rtdt| j}| j| | jd | j	r>| j
||}|dur>| j|d= |}| jt| |S )a  Encodes key value.

    Args:
      value: A byte/bytearray/str value to encode. Byte object must not contain
        zero bytes. String object must be convertible to ASCII.

    Returns:
      Offset of the encoded value in the underlying byte buffer.
    r   r   zkey contains zero byteN)r   bytesr   r   r   r/   r   rx  r  re  rh  r`  rj  r   r   )r   r   r   r  r  r   r   r   r     s   


zBuilder.Keyc                 C   s"   |r|  | | jt  dS )zEncodes None value.N)r   rj  r  r   r8  r   r   r   r   r8    s   
zBuilder.Nullc                 C   s   | j t| dS )zDEncodes boolean value.

    Args:
      value: A boolean value.
    N)rj  r  r   r:  r  r   r   r   r:    s   zBuilder.Boolr   c                 C   4   |dkr	t |nt |}| jt|| dS )zEncodes signed integer value.

    Args:
      value: A signed integer value.
      byte_width: Number of bytes to use: 1, 2, 4, or 8.
    r   N)r   r   r    rj  r  r   r=  r   r   r   rm   r   r   r   r=       zBuilder.Intc                 C   0   |dkr	t |nt |}| |tj| dS )zEncodes signed integer value indirectly.

    Args:
      value: A signed integer value.
      byte_width: Number of bytes to use: 1, 2, 4, or 8.
    r   N)r   r   r    r  r   r   r  r   r   r   IndirectInt     zBuilder.IndirectIntc                 C   r  )zEncodes unsigned integer value.

    Args:
      value: An unsigned integer value.
      byte_width: Number of bytes to use: 1, 2, 4, or 8.
    r   N)r   r   r    rj  r  r   r>  r  r   r   r   r>    r  zBuilder.UIntc                 C   r  )zEncodes unsigned integer value indirectly.

    Args:
      value: An unsigned integer value.
      byte_width: Number of bytes to use: 1, 2, 4, or 8.
    r   N)r   r   r    r  r   r   r  r   r   r   IndirectUInt  r  zBuilder.IndirectUIntc                 C   r  )zEncodes floating point value.

    Args:
      value: A floating point value.
      byte_width: Number of bytes to use: 4 or 8.
    r   N)r   r   r    rj  r  r   r?  r  r   r   r   r?    r  zBuilder.Floatc                 C   r  )zEncodes floating point value indirectly.

    Args:
      value: A floating point value.
      byte_width: Number of bytes to use: 4 or 8.
    r   N)r   r   r    r  r   r   r  r   r   r   IndirectFloat  r  zBuilder.IndirectFloatc                 C   rM  )zStarts vector construction.r/   rj  r   r   r   r   _StartVector     
zBuilder._StartVectorc                 C   s6   |  | j|d ||}| j|d= | j| |jS )z6Finishes vector construction by encodung its elements.N)r  rj  r  r   )r   rB   r  r  vecr   r   r   
_EndVector  s   zBuilder._EndVectorc                 c   sH    |r|  | z|  }| V  W | j|ddd d S | j|ddd w )NFr  r  r   r  r  r   r   rB   r   r   r   r   $     
&zBuilder.Vectorc                 C   sB   |    |D ]}| | qW d   dS 1 sw   Y  dS )zEncodes sequence of any elements as a vector.

    Args:
      elements: sequence of elements, they may have different types.
    N)r   Add)r   r  r   r   r   r   VectorFromElements/  s
   
"zBuilder.VectorFromElementsc                 c   sH    |r|  | z|  }| V  W | j|ddd d S | j|ddd w )NTFr  r  r  r   r   r   r   :  r  zBuilder.TypedVectorc                 C   s   t |tjrS|jdkr| jtjd|dd d
S |jdkr(| jtjd|dd d
S |jdv r:| jtj|j|dd d
S |jdv rL| jtj|j|dd d
S t	d	|j |d
u rZ| j
n| |}|   |D ]}|| qfW d
   d
S 1 sxw   Y  d
S )a%  Encodes sequence of elements of the same type as typed vector.

    Args:
      elements: Sequence of elements, they must be of the same type.
      element_type: Suggested element type. Setting it to None means determining
        correct value automatically based on the given elements.
    r,   r   Fr  r-   r   )r&   r'   r(   lr)   )r    r*   r   Lr+   zunsupported array typecode: %sN)r   arraytypecoder  r   rt   r~   itemsizer   r   r  Adderr   )r   r  r   addr   r   r   r   TypedVectorFromElementsE  s(   	







"zBuilder.TypedVectorFromElementsc                    s   dt |  krdkstd tddd |D }t |dkr%td|\}|du r?ttjttji|}|s?td	| |d
kr`tj	t
jtjt
jtjt
ji|  dt fdd|D > }| j|||dd dS )a  Encodes sequence of elements of the same type as fixed typed vector.

    Args:
      elements: Sequence of elements, they must be of the same type. Allowed
        types are `Type.INT`, `Type.UINT`, `Type.FLOAT`. Allowed number of
        elements are 2, 3, or 4.
      element_type: Suggested element type. Setting it to None means determining
        correct value automatically based on the given elements.
      byte_width: Number of bytes to use per element. For `Type.INT` and
        `Type.UINT`: 1, 2, 4, or 8. For `Type.FLOAT`: 4 or 8. Setting it to 0
        means determining correct value automatically based on the given
        elements.
    r	   r   z&only 2, 3, or 4 elements are supportedc                 S   s   h | ]}t |qS r   )typer   r   r   r   	<setcomp>v  r   z7Builder.FixedTypedVectorFromElements.<locals>.<setcomp>r   z%all elements must be of the same typeNr   r   c                 3   s    | ]} |V  qd S rN   r   r   widthr   r   	<genexpr>  s    z7Builder.FixedTypedVectorFromElements.<locals>.<genexpr>Tr  )r/   r   r   rk   r   r~   r$  rt   r  r   r   r   r   r   rL  r  )r   r  r   r   typesrl   r   r  r   FixedTypedVectorFromElementsa  s*   z$Builder.FixedTypedVectorFromElementsc                 C   rM  )zStarts map construction.r  r   r   r   r   	_StartMap  r  zBuilder._StartMapc                    s   j |d }t|d dkrtd|ddd D ]}|jtjur)tdtj qt|ddd |ddd }t| fddd	} j |d= |D ]} j | qK j j |dd d
dd} j j |d dd dd|d} j |d=  j 	| |j
S )z3Finishes map construction by encodung its elements.Nr	   r   z&must be even number of keys and valueszall map keys must be of %s typer   c                    s     | d jS rA   )rv  r   )pairr   r   r   rQ     r[  z!Builder._EndMap.<locals>.<lambda>)r   TFr  )r  r  r  )rj  r/   rp  r   r   r  sortedrx  r  r  r   )r   rB   stackr   pairsr  r  r8   r   r   r   _EndMap  s&   zBuilder._EndMapc              	   c   s<    |r|  | z|  }| V  W | | d S | | w rN   )r   r  r  r  r   r   r   r     s   
zBuilder.Mapc                 C   s<   |   }| D ]\}}| | | | q| | d S rN   )r  itemsr   r  r  )r   r  rB   r  r  r   r   r   MapFromElements  s
   
zBuilder.MapFromElementsc                 C   sX   t j| jt j| jt j| jt j| jt j	| j
t j| jt j| jt j| jt j| jt j| ji
| S rN   )r   ru   r:  r~   r=  r   r  r   r>  r   r  rt   r?  r   r  r   r   r   r   r   r   )r   rl   r   r   r   r    s   zBuilder.Adderc                 C   s.  |du r
|    dS t|tr| | dS t|tr"| | dS t|tr.| | dS t|tr:| 	| dS t|t
tfrH| | dS t|trw|   | D ]\}}| | | | qVW d   dS 1 spw   Y  dS t|tjr| | dS t|r| | dS tdt| )z$Encodes value of any supported type.Nzunsupported python type: %s)r8  r   r   r:  rk   r=  r$  r?  r*  r   r  r   r   dictr   r  r   r  r  r  r7  r  r   r  )r   r   r  r  r   r   r   r    s0   






"zBuilder.Addc                 C   s
   | j d S )NrR   )rj  r   r   r   r   	LastValue  r  zBuilder.LastValuec                 C   s   | j | d S rN   )rj  r  r  r   r   r   
ReuseValue  ro   zBuilder.ReuseValuerN   r   rA   )5r!   r"   r#   r$   r   r   r   r   r   rn  ro  ra  ru  rv  rq  rs  r|  r~  rr  r  r  r  r  rV  r   rU  r   r   r8  r:  r=  r  r>  r  r?  r  r  r  
contextlibcontextmanagerr   r  r   r  r  r  r  r   r  r  r  r  r  r   r   r   r   r     s    


	
:













)


r   c                 C   s<   t | dk r
td| d }tjt| d|  || d dS )z/Returns root `Ref` object for the given buffer.r
   zbuffer is too smallrR   r	   r   rp   )r/   r   r   r   r   )r1   r   r   r   r   r     s   r   c                 C   s   t  }||  | S )z1Returns bytearray with the encoded python object.)r   r  ru  )r6  fbbr   r   r   r     s   
r   c                 C   s
   t | jS )z.Returns python object decoded from the buffer.)r   r   )r1   r   r   r   r     r  r   )(r$   r  r  enumr   __all__IntEnumr   r   r   r   r2   r5   r6   r9   r;   r?   rH   rM   rT   r   r   r   r   r   r   r   r   r   r   r   r7  r   rU  rV  rW  r   r   r   r   r   r   r   r   <module>   sZ   
;

v(#<'  3M
     	