o
    Xuea                     @   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   7lib/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.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   Qr   d)r   r   c                 C   s   t | t| |d S Nr   )r   r   len)fmtbufr   r   r   _Unpacka      r2   c                 C   s$   t || }td|| | f |S Nz%d%s)r/   r   r   )r0   r1   lengthr    r   r   r   _UnpackVectore   s   r6   c                 C   s   t | | |S N)r   r   )r0   r   r    r   r   r   _Packj      r8   c                 C   s"   t jdt|| | f g|R  S r4   )r   r   r/   )r0   valuesr    r   r   r   _PackVectorn   s   "r;   c                 C   s(   d|> |krt | |||d |< dS dS )Nr   TF)r8   )r0   r1   r   r    Zvalue_bit_widthr   r   r   _Mutater   s   r<   c                 C   s   |  |d @ S Nr   r   )buf_sizeZ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 r.   )startstopslicestep)soffsetr5   rA   rB   r   r   r   _ShiftSlice   s   rG   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/   )r:   r   predfirstZlastcountr)   rD   r   r   r   _LowerBound   s   
rK   c                 C   s   | |k S r7   r   )xyr   r   r   <lambda>   s    rN   c                 C   s.   t | ||}|t| kr||| | s|S dS )z5Implementation of C++ std::binary_search() algorithm.)rK   r/   )r:   r   rH   indexr   r   r   _BinarySearch   s   rQ   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 r7   )r   FLOATBOOLri   r   r   r   IsInline      zType.IsInlinec                 C   &   t j|   kot jkn  p| t jkS r7   )r   
VECTOR_INTVECTOR_STRING_DEPRECATEDVECTOR_BOOLrs   r   r   r   IsTypedVector   s   zType.IsTypedVectorc                 C   rv   r7   )r   INTSTRINGrr   rs   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   rz   r   rw   r{   rs   r   r   r   ToTypedVectorElementType   s   
zType.ToTypedVectorElementTypec                 C      t j|   kot jkS   S r7   )r   VECTOR_INT2VECTOR_FLOAT4rs   r   r   r   IsFixedTypedVector      zType.IsFixedTypedVectorc                 C   r   r7   )r   r{   rq   rs   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{   )ri   Z
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{   rw   r   VECTOR_INT3VECTOR_INT4)element_typeZ	fixed_lenrF   r   r   r   ToTypedVector   s    


zType.ToTypedVectorNr   )+r"   r#   r$   r%   NULLr{   UINTrq   KEYr|   INDIRECT_INTINDIRECT_UINTINDIRECT_FLOATMAPVECTORrw   ZVECTOR_UINTZVECTOR_FLOATZ
VECTOR_KEYrx   r   ZVECTOR_UINT2ZVECTOR_FLOAT2r   ZVECTOR_UINT3ZVECTOR_FLOAT3r   ZVECTOR_UINT4r   BLOBrr   ry   r&   rk   ro   rt   rz   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 r.   )_bufr/   _offset_length)selfr1   rF   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
isinstancerC   r   rG   r   r   rh   	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   rF   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   rF   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 r7   r   r   r1   r    r   r   r   r   D  s   
zObject.__init__c                 C      | j S r7   )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 r.   )superr   r2   r   	SizeBytesr   )r   r1   r    size	__class__r   r   r   Q  s   
zSized.__init__c                 C   s   | j | j d S r.   r   r   r   r   r   r   X  r   zSized.SizeBytesc                 C   r   r7   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 r.   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   r.   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/   r8   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   r.   r   r   r   r   r   r     r   z	Key.Bytesc                 C   r   r.   )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   rP   rn   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 r7   )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 r7   )r   r   r/   r   r   r   r   r     rp   zTypedVector.Bytesc                 C   r   r7   )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   rP   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   rr   r6   r   r   r/   r{   listr   r   rq   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 r7   )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   rO   )	r   rh   r   r   rQ   Keysr   r   KeyError)r   r   rP   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 r7   )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     rp   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d/d0 Ze	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)dIS )Jr   z)Data accessor for the encoded data bytes.r   _parent_widthr   _typec                 C   s   t |\}}t| |||S r7   )r   ro   r   )r1   parent_widthrn   r    ri   r   r   r   r   #  s   zRef.PackedTypec                 C   s   || _ || _|| _|| _d S r7   r   )r   r1   r   r    ri   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 r7   )r   r   r   r   r   r   _Bytes2  rl   z
Ref._Bytesc                 C   s   t d| j|f )Nzcannot convert %s to %s)r   r   )r   Ztarget_typer   r   r   _ConvertError6  r   zRef._ConvertErrorc                 C   s   | j d| jS r.   )r   r   r   r   r   r   r   	_Indirect9  r9   zRef._Indirectc                 C      | j tju S r7   )r   r   r   r   r   r   r   IsNull<     z
Ref.IsNullc                 C   r  r7   )r   r   rr   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 r.   )r   r   rr   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 r7   )IsIntIsFloatr   r   r   r   	IsNumericW  r  zRef.IsNumericc                 C   s   | j tjtjtjtjfv S r7   )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  rh   r  r   r   r{   r2   r   r   r   r   r   r   r   r   IsStringr/   r   IsKeyr   IsBlobAsBlobIsVectorAsVectorrz   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 r7   )r   r   rq   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   rq   r2   r   r   r   r   r   r  r   r  r/   r  rz   r  r   Z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   rq   r<   r   r   r   r   r!   r   r   r   r  r   r   r   MutateFloat  s   


zRef.MutateFloatc                 C   r  r7   )r   r   r   r   r   r   r   r    r  z	Ref.IsKeyc                 C   $   | j rt|  | jjS | tjr7   )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r7   )r  strr   r   r   r   r   r   r   r   r   r   r     s   z	Ref.AsKeyc                 C   r  r7   )r   r   r|   r   r   r   r   r    r  zRef.IsStringc                 C   s2   | j rtt|  | jS | jr| jS | tj	r7   )
r  r  r   r   r   r  r   r   r   r|   r   r   r   r   r     s
   zRef.AsStringc                 C   s   t |  | j|S r7   )r   r   r   r   r  r   r   r   MutateString  s   zRef.MutateStringc                 C   r  r7   )r   r   r   r   r   r   r   r    r  z
Ref.IsBlobc                 C   r  r7   )r  r   r   r   r   r   r   r   r   r   r   r   r    r  z
Ref.AsBlobc                 C   s   | j p	| jp	|  S r7   )r  rz   r   r   r   r   r   IsAnyVector  ru   zRef.IsAnyVectorc                 C   r  r7   )r   r   r   r   r   r   r   r   r    r   zRef.IsVectorc                 C   "   | j rt|  | jS | tjr7   )r  r   r   r   r   r   r   r   r   r   r   r       zRef.AsVectorc                 C      t | jS r7   )r   rz   r   r   r   r   r   rz      r  zRef.IsTypedVectorc                 C   s*   | j rt|  | jt| jS | d)NZTYPED_VECTOR)rz   r   r   r   r   r~   r   r   r   r   r   r   r    s
   

zRef.AsTypedVectorc                 C   r   r7   )r   r   r   r   r   r   r   r     r  zRef.IsFixedTypedVectorc                 C   s4   | j rt| j\}}t|  | j||S | d)NZFIXED_TYPED_VECTOR)r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r    s   
zRef.AsFixedTypedVectorc                 C   r  r7   )r   r   r   r   r   r   r   IsMap  r  z	Ref.IsMapc                 C   r  r7   )r!  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  r!  r"  r   r  r  rz   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  rz   r  r   r  r!  r"  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   _IsIterableG  s   r%  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 r.   )r   r   r   r   r   r   r   r   r   NullR  rl   z
Value.Nullc                 C      t | tjtjS r7   )r   r   rr   r   r   r   r   r   r   BoolV  rl   z
Value.Boolc                 C      t | tj|S r7   )r   r   r{   r   rj   r   r   r   IntZ  r@   z	Value.Intc                 C   r)  r7   )r   r   r   r*  r   r   r   UInt^  r@   z
Value.UIntc                 C   r)  r7   )r   r   rq   r*  r   r   r   Floatb  r@   zValue.Floatc                 C   r'  r7   )r   r   r   r   r   )rF   r   r   r   r   f  rl   z	Value.Keyc                 C   s   || _ || _|| _d S r7   _valuer   _min_bit_width)r   r   ri   Zmin_bit_widthr   r   r   r   j  s   
zValue.__init__c                 C   r   r7   )r/  r   r   r   r   r   q  r   zValue.Valuec                 C   r   r7   )r   r   r   r   r   r   u  r   z
Value.Typec                 C   r   r7   )r0  r   r   r   r   MinBitWidthy  r   zValue.MinBitWidthc                 C   s   t | j| |S r7   )r   rk   r   StoredWidthr   Zparent_bit_widthr   r   r   StoredPackedType}     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   rt   r   r0  r?   r   r   r/  r   )r   r>   Z
elem_indexr    Z
offset_locrj   r   r   r   	ElemWidth  s   zValue.ElemWidthc                 C   s   t | jrt| j|S | jS r7   )r   rt   r   maxr0  r3  r   r   r   r2    s   zValue.StoredWidthc                 C   r   )NzValue(%s, %s, %s)r.  r   r   r   r   r     r5  zValue.__repr__c                 C   
   t | jS r7   )r  r/  r   r   r   r   r     r   zValue.__str__Nr   )r"   r#   r$   r%   r&   r&  r(  r+  r,  r-  r   r   r   r   r   r1  r   r   r4  r6  r2  r   r   r   r   r   r   r   O  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   r=  r>  r   r<  r   InMap  s   r@  c                    r9  )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   r:  r<  r   r   r>    s   zInMapForString.<locals>.wrapperr   r?  r   r<  r   InMapForString  s   rA  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 r7   _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 r.   r   r   r   r   r   rN         z#Pool.FindOrInsert.<locals>.<lambda>rO   )rQ   rE  insert)r   datarF   ZdorP   _r   r   r   FindOrInsert  s   zPool.FindOrInsertc                 C   rC  r7   rD  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   rH  rI  r   r   r   r     r   z!Pool.Elements.<locals>.<listcomp>rD  r   r   r   r   Elements  rl   zPool.ElementsN)	r"   r#   r$   r%   r   rJ  rK  r   rL  r   r   r   r   rB    s    	rB  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_widthrB  _string_pool	_key_pool	_finishedr   r   _stack)r   Zshare_stringsZ
share_keysZforce_min_bit_widthr   r   r   r     s   
zBuilder.__init__c                 C   r8  r7   )r/   r   r   r   r   r   r     r   zBuilder.__len__c                 C   r   r7   )rQ  r   r   r   r   
StringPool  r   zBuilder.StringPoolc                 C   r   r7   )rR  r   r   r   r   KeyPool  r   zBuilder.KeyPoolc                 C   s,   | j   | j  d| _t | _g | _d S rM  )rQ  rK  rR  rS  r   r   rT  r   r   r   r   rK    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)rS  RuntimeErrorr/   rT  _Alignr6  r   	_WriteAny_Writer   r4  Zfinished)r   r   r    r   r   r   Finish  s   
zBuilder.Finishc                 C   s    | j |d  }|d |d S r.   )r   r   )r   rF   r   r   r   r   _ReadKey  s   zBuilder._ReadKeyc                 C   s(   d|> }| j dtt| j |  |S )Nr       )r   extendr?   r/   )r   Z	alignmentr    r   r   r   rX    s   zBuilder._Alignc                 C      | j t||| d S r7   )r   r^  r8   )r   r0   r   r    r   r   r   rZ    r3   zBuilder._Writec                 C   r_  r7   )r   r^  r;   )r   r0   r:   r    r   r   r   _WriteVector  r3   zBuilder._WriteVectorc                 C   s<   t | j| }|dks|dd| > k sJ | t|| d S )Nr   r   )r/   r   rZ  r   )r   rF   r    Z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 r7   )r   r   r   rr   r{   r   r   rq   r   getrZ  r   ra  )r   r   r    r0   r   r   r   rY    s   zBuilder._WriteAnyc                 C   sh   t t|}| |}| tt|| t| j}| j| |r(| jd | jt	||| |S r.   )
r   r   r/   rX  rZ  r   r^  appendrT  r   )r   rH  append_zerori   rj   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   rX  rZ  r   r   r{   r   r   rq   r   rb  r   r`  r   rT  rc  r   )	r   r   r    elementsfixedrj   re  r0   ri   r   r   r   _WriteScalarVector*  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   r7  rP  r   r   r6  r   r   r   	enumeraterW  r   rX  ra  r   rZ  r1  rY  rc  r4  r   r   r   )r   rg  typedrh  keysr5   rj   Zprefix_elemsZvector_typer)   r   r    re  ri   r   r   r   _CreateVectorB  sJ   


zBuilder._CreateVectorc                 C   sT   |  |}t| j}tjttjttjt	i| }| 
||| | jt||| d S r7   )rX  r/   r   r   r   r   r   r   r   r   rZ  rT  rc  r   )r   r   ri   rj   r    re  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rd  ri   NrO   )r/   r   r   rf  r   r|   rN  rQ  rJ  rT  r/  )r   r   Zreset_tor   re  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.
    Fro  )rf  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   r^  rc  rO  rR  rJ  rT  r   r   )r   r   r   re  rp  r   r   r   r     s   


zBuilder.Keyc                 C   s"   |r|  | | jt  dS )zEncodes None value.N)r   rT  rc  r   r&  r   r   r   r   r&    s   
zBuilder.Nullc                 C   s   | j t| dS )zDEncodes boolean value.

    Args:
      value: A boolean value.
    N)rT  rc  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!   rT  rc  r   r+  r   r   r    rj   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!   rn  r   r   rs  r   r   r   IndirectInt     zBuilder.IndirectIntc                 C   rr  )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!   rT  rc  r   r,  rs  r   r   r   r,    rt  zBuilder.UIntc                 C   ru  )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!   rn  r   r   rs  r   r   r   IndirectUInt  rw  zBuilder.IndirectUIntc                 C   rr  )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!   rT  rc  r   r-  rs  r   r   r   r-    rt  zBuilder.Floatc                 C   ru  )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!   rn  r   r   rs  r   r   r   IndirectFloat  rw  zBuilder.IndirectFloatc                 C   r8  )zStarts vector construction.r/   rT  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)rm  rT  rc  r   )r   rA   rk  rh  Z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rk  rh  r   r{  r}  r   r   rA   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   rg  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   1  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rh  r-   r   )r'   r(   r)   lr*   )r!   r+   r   Lr,   zunsupported array typecode: %sN)r   arraytypecoderi  r   rq   r{   itemsizer   r   r  Adderr   )r   rg  r   addr   r   r   r   TypedVectorFromElements<  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>m  r   z7Builder.FixedTypedVectorFromElements.<locals>.<setcomp>r   z%all elements must be of the same typeNr   r   c                 3   s    | ]} |V  qd S r7   r   r   widthr   r   	<genexpr>~  s    z7Builder.FixedTypedVectorFromElements.<locals>.<genexpr>Tr  )r/   r   r   rh   r   r{   r  rq   rb  r   r   r   r   r   r7  ri  )r   rg  r   r    typesri   r   r  r   FixedTypedVectorFromElementsX  s*   z$Builder.FixedTypedVectorFromElementsc                 C   r8  )zStarts map construction.rz  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 r.   )r\  r   )pairr   r   r   rN     rF  z!Builder._EndMap.<locals>.<lambda>)r   TFr~  )rk  rh  rl  )rT  r/   rW  r   r   r   sortedr^  rm  rc  r   )r   rA   stackr   pairsr  rl  r:   r   r   r   _EndMap  s&   zBuilder._EndMapc              	   c   s<    |r|  | z|  }| V  W | | d S | | w r7   )r   r  r  r  r   r   r   r     s   
zBuilder.Mapc                 C   s<   |   }| D ]\}}| | | | q| | d S r7   )r  itemsr   r  r  )r   rg  rA   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 r7   )r   rr   r(  r{   r+  r   rv  r   r,  r   rx  rq   r-  r   ry  r   r   r   r   r|   r   )r   ri   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)r&  r   r   r(  rh   r+  r  r-  r  r   rq  r   r   dictr   r  r   r  r  r  r%  r  r   r  )r   r   r   r   r   r   r   r    s0   






"zBuilder.Addc                 C   s
   | j d S )NrO   )rT  r   r   r   r   	LastValue  r|  zBuilder.LastValuec                 C   s   | j | d S r7   )rT  rc  r  r   r   r   
ReuseValue  rl   zBuilder.ReuseValuer7   r   r.   )5r"   r#   r$   r%   r   r   r   r   r   rU  rV  rK  r[  r\  rX  rZ  r`  ra  rY  rf  ri  rm  rn  rA  r   r@  r   r   r&  r(  r+  rv  r,  rx  r-  ry  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 smallrO   r	   r   rm   )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  r[  )r$  Z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   r6   r8   r;   r<   r?   rG   rK   rQ   r   r   r   r   r   r   r   r   r   r   r   r%  r   r@  rA  rB  r   r   r   r   r   r   r   r   <module>   sZ   
;

v(#<'  *M
     	