a
    ,=ic                     @   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   sT   | dksJ | dk rt jS | dk r(t jS | dk r6t jS | dk rDt jS td|  dS )z@Returns the minimum `BitWidth` to encode unsigned integer value.r      i   l        l            zvalue is too big to encode: %sN)r   W8W16W32W64
ValueErrorvalue r   h/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/flatbuffers/flexbuffers.pyU,   s    z
BitWidth.Uc                 C   s    | d9 } t | dkr| n|  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   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 | | |S N)r   r   )r0   r   r    r   r   r   _Packj   s    r7   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)r7   )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|   s    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offsetr4   r>   r?   r   r   r   _ShiftSlice   s    rD   c                 C   sd   dt |  }}|| }|dkr`|}|d }||7 }|| | |rZ|d7 }|}||d 8 }q|}q|S )z3Implementation of C++ std::lower_bound() algorithm.r   r	   r   )r/   )r8   r   predfirstlastcountr)   rA   r   r   r   _LowerBound   s    rI   c                 C   s   | |k S r6   r   )xyr   r   r   <lambda>       rL   c                 C   s.   t | ||}|t| kr*||| | s*|S dS )z5Implementation of C++ std::binary_search() algorithm.)rI   r/   )r8   r   rE   indexr   r   r   _BinarySearch   s    rP   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   s    z	Type.Packc                 C   s   d| d@ > t | d? fS )Nr   r
   r	   )r   packed_typer   r   r   Unpack   s    zType.Unpackc                 C   s   | t jkp| t jkS r6   )r   FLOATBOOLrh   r   r   r   IsInline   s    zType.IsInlinec                 C   s&   t j|   kot jkn  p$| t jkS r6   )r   
VECTOR_INTVECTOR_STRING_DEPRECATEDVECTOR_BOOLrp   r   r   r   IsTypedVector   s    zType.IsTypedVectorc                 C   s&   t j|   kot jkn  p$| t jkS r6   )r   INTSTRINGro   rp   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   ru   r   rr   rv   rp   r   r   r   ToTypedVectorElementType   s    
zType.ToTypedVectorElementTypec                 C   s   t j|   kot jkS   S r6   )r   VECTOR_INT2VECTOR_FLOAT4rp   r   r   r   IsFixedTypedVector   s    zType.IsFixedTypedVectorc                 C   s   t j|   kot jkS   S r6   )r   rv   rn   rp   r   r   r   IsFixedTypedVectorElementType   s    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   rz   rv   )rh   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rNt |t j S |dkrdt |t j S |dkrzt |t j S |dkrt |t j S td| dS )	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: %sN)	r   rx   r   r}   rv   rr   rz   VECTOR_INT3VECTOR_INT4)element_typeZ	fixed_lenrC   r   r   r   ToTypedVector   s    



zType.ToTypedVectorN)r   )+r"   r#   r$   r%   NULLrv   UINTrn   KEYrw   INDIRECT_INTINDIRECT_UINTINDIRECT_FLOATMAPVECTORrr   ZVECTOR_UINTZVECTOR_FLOATZ
VECTOR_KEYrs   rz   ZVECTOR_UINT2ZVECTOR_FLOAT2r   ZVECTOR_UINT3ZVECTOR_FLOAT3r   ZVECTOR_UINT4r{   BLOBro   rt   r&   rj   rm   rq   ru   rx   ry   r|   r}   r~   r   r   r   r   r   r      sb   








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   rC   r   r   r   __init__  s    zBuf.__init__c                 C   sF   t |tr | jt|| j| j S t |tr:| j| j|  S tdd S Nzinvalid key type
isinstancer@   r   rD   r   r   rg   	TypeErrorr   keyr   r   r   __getitem__   s
    

zBuf.__getitem__c                 C   sJ   t |tr"|| jt|| j| j< n$t |tr>|| j| j| < ntdd S 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  s    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   rC   r   r   r   Slice7  s    z	Buf.Slicec              	   C   s    |  |tt| |||   S )zAReturn new `Buf` based on the encoded offset (indirect encoding).)r   r2   r   )r   rC   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 r6   r   r   r1   r    r   r   r   r   D  s    zObject.__init__c                 C   s   | j S r6   )r   r   r   r   r   	ByteWidthH  s    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                    s0   t  || |dkr&tt| j| _n|| _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  s    zSized.SizeBytesc                 C   s   | j S r6   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   s   | j dt|  S r.   r   r/   r   r   r   r   Bytesd  s    z
Blob.Bytesc                 C   s   d| j t| f S )NzBlob(%s, size=%d)r   r   r   r   r   r   h  s    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   s   | j dt|  S r.   r   r   r   r   r   r   p  s    zString.Bytesc                 C   sn   | d}t|}|t| krjt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/   r7   r   r   r   	bytearray)r   r   encodednr   r   r   Mutatet  s    
zString.Mutatec                 C   s   | j dS )Nr   r   decoder   r   r   r   __str__  s    zString.__str__c                 C   s   d| j t| f S )NzString(%s, size=%d)r   r   r   r   r   r     s    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   s   | j dt|  S r.   r   r   r   r   r   r     s    z	Key.Bytesc                 C   s   | j dS r.   )r   r   r   r   r   r   r     s    zKey.__len__c                 C   s   | j dS )Nasciir   r   r   r   r   r     s    zKey.__str__c                 C   s   d| j t| f S )NzKey(%s, size=%d)r   r   r   r   r   r     s    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   rO   rl   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   s   g | ]
}|j qS r   Value.0er   r   r   
<listcomp>  rM   z Vector.Value.<locals>.<listcomp>r   r   r   r   r   r     s    zVector.Valuec                 C   s   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 r6   )r   r   r   rw   r   r   )r   r1   r    r   r   r   r   r   r     s    
zTypedVector.__init__c                 C   s   | j d | jt|   S r6   )r   r   r/   r   r   r   r   r     s    zTypedVector.Bytesc                 C   s   | j S r6   )r   r   r   r   r   ElementType  s    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   rO   r1   r   r   r   r     s    
zTypedVector.__getitem__c                 C   s   | sg S | j tju r0dd tt| jt| D S | j tju rRttt	| jt| S | j tj
u rtttt| jt| S | j tju rttt| jt| S | j tju rdd | D S | j tju rdd | D S td| j  dS )z'Returns underlying data as list object.c                 S   s   g | ]}t |qS r   )boolr   r   r   r   r     rM   z%TypedVector.Value.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   )AsKeyr   r   r   r   r     rM   c                 S   s   g | ]
}|j qS r   )AsStringr   r   r   r   r     rM   unsupported element_type: %sN)r   r   ro   r5   r   r   r/   rv   listr   r   rn   r   r   rw   r   r   r   r   r   r     s    zTypedVector.Valuec                 C   s   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     s    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 r6   )r   r   
AsKeyBytesar'   r   r   r   CompareKeys  s
    

zMap.CompareKeysc                    sL   t |trt |S t| j|d| j}|dkr@t |S t|d S )Nr   rN   )	r   rg   r   r   rP   Keysr   r   KeyError)r   r   rO   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 r6   )r   r   r   r   r   r   r   Values  s    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>  rM   zMap.Value.<locals>.<dictcomp>)zipr   r   r   r   r   r   r     s    z	Map.Valuec                 C   s   d| j t| f S )NzMap(%s, size=%d)r   r   r   r   r   r     s    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 r6   )r   rm   r   )r1   parent_widthrl   r    rh   r   r   r   r   #  s    zRef.PackedTypec                 C   s   || _ || _|| _|| _d S r6   r   )r   r1   r   r    rh   r   r   r   r   (  s    zRef.__init__c                 C   s   d| j | j| j| jf S )Nz1Ref(%s, parent_width=%d, byte_width=%d, type_=%s)r   r   r   r   r   r   .  s    zRef.__repr__c                 C   s   | j d | j S r6   )r   r   r   r   r   r   _Bytes2  s    z
Ref._Bytesc                 C   s   t d| j|f d S )Nzcannot convert %s to %s)r   r   )r   Ztarget_typer   r   r   _ConvertError6  s    zRef._ConvertErrorc                 C   s   | j d| jS r.   )r   r   r   r   r   r   r   	_Indirect9  s    zRef._Indirectc                 C   s   | j tju S r6   )r   r   r   r   r   r   r   IsNull<  s    z
Ref.IsNullc                 C   s   | j tju S r6   )r   r   ro   r   r   r   r   IsBool@  s    z
Ref.IsBoolc                 C   s*   | j tju rttt| jS | jdkS d S r.   )r   r   ro   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 r6   )IsIntIsFloatr   r   r   r   	IsNumericW  s    zRef.IsNumericc                 C   s   | j tjtjtjtjfv S r6   )r   r   rv   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 r2tt| j	S | jtj
u rVtt|  d| j S | jtju rntt| j	S | jtju rtt|  d| j S | jrt| jS | jrt| jS | jrt| jS | jrt| jS | jrt| jS | j rt| jS | tjdS )z+Returns current reference as integer value.r   N)r   r   rg   r   r   r   rv   r2   r   r   r   r   r   r   r   r   IsStringr/   r   IsKeyr   IsBlobAsBlobIsVectorAsVectorru   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 rNtt| 	 || j
t|S | j tju rttt| j|| jt|S | j tju rtt| 	 || j
t|S d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.
    FN)r   r   rv   r:   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	MutateInt~  s    
zRef.MutateIntc                 C   s   | j tjtjfv S r6   )r   r   rn   r   r   r   r   r   r     s    zRef.IsFloatc                 C   s   | j r
dS | jrt| jS | jr*t| jS | jtju rBt	t
| jS | jtju rft	t
|  d| j S | jrvt| jS | jrtt| jS |  rtt| jS |  rtt| jS | tjdS )z2Returns current reference as floating point value.g        N)r   r   floatr   r   r   r   r   rn   r2   r   r   r   r   r   r   r   r   r/   r   ru   r   r|   ZFixedTypedVectorr   r   r   r   r   AsFloat  s&    


zRef.AsFloatc                 C   sZ   | j tju r(tt| j|| jt| jS | j tj	u rRtt| 
 || jt| jS d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.
    FN)r   r   rn   r:   r   r   r   r   r!   r   r   r   r   r   r   r   MutateFloat  s    


zRef.MutateFloatc                 C   s   | j tju S r6   )r   r   r   r   r   r   r   r     s    z	Ref.IsKeyc                 C   s(   | j rt|  | jjS | tjd S r6   )r   r   r   r   r   r   r   r   r   r   r   r   r     s    zRef.AsKeyBytesc                 C   s*   | j rtt|  | jS | tjd S r6   )r   strr   r   r   r   r   r   r   r   r   r   r     s    z	Ref.AsKeyc                 C   s   | j tju S r6   )r   r   rw   r   r   r   r   r     s    zRef.IsStringc                 C   s6   | j rtt|  | jS | jr&| jS | tj	d S r6   )
r   r   r   r   r   r   r   r   r   rw   r   r   r   r   r     s
    zRef.AsStringc                 C   s   t |  | j|S r6   )r   r   r   r   r   r   r   r   MutateString  s    zRef.MutateStringc                 C   s   | j tju S r6   )r   r   r   r   r   r   r   r     s    z
Ref.IsBlobc                 C   s(   | j rt|  | jjS | tjd S r6   )r   r   r   r   r   r   r   r   r   r   r   r   r     s    z
Ref.AsBlobc                 C   s   | j p| jp|  S r6   )r   ru   r|   r   r   r   r   IsAnyVector  s    zRef.IsAnyVectorc                 C   s   | j tjtjfv S r6   )r   r   r   r   r   r   r   r   r     s    zRef.IsVectorc                 C   s&   | j rt|  | jS | tjd S r6   )r   r   r   r   r   r   r   r   r   r   r   r     s    zRef.AsVectorc                 C   s   t | jS r6   )r   ru   r   r   r   r   r   ru      s    zRef.IsTypedVectorc                 C   s.   | j r t|  | jt| jS | dd S )NZTYPED_VECTOR)ru   r   r   r   r   ry   r   r   r   r   r   r   r     s
    
zRef.AsTypedVectorc                 C   s   t | jS r6   )r   r|   r   r   r   r   r   r|     s    zRef.IsFixedTypedVectorc                 C   s8   | j r*t| j\}}t|  | j||S | dd S )NZFIXED_TYPED_VECTOR)r|   r   r~   r   r   r   r   r   )r   r   r   r   r   r   r     s    zRef.AsFixedTypedVectorc                 C   s   | j tju S r6   )r   r   r   r   r   r   r   IsMap  s    z	Ref.IsMapc                 C   s&   | j rt|  | jS | tjd S r6   )r  r   r   r   r   r   r   r   r   r   r   AsMap  s    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	rF| j
S | jrR| jS | jr`| jjS | jrn| jjS | jr|| jjS | jr| jjS td|  dS )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   ru   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   ru   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 0 d S )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  s    z
Value.Nullc                 C   s   t | tjtjS r6   )r   r   ro   r   r   r   r   r   r   BoolV  s    z
Value.Boolc                 C   s   t | tj|S r6   )r   r   rv   r   ri   r   r   r   IntZ  s    z	Value.Intc                 C   s   t | tj|S r6   )r   r   r   r	  r   r   r   UInt^  s    z
Value.UIntc                 C   s   t | tj|S r6   )r   r   rn   r	  r   r   r   Floatb  s    zValue.Floatc                 C   s   t | tjtjS r6   )r   r   r   r   r   )rC   r   r   r   r   f  s    z	Value.Keyc                 C   s   || _ || _|| _d S r6   _valuer   _min_bit_width)r   r   rh   Zmin_bit_widthr   r   r   r   j  s    zValue.__init__c                 C   s   | j S r6   )r  r   r   r   r   r   q  s    zValue.Valuec                 C   s   | j S r6   )r   r   r   r   r   r   u  s    z
Value.Typec                 C   s   | j S r6   )r  r   r   r   r   MinBitWidthy  s    zValue.MinBitWidthc                 C   s   t | j| |S r6   )r   rj   r   StoredWidthr   Zparent_bit_widthr   r   r   StoredPackedType}  s    zValue.StoredPackedTyper   c                 C   sb   t | jr| jS dD ]>}|t|| ||  }t|| j }|d|> kr|  S qtdd S )Nr   r   zrelative offset is too big)	r   rq   r   r  r=   r   r   r  r   )r   r<   Z
elem_indexr    Z
offset_locri   r   r   r   	ElemWidth  s    
zValue.ElemWidthc                 C   s   t | jrt| j|S | jS r6   )r   rq   r   maxr  r  r   r   r   r    s    zValue.StoredWidthc                 C   s   d| j | j| jf S )NzValue(%s, %s, %s)r  r   r   r   r   r     s    zValue.__repr__c                 C   s
   t | jS r6   )r   r  r   r   r   r   r     s    zValue.__str__N)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   O  s2   









r   c                    s    fdd}|S )Nc                    sV   t |d tr<| |d   | g|dd  R i | n | 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                    s    fdd}|S )Nc                    sR   t |dkr | |d  n2t |dkrF| |d   | |d  ntdd S )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    r  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   s
   g | _ d S r6   _poolr   r   r   r   r     s    zPool.__init__c                 C   sF   ||f}t | j|dd }|dkr4| j| \}}|S | j|| d S )Nc                 S   s   | d |d k S r.   r   r   r   r   r   rL     rM   z#Pool.FindOrInsert.<locals>.<lambda>rN   )rP   r   insert)r   datarC   dorO   _r   r   r   FindOrInsert  s    zPool.FindOrInsertc                 C   s
   g | _ d S r6   r  r   r   r   r   Clear  s    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     rM   z!Pool.Elements.<locals>.<listcomp>r  r   r   r   r   Elements  s    zPool.ElementsN)	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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d[d+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dad:d;Z#d<d= Z$d>d? Z%e&j'dbd@dAZ(edBdC Z)e&j'dcdDdEZ*edddFdGZ+ededHdIZ,dJdK Z-dLdM Z.e&j'dfdNdOZ/dPdQ Z0dRdS Z1edTdU Z2edVdW Z3edXdY Z4d S )gr   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_widthr  _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   s
   t | jS r6   )r/   r   r   r   r   r   r     s    zBuilder.__len__c                 C   s   | j S r6   )r,  r   r   r   r   
StringPool  s    zBuilder.StringPoolc                 C   s   | j S r6   )r-  r   r   r   r   KeyPool  s    zBuilder.KeyPoolc                 C   s,   | j   | j  d| _t | _g | _d S r(  )r,  r&  r-  r.  r   r   r/  r   r   r   r   r&    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)r.  RuntimeErrorr/   r/  _Alignr  r   	_WriteAny_Writer   r  finished)r   r   r    r   r   r   Finish  s    
zBuilder.Finishc                 C   s    | j |d  }|d |d S r.   )r   r   )r   rC   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   r3    s    zBuilder._Alignc                 C   s   | j t||| d S r6   )r   r:  r7   )r   r0   r   r    r   r   r   r5    s    zBuilder._Writec                 C   s   | j t||| d S r6   )r   r:  r9   )r   r0   r8   r    r   r   r   _WriteVector  s    zBuilder._WriteVectorc                 C   s<   t | j| }|dks*|dd| > k s*J | t|| d S )Nr   r   )r/   r   r5  r   )r   rC   r    Zrelative_offsetr   r   r   _WriteOffset  s    zBuilder._WriteOffsetc              
   C   sR   t jtt jtt jtt jtt jti	|j }|r@| 
||j| n| |j| d S r6   )r   r   r   ro   rv   r   r   rn   r   getr5  r   r=  )r   r   r    r0   r   r   r   r4    s    zBuilder._WriteAnyc                 C   sh   t t|}| |}| tt|| t| j}| j| |rP| jd | jt	||| |S r.   )
r   r   r/   r3  r5  r   r:  appendr/  r   )r   r"  append_zerorh   ri   r    locr   r   r   
_WriteBlob  s    

zBuilder._WriteBlobc           	      C   s   t |}t t||kr$td| | |sD| tt|| t| j}tj	t
tjttjti|}|svtd| ||| t||rt|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   r3  r5  r   r   rv   r   r   rn   r   r>  r   r<  r   r/  r?  r   )	r   r   r    elementsfixedri   rA  r0   rh   r   r   r   _WriteScalarVector*  s    


zBuilder._WriteScalarVectorNc                 C   s  t |}|r|stdt| jt|}d}|rPt||t | j}|d7 }tj	}t
|D ]J\}	}
t||
t | j||	 }|r^|	dkr|
j}q^||
jkr^tdq^|rt|std| |}|r| |j| | td|j> | |s| t|| t | j}|D ]}
| |
| q|sJ|D ]}
| j|
| q0|rXtj}n$|rvt||rn|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   r  r+  r   r   r  r   r   r   	enumerater2  r}   r3  r=  r   r5  r  r4  r?  r  r   r   r   )r   rC  typedrD  keysr4   ri   Zprefix_elemsZvector_typer)   r   r    rA  rh   r   r   r   _CreateVectorB  sH    



zBuilder._CreateVectorc                 C   sT   |  |}t| j}tjttjttjt	i| }| 
||| | jt||| d S r6   )r3  r/   r   r   r   r   r   r   r   r   r5  r/  r?  r   )r   r   rh   ri   r    rA  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@  rh   NrN   )r/   r   r   rB  r   rw   r)  r,  r%  r/  r  )r   r   Zreset_tor   rA  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.
    FrK  )rB  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:  r?  r*  r-  r%  r/  r   r   )r   r   r   rA  rL  r   r   r   r     s    


zBuilder.Keyc                 C   s"   |r|  | | jt  dS )zEncodes None value.N)r   r/  r?  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)r/  r?  r   r  r   r   r   r   r    s    zBuilder.Boolr   c                 C   s4   |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!   r/  r?  r   r
  r   r   r    ri   r   r   r   r
    s    zBuilder.Intc                 C   s0   |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!   rJ  r   r   rN  r   r   r   IndirectInt  s    zBuilder.IndirectIntc                 C   s4   |dkrt |nt |}| jt|| dS )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!   r/  r?  r   r  rN  r   r   r   r    s    zBuilder.UIntc                 C   s0   |dkrt |nt |}| |tj| dS )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!   rJ  r   r   rN  r   r   r   IndirectUInt  s    zBuilder.IndirectUIntc                 C   s4   |dkrt |nt |}| jt|| dS )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!   r/  r?  r   r  rN  r   r   r   r    s    zBuilder.Floatc                 C   s0   |dkrt |nt |}| |tj| dS )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!   rJ  r   r   rN  r   r   r   IndirectFloat  s    zBuilder.IndirectFloatc                 C   s
   t | jS )zStarts vector construction.r/   r/  r   r   r   r   _StartVector  s    zBuilder._StartVectorc                 C   s6   |  | j|d ||}| j|d= | j| |jS )z6Finishes vector construction by encodung its elements.N)rI  r/  r?  r   )r   r>   rG  rD  Zvecr   r   r   
_EndVector  s    zBuilder._EndVectorc                 c   sH   |r|  | z"|  }| V  W | j|ddd n| j|ddd 0 d S )NFrG  rD  r   rS  rT  r   r   r>   r   r   r   r     s    
zBuilder.Vectorc                 C   s@   |   $ |D ]}| | qW d   n1 s20    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   rC  r   r   r   r   VectorFromElements&  s    
zBuilder.VectorFromElementsc                 c   sH   |r|  | z"|  }| V  W | j|ddd n| j|ddd 0 d S )NTFrU  rV  rW  r   r   r   r   1  s    
zBuilder.TypedVectorc                 C   s   t |tjr|jdkr,| jtjd|dd q|jdkrL| jtjd|dd q|jdv rn| jtj|j|dd q|jdv r| jtj|j|dd qt	d	|j nR|d
u r| j
n| |}|  " |D ]}|| qW d
   n1 s0    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rD  r-   r   )r'   r(   r)   lr*   )r!   r+   r   Lr,   zunsupported array typecode: %sN)r   arraytypecoderE  r   rn   rv   itemsizer   r   rX  Adderr   )r   rC  r   addr   r   r   r   TypedVectorFromElements<  s$    	




zBuilder.TypedVectorFromElementsc                    s   dt |  krdks"n tddd |D }t |dkrDtd|\}|du rxttjttji|}|sxtd	| |d
krt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  rM   z7Builder.FixedTypedVectorFromElements.<locals>.<setcomp>r   z%all elements must be of the same typeNr   r   c                 3   s   | ]} |V  qd S r6   r   r   widthr   r   	<genexpr>~  rM   z7Builder.FixedTypedVectorFromElements.<locals>.<genexpr>TrZ  )r/   r   r   rg   r   rv   r   rn   r>  r   r   r   r   r   r  rE  )r   rC  r   r    typesrh   r   re  r   FixedTypedVectorFromElementsX  s&    z$Builder.FixedTypedVectorFromElementsc                 C   s
   t | jS )zStarts map construction.rR  r   r   r   r   	_StartMap  s    zBuilder._StartMapc                    s   j |d }t|d dkr&td|ddd D ]}|jtjur4tdtj q4t|ddd |ddd }t| fddd	} j |d= |D ]} j | q 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.   )r8  r   )pairr   r   r   rL     rM   z!Builder._EndMap.<locals>.<lambda>)r   TFrU  )rG  rD  rH  )r/  r/   r2  r   r   r   sortedr:  rI  r?  r   )r   r>   stackr   pairsrk  rH  r8   r   r   r   _EndMap  s$    zBuilder._EndMapc              	   c   s<   |r|  | z|  }| V  W | | n| | 0 d S r6   )r   rj  ro  rW  r   r   r   r     s    
zBuilder.Mapc                 C   s<   |   }| D ]\}}| | | | q| | d S r6   )rj  itemsr   rX  ro  )r   rC  r>   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 r6   )r   ro   r  rv   r
  r   rO  r   r  r   rP  rn   r  r   rQ  r   r   r   r   rw   r   )r   rh   r   r   r   r`    s    zBuilder.Adderc                 C   s"  |du r|    n
t|tr*| | nt|tr@| | nt|trV| | nt|trl| 	| nt|t
tfr| | nt|tr|  6 | D ]\}}| | | | qW d   n1 s0    Y  n>t|tjr| | n&t|r| | ntdt| dS )z$Encodes value of any supported type.Nzunsupported python type: %s)r  r   r   r  rg   r
  r   r  r   r   rM  r   r   dictr   rp  r   rX  r]  rb  r  rY  r   rc  )r   r   r   r   r   r   r   rX    s,    






,
zBuilder.Addc                 C   s
   | j d S )NrN   )r/  r   r   r   r   	LastValue  s    zBuilder.LastValuec                 C   s   | j | d S r6   )r/  r?  r   r   r   r   
ReuseValue  s    zBuilder.ReuseValue)N)N)r   )r   )r   )r   )r   )r   )N)N)N)Nr   )N)5r"   r#   r$   r%   r   r   r   r   r   r0  r1  r&  r7  r8  r3  r5  r<  r=  r4  rB  rE  rI  rJ  r  r   r  r   r   r  r  r
  rO  r  rP  r  rQ  rS  rT  
contextlibcontextmanagerr   rY  r   rb  ri  rj  ro  r   rq  r`  rX  rs  rt  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 smallrN   r	   r   rk   )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   rX  r7  )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     s    r   )(r%   r]  ru  enumr   __all__IntEnumr   r   r   r   r2   r5   r7   r9   r:   r=   rD   rI   rP   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r  r   r   r   r   r   r   r   r   <module>   sX   
;

v(#<'  *M
     	