U
    L?h                     @   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t | 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)AssertionErrorr   W8W16W32W64
ValueErrorvalue r   I/var/www/html/venv/lib/python3.8/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.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    r3   c                 C   s$   t || }td|| | f |S Nz<%d%s)r0   r   r   )r1   r2   lengthr    r   r   r   _UnpackVectore   s    r6   c                 C   s   t d| |  |S )Nr/   )r   r   )r1   r   r    r   r   r   _Packj   s    r7   c                 C   s    t jdt|| | f f| S r4   )r   r   r0   )r1   valuesr    r   r   r   _PackVectorn   s    r9   c                 C   s(   d|> |kr$t | |||d |< dS dS )Nr   TF)r7   )r1   r2   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 krdn| j  }|| jd kr(|n| j }t||| jS Nr   )startstopslicestep)soffsetr5   r?   r@   r   r   r   _ShiftSlice   s    rE   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   )r0   )r8   r   predfirstlastcountr)   rB   r   r   r   _LowerBound   s    rJ   c                 C   s   | |k S Nr   )xyr   r   r   <lambda>       rN   c                 C   s.   t | ||}|t| kr*||| | s*|S dS )z5Implementation of C++ std::binary_search() algorithm.)rJ   r0   )r8   r   rF   indexr   r   r   _BinarySearch   s    rR   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 rK   )r   FLOATBOOLrj   r   r   r   IsInline   s    zType.IsInlinec                 C   s&   t j|   kot jkn  p$| t jkS rK   )r   
VECTOR_INTVECTOR_STRING_DEPRECATEDVECTOR_BOOLrr   r   r   r   IsTypedVector   s    zType.IsTypedVectorc                 C   s&   t j|   kot jkn  p$| t jkS rK   )r   INTSTRINGrq   rr   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   rw   r   rt   rx   rr   r   r   r   ToTypedVectorElementType   s    
zType.ToTypedVectorElementTypec                 C   s   t j|   kot jkS   S rK   )r   VECTOR_INT2VECTOR_FLOAT4rr   r   r   r   IsFixedTypedVector   s    zType.IsFixedTypedVectorc                 C   s   t j|   kot jkS   S rK   )r   rx   rp   rr   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   r|   rx   )rj   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   rz   r   r   rx   rt   r|   VECTOR_INT3VECTOR_INT4)element_typeZ	fixed_lenrD   r   r   r   ToTypedVector   s    



zType.ToTypedVectorN)r   )+r"   r#   r$   r%   NULLrx   UINTrp   KEYry   INDIRECT_INTINDIRECT_UINTINDIRECT_FLOATMAPVECTORrt   ZVECTOR_UINTZVECTOR_FLOATZ
VECTOR_KEYru   r|   ZVECTOR_UINT2ZVECTOR_FLOAT2r   ZVECTOR_UINT3ZVECTOR_FLOAT3r   ZVECTOR_UINT4r}   BLOBrq   rv   r&   rl   ro   rs   rw   rz   r{   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>   )_bufr0   _offset_length)selfr2   rD   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
isinstancerA   r   rE   r   r   ri   	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   rD   r   r   r   Slice7  s    z	Buf.Slicec              	   C   s    |  |tt| |||   S )zAReturn new `Buf` based on the encoded offset (indirect encoding).)r   r3   r   )r   rD   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 rK   r   r   r2   r    r   r   r   r   D  s    zObject.__init__c                 C   s   | j S rK   )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   r3   r   	SizeBytesr   )r   r2   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 rK   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   r0   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)encoder0   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t t || d S r;   )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)r0   
IndexErrorr   r   r   Ref
PackedType)r   rQ   rn   r2   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>  s     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 rK   )r   r   r   ry   r   r   )r   r2   r    r   r   r   r   r   r     s    
zTypedVector.__init__c                 C   s   | j d | jt|   S rK   )r   r   r0   r   r   r   r   r     s    zTypedVector.Bytesc                 C   s   | j S rK   )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   )r0   r   r   r   r   r   r   )r   rQ   r2   r   r   r   r     s    
zTypedVector.__getitem__c                 C   s   | sg S | j tjkr0dd tt| jt| D S | j tjkrRttt	| jt| S | j tj
krtttt| jt| S | j tjkrttt| jt| S | j tjkrdd | D S | j tjk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     s     z%TypedVector.Value.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   )AsKeyr   r   r   r   r     s     c                 S   s   g | ]
}|j qS r   )AsStringr   r   r   r   r     s     unsupported element_type: %sN)r   r   rq   r6   r   r   r0   rx   listr   r   rp   r   r   ry   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 rK   )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   rP   )	r   ri   r   r   rR   Keysr   r   KeyError)r   r   rQ   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)r3   r   r   r   r   r   r   r   )r   r    r2   r   r   r   r     s    zMap.Keysc                 C   s   t | j| jS rK   )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>  s      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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 rK   )r   ro   r   )r2   parent_widthrn   r    rj   r   r   r   r   #  s    zRef.PackedTypec                 C   s   || _ || _|| _|| _d S rK   r   )r   r2   r   r    rj   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 rK   )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kS rK   )r   r   r   r   r   r   r   IsNull<  s    z
Ref.IsNullc                 C   s   | j tjkS rK   )r   r   rq   r   r   r   r   IsBool@  s    z
Ref.IsBoolc                 C   s*   | j tjkrttt| jS | jdkS d S r>   )r   r   rq   r   r3   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 rK   )IsIntIsFloatr   r   r   r   	IsNumericW  s    zRef.IsNumericc                 C   s   | j tjtjtjtjfkS rK   )r   r   rx   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kr2tt| j	S | jtj
krVtt|  d| j S | jtjkrntt| j	S | jtjk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   ri   r   r   r   rx   r3   r   r   r   r   r   r   r   r   IsStringr0   r   IsKeyr   IsBlobAsBlobIsVectorAsVectorrw   AsTypedVectorr~   AsFixedTypedVectorr   r   r   r   r   r   `  s2    






z	Ref.AsIntc                 C   s   | j tjkr&tt| j|| jt|S | j tjkrNtt| 	 || j
t|S | j tjkrttt| j|| jt|S | j tjk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   rx   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kS rK   )r   r   rp   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krBt	t
| jS | jtjk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   rp   r3   r   r   r   r   r   r   r   r   r0   r   rw   r   r~   ZFixedTypedVectorr   r   r   r   r   AsFloat  s&    


zRef.AsFloatc                 C   sZ   | j tjkr(tt| j|| jt| jS | j tj	k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   rp   r:   r   r   r   r   r!   r   r   r   r   r   r   r   MutateFloat  s    


zRef.MutateFloatc                 C   s   | j tjkS rK   )r   r   r   r   r   r   r   r     s    z	Ref.IsKeyc                 C   s(   | j rt|  | jjS | tjd S rK   )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 rK   )r   strr   r   r   r   r   r   r   r   r   r   r     s    z	Ref.AsKeyc                 C   s   | j tjkS rK   )r   r   ry   r   r   r   r   r     s    zRef.IsStringc                 C   s4   | j rt|  | jjS | jr$| jS | tj	d S rK   )
r   r   r   r   r   r   r   r   r   ry   r   r   r   r   AsStringBytes  s
    zRef.AsStringBytesc                 C   s6   | j rtt|  | jS | jr&| jS | tj	d S rK   )
r   r  r   r   r   r   r   r   r   ry   r   r   r   r   r     s
    zRef.AsStringc                 C   s   t |  | j|S rK   )r   r   r   r   r   r   r   r   MutateString  s    zRef.MutateStringc                 C   s   | j tjkS rK   )r   r   r   r   r   r   r   r     s    z
Ref.IsBlobc                 C   s(   | j rt|  | jjS | tjd S rK   )r   r   r   r   r   r   r   r   r   r   r   r   r     s    z
Ref.AsBlobc                 C   s   | j p| jp|  S rK   )r   rw   r~   r   r   r   r   IsAnyVector  s    zRef.IsAnyVectorc                 C   s   | j tjtjfkS rK   )r   r   r   r   r   r   r   r   r     s    zRef.IsVectorc                 C   s&   | j rt|  | jS | tjd S rK   )r   r   r   r   r   r   r   r   r   r   r   r     s    zRef.AsVectorc                 C   s   t | jS rK   )r   rw   r   r   r   r   r   rw   	  s    zRef.IsTypedVectorc                 C   s.   | j r t|  | jt| jS | dd S )NZTYPED_VECTOR)rw   r   r   r   r   r{   r   r   r   r   r   r   r     s
    
zRef.AsTypedVectorc                 C   s   t | jS rK   )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kS rK   )r   r   r   r   r   r   r   IsMap!  s    z	Ref.IsMapc                 C   s&   | j rt|  | jS | tjd S rK   )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   rw   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   rw   r   r~   r   r  r  r   r   r   r   r   r     s   


























r   c                 C   s*   zt |  W dS  tk
r$   Y dS X d S )NTF)iterr   )objr   r   r   _IsIterableP  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   Null[  s    z
Value.Nullc                 C   s   t | tjtjS rK   )r   r   rq   r   r   r   r   r   r   Bool_  s    z
Value.Boolc                 C   s   t | tj|S rK   )r   r   rx   r   rk   r   r   r   Intc  s    z	Value.Intc                 C   s   t | tj|S rK   )r   r   r   r  r   r   r   UIntg  s    z
Value.UIntc                 C   s   t | tj|S rK   )r   r   rp   r  r   r   r   Floatk  s    zValue.Floatc                 C   s   t | tjtjS rK   )r   r   r   r   r   )rD   r   r   r   r   o  s    z	Value.Keyc                 C   s   || _ || _|| _d S rK   _valuer   _min_bit_width)r   r   rj   Zmin_bit_widthr   r   r   r   s  s    zValue.__init__c                 C   s   | j S rK   )r  r   r   r   r   r   z  s    zValue.Valuec                 C   s   | j S rK   )r   r   r   r   r   r   ~  s    z
Value.Typec                 C   s   | j S rK   )r  r   r   r   r   MinBitWidth  s    zValue.MinBitWidthc                 C   s   t | j| |S rK   )r   rl   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   rs   r   r  r=   r   r   r  r   )r   r<   Z
elem_indexr    Z
offset_locrk   r   r   r   	ElemWidth  s    
zValue.ElemWidthc                 C   s   t | jrt| j|S | jS rK   )r   rs   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 rK   )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   X  s2   









r   c                    s    fdd}|S )Nc                    sJ   t |d tr6| |d   | f|dd  | n | f|| 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)r0   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 rK   _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   rN     rO   z#Pool.FindOrInsert.<locals>.<lambda>rP   )rR   r#  insert)r   datarD   dorQ   _r   r   r   FindOrInsert  s    zPool.FindOrInsertc                 C   s
   g | _ d S rK   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     s     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 rK   )r0   r   r   r   r   r   r     s    zBuilder.__len__c                 C   s   | j S rK   )r/  r   r   r   r   
StringPool  s    zBuilder.StringPoolc                 C   s   | j S rK   )r0  r   r   r   r   KeyPool  s    zBuilder.KeyPoolc                 C   s,   | j   | j  d| _t | _g | _d S r+  )r/  r)  r0  r1  r   r   r2  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)r1  RuntimeErrorr0   r2  _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   rD   r   r   r   r   _ReadKey  s    zBuilder._ReadKeyc                 C   s(   d|> }| j dtt| j |  |S )Nr       )r   extendr=   r0   )r   Z	alignmentr    r   r   r   r6    s    zBuilder._Alignc                 C   s   | j t||| d S rK   )r   r=  r7   )r   r1   r   r    r   r   r   r8    s    zBuilder._Writec                 C   s   | j t||| d S rK   )r   r=  r9   )r   r1   r8   r    r   r   r   _WriteVector  s    zBuilder._WriteVectorc                 C   s<   t | j| }|dks*|dd| > k s*t| t|| d S )Nr   r   )r0   r   r   r8  r   )r   rD   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 rK   )r   r   r   rq   rx   r   r   rp   r   getr8  r   r?  )r   r   r    r1   r   r   r   r7    s              zBuilder._WriteAnyc                 C   sh   t t|}| |}| tt|| t| j}| j| |rP| jd | jt	||| |S r>   )
r   r   r0   r6  r8  r   r=  appendr2  r   )r   r%  append_zerorj   rk   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   r0   r   r6  r8  r   r   rx   r   r   rp   r   r@  r   r>  r   r2  rA  r   )	r   r   r    elementsfixedrk   rC  r1   rj   r   r   r   _WriteScalarVector3  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   )r0   r   r  r.  r   r   r  r   r   r   	enumerater5  r   r6  r?  r   r8  r  r7  rA  r  r   r   r   )r   rE  typedrF  keysr5   rk   Zprefix_elemsZvector_typer)   r   r    rC  rj   r   r   r   _CreateVectorK  sH    



zBuilder._CreateVectorc                 C   sT   |  |}t| j}tjttjttjt	i| }| 
||| | jt||| d S rK   )r6  r0   r   r   r   r   r   r   r   r   r8  r2  rA  r   )r   r   rj   rk   r    rC  r1   r   r   r   _PushIndirect  s    

   zBuilder._PushIndirectc                 C   sb   t | j}|d}| j|dtjd}| jr^| j||}|dk	r^| j|d= | | j	d _
}|S )zEncodes string value.r   TrB  rj   NrP   )r0   r   r   rD  r   ry   r,  r/  r(  r2  r  )r   r   Zreset_tor   rC  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.
    FrM  )rD  r   r   r   r   r   r   r     s    
zBuilder.Blobc                 C   s   t |ttfr|}n
|d}d|kr.tdt| j}| j| | jd | j	r|| j
||}|dk	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   r0   r   r=  rA  r-  r0  r(  r2  r   r   )r   r   r   rC  rN  r   r   r   r     s    


zBuilder.Keyc                 C   s"   |r|  | | jt  dS )zEncodes None value.N)r   r2  rA  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)r2  rA  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!   r2  rA  r   r  r   r   r    rk   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!   rL  r   r   rP  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!   r2  rA  r   r  rP  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!   rL  r   r   rP  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!   r2  rA  r   r  rP  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!   rL  r   r   rP  r   r   r   IndirectFloat  s    zBuilder.IndirectFloatc                 C   s
   t | jS )zStarts vector construction.r0   r2  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)rK  r2  rA  r   )r   r?   rI  rF  Zvecr   r   r   
_EndVector  s    zBuilder._EndVectorc                 c   s8   |r|  | z|  }| V  W 5 | j|ddd X d S )NFrI  rF  r   rV  rU  r   r   r?   r   r   r   r   $  s    

zBuilder.Vectorc              	   C   s,   |    |D ]}| | qW 5 Q R X dS )zEncodes sequence of any elements as a vector.

    Args:
      elements: sequence of elements, they may have different types.
    N)r   Add)r   rE  r   r   r   r   VectorFromElements/  s    
zBuilder.VectorFromElementsc                 c   s8   |r|  | z|  }| V  W 5 | j|ddd X d S )NTFrW  rX  rY  r   r   r   r   :  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krn| jtj|j|dd q|jdkr| jtj|j|dd qt	d	|j n>|d
kr| j
n| |}|   |D ]}|| qW 5 Q R X 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rF  r.   r   )r'   r(   r)   lr*   )r!   r+   r   Lr,   zunsupported array typecode: %sN)r   arraytypecoderG  r   rp   rx   itemsizer   r   rZ  Adderr   )r   rE  r   addr   r   r   r   TypedVectorFromElementsE  s0    	


   
   
zBuilder.TypedVectorFromElementsc                    s   dt |  krdks"n tddd |D }t |dkrDtd|\}|dk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>v  s     z7Builder.FixedTypedVectorFromElements.<locals>.<setcomp>r   z%all elements must be of the same typeNr   r   c                 3   s   | ]} |V  qd S rK   r   r   widthr   r   	<genexpr>  s     z7Builder.FixedTypedVectorFromElements.<locals>.<genexpr>Tr\  )r0   r   r   ri   r   rx   r   rp   r@  r   r   r   r   r   r  rG  )r   rE  r   r    typesrj   r   rg  r   FixedTypedVectorFromElementsa  s,       z$Builder.FixedTypedVectorFromElementsc                 C   s
   t | jS )zStarts map construction.rT  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k	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>   )r;  r   )pairr   r   r   rN     rO   z!Builder._EndMap.<locals>.<lambda>)r   TFrW  )rI  rF  rJ  )r2  r0   r5  r   r   r   sortedr=  rK  rA  r   )r   r?   stackr   pairsrm  rJ  r8   r   r   r   _EndMap  s*       zBuilder._EndMapc              	   c   s2   |r|  | z|  }| V  W 5 | | X d S rK   )r   rq  rl  rY  r   r   r   r     s    

zBuilder.Mapc                 C   s<   |   }| D ]\}}| | | | q| | d S rK   )rl  itemsr   rZ  rq  )r   rE  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 rK   )r   rq   r  rx   r  r   rQ  r   r  r   rR  rp   r  r   rS  r   r   r   r   ry   r   )r   rj   r   r   r   rb    s.              zBuilder.Adderc              	   C   s
  |dkr|    nt|tr(| | nt|tr>| | nt|trT| | nt|trj| 	| nt|t
tfr| | nt|tr|  , | D ]\}}| | | | qW 5 Q R X 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  ri   r  r   r  r  r   rO  r   r   dictr   rr  r   rZ  r_  rd  r	  r[  r   re  )r   r   r   r   r   r   r   rZ    s,    







zBuilder.Addc                 C   s
   | j d S )NrP   )r2  r   r   r   r   	LastValue  s    zBuilder.LastValuec                 C   s   | j | d S rK   )r2  rA  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   r3  r4  r)  r:  r;  r6  r8  r>  r?  r7  rD  rG  rK  rL  r   r   r  r   r   r
  r  r  rQ  r  rR  r  rS  rU  rV  
contextlibcontextmanagerr   r[  r   rd  rk  rl  rq  r   rs  rb  rZ  ru  rv  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 smallrP   r	   r   rm   )r0   r   r   r   r   )r2   r    r   r   r   r     s      r   c                 C   s   t  }||  | S )z1Returns bytearray with the encoded python object.)r   rZ  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   )r2   r   r   r   r     s    r   )(r%   r_  rw  enumr   __all__IntEnumr   r   r   r   r3   r6   r7   r9   r:   r=   rE   rJ   rR   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(#<'  3M
     	