B
    d                 @   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.7/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q)r   r	   r   r   r   Hr   Qfd)r   r   c             C   s   t d| t|  |d S )Nz<%sr   )r   r   len)fmtbufr   r   r   _Unpacka   s    r/   c             C   s$   t || }td|| | f |S )Nz<%d%s)r,   r   r   )r-   r.   lengthr   r   r   r   _UnpackVectore   s    r1   c             C   s   t d| |  |S )Nz<%s)r   r   )r-   r   r   r   r   r   _Packj   s    r2   c             C   s    t jdt|| | f f| S )Nz<%d%s)r   r   r,   )r-   valuesr   r   r   r   _PackVectorn   s    r4   c             C   s(   d|> |kr$t | |||d |< dS dS )Nr   TF)r2   )r-   r.   r   r   Zvalue_bit_widthr   r   r   _Mutater   s    r5   c             C   s   |  |d @ S )Nr   r   )buf_sizeZscalar_sizer   r   r   _PaddingBytes|   s    r7   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offsetr0   r8   r9   r   r   r   _ShiftSlice   s    r>   c             C   sh   dt |  }}|| }xL|dkrb|}|d }||7 }|| | |r\|d7 }|}||d 8 }q|}qW |S )z3Implementation of C++ std::lower_bound() algorithm.r   r	   r   )r,   )r3   r   predfirstlastcountr&   r;   r   r   r   _LowerBound   s    
rC   c             C   s   | |k S )Nr   )xyr   r   r   <lambda>       rF   c             C   s.   t | ||}|t| kr*||| | s*|S dS )z5Implementation of C++ std::binary_search() algorithm.)rC   r,   )r3   r   r?   indexr   r   r   _BinarySearch   s    rJ   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 )N)r   FLOATBOOL)rb   r   r   r   IsInline   s    zType.IsInlinec             C   s&   t j|   kot jkn  p$| t jkS )N)r   
VECTOR_INTVECTOR_STRING_DEPRECATEDVECTOR_BOOL)rb   r   r   r   IsTypedVector   s    zType.IsTypedVectorc             C   s&   t j|   kot jkn  p$| t jkS )N)r   INTSTRINGrh   )rb   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   rm   r   rj   rn   )rb   r   r   r   ToTypedVectorElementType   s    
zType.ToTypedVectorElementTypec             C   s   t j|   kot jkS   S )N)r   VECTOR_INT2VECTOR_FLOAT4)rb   r   r   r   IsFixedTypedVector   s    zType.IsFixedTypedVectorc             C   s   t j|   kot jkS   S )N)r   rn   rg   )rb   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   rt   r   rr   rn   )rb   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 typez'must be fixed typed vector element typer	   r
   r   zunsupported fixed_len: %sN)	r   rp   r   ru   rn   rj   rr   VECTOR_INT3VECTOR_INT4)element_typeZ	fixed_lenr=   r   r   r   ToTypedVector   s    



zType.ToTypedVectorN)r   )+r   r    r!   r"   NULLrn   UINTrg   KEYro   INDIRECT_INTINDIRECT_UINTINDIRECT_FLOATMAPVECTORrj   ZVECTOR_UINTZVECTOR_FLOATZ
VECTOR_KEYrk   rr   ZVECTOR_UINT2ZVECTOR_FLOAT2rw   ZVECTOR_UINT3ZVECTOR_FLOAT3rx   ZVECTOR_UINT4rs   BLOBrh   rl   r#   rd   rf   ri   rm   rp   rq   rt   ru   rv   rz   r   r   r   r   r      sP   	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 )Nr   )_bufr,   _offset_length)selfr.   r=   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   r>   r   r   ra   	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 )Nzinvalid key type)r   r:   r   r>   r   r   ra   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   r=   r   r   r   Slice7  s    z	Buf.Slicec          	   C   s    |  |tt| |||   S )zAReturn new `Buf` based on the encoded offset (indirect encoding).)r   r/   r   )r   r=   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 )N)r   r   )r   r.   r   r   r   r   r   D  s    zObject.__init__c             C   s   | j S )N)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 )Nr   )superr   r/   r   	SizeBytesr   )r   r.   r   size)	__class__r   r   r   Q  s    zSized.__init__c             C   s   | j | j d S )Nr   )r   r   )r   r   r   r   r   X  s    zSized.SizeBytesc             C   s   | j S )N)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 )Nr   )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   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 )Nr   )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.
    zutf-8r   TF)encoder,   r2   r   r   r   	bytearray)r   r   encodednr   r   r   Mutatet  s    
zString.Mutatec             C   s   | j dS )Nzutf-8)r   decode)r   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   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 )Nr   )r   r   r   )r   r.   r   )r   r   r   r     s    zKey.__init__c             C   s   | j dt|  S )Nr   )r   r,   )r   r   r   r   r     s    z	Key.Bytesc             C   s   | j dS )Nr   )r   r   )r   r   r   r   r     s    zKey.__len__c             C   s   | j dS )Nascii)r   r   )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   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   z'vector index %s is out of [0, %d) range)r,   
IndexErrorr   r   r   Ref
PackedType)r   rI   re   r.   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 )N)r   r   r   ro   r}   r   )r   r.   r   ry   r   )r   r   r   r     s    
zTypedVector.__init__c             C   s   | j d | jt|   S )N)r   r   r,   )r   r   r   r   r     s    zTypedVector.Bytesc             C   s   | j S )N)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   z'vector index %s is out of [0, %d) ranger   )r,   r   r   r   r   r   r   )r   rI   r.   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   )bool)r   r   r   r   r   r     s    z%TypedVector.Value.<locals>.<listcomp>c             S   s   g | ]
}|j qS r   )AsKey)r   r   r   r   r   r     s    c             S   s   g | ]
}|j qS r   )AsString)r   r   r   r   r   r     s    zunsupported element_type: %sN)r   r   rh   r1   r   r   r,   rn   listr   r|   rg   r   r}   ro   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 )N)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   rH   )	r   ra   r   r   rJ   Keysr   r   KeyError)r   r   rI   )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)r/   r   r   r   r   r   r   r}   )r   r   r.   r   r   r   r     s    zMap.Keysc             C   s   t | j| jS )N)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   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 )N)r   rf   r   )r.   parent_widthre   r   rb   r   r   r   r   #  s    zRef.PackedTypec             C   s   || _ || _|| _|| _d S )N)r   r   r   r   )r   r.   r   r   rb   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   r   r   r   .  s    zRef.__repr__c             C   s   | j d | j S )N)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 )Nr   )r   r   r   )r   r   r   r   	_Indirect9  s    zRef._Indirectc             C   s   | j tjkS )N)r   r   r{   )r   r   r   r   IsNull<  s    z
Ref.IsNullc             C   s   | j tjkS )N)r   r   rh   )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 )Nr   )r   r   rh   r   r/   r   r   AsInt)r   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   r5   r   r   r   r   r   )r   r   r   r   r   
MutateBoolK  s    	zRef.MutateBoolc             C   s   | j p
| jS )N)IsIntIsFloat)r   r   r   r   	IsNumericW  s    zRef.IsNumericc             C   s   | j tjtjtjtjfkS )N)r   r   rn   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   ra   r   r   r   rn   r/   r   r   r~   r   r   r|   r   r   IsStringr,   r   IsKeyr   IsBlobAsBlobIsVectorAsVectorrm   AsTypedVectorrt   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   rn   r5   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 )N)r   r   rg   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   rg   r/   r   r   r   r   r   r   r   r   r,   r   rm   r   rt   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   rg   r5   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 )N)r   r   r}   )r   r   r   r   r     s    z	Ref.IsKeyc             C   s(   | j rt|  | jjS | tjd S )N)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 )N)r   strr   r   r   r   r   r}   )r   r   r   r   r     s    z	Ref.AsKeyc             C   s   | j tjkS )N)r   r   ro   )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 )N)
r   r   r   r   r   r   r   r   r   ro   )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 )N)
r   r   r   r   r   r   r   r   r   ro   )r   r   r   r   r     s
    zRef.AsStringc             C   s   t |  | j|S )N)r   r   r   r   )r   r   r   r   r   MutateString  s    zRef.MutateStringc             C   s   | j tjkS )N)r   r   r   )r   r   r   r   r     s    z
Ref.IsBlobc             C   s(   | j rt|  | jjS | tjd S )N)r   r   r   r   r   r   r   r   )r   r   r   r   r     s    z
Ref.AsBlobc             C   s   | j p| jp|  S )N)r   rm   rt   )r   r   r   r   IsAnyVector  s    zRef.IsAnyVectorc             C   s   | j tjtjfkS )N)r   r   r   r   )r   r   r   r   r     s    zRef.IsVectorc             C   s&   | j rt|  | jS | tjd S )N)r   r   r   r   r   r   r   )r   r   r   r   r     s    zRef.AsVectorc             C   s   t | jS )N)r   rm   r   )r   r   r   r   rm   	  s    zRef.IsTypedVectorc             C   s.   | j r t|  | jt| jS | dd S )NZTYPED_VECTOR)rm   r   r   r   r   rq   r   r   )r   r   r   r   r     s    zRef.AsTypedVectorc             C   s   t | jS )N)r   rt   r   )r   r   r   r   rt     s    zRef.IsFixedTypedVectorc             C   s8   | j r*t| j\}}t|  | j||S | dd S )NZFIXED_TYPED_VECTOR)rt   r   rv   r   r   r   r   r   )r   ry   r   r   r   r   r     s    zRef.AsFixedTypedVectorc             C   s   | j tjkS )N)r   r   r   )r   r   r   r   IsMap!  s    z	Ref.IsMapc             C   s&   | j rt|  | jS | tjd S )N)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   rm   r   rt   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   rm   r   rt   r   r   r   r   r   r   r   r   r     sL   		r   c             C   s&   yt |  dS  tk
r    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 )Nr   )r   r   r{   r   r   r   r   r   r   Null[  s    z
Value.Nullc             C   s   t | tjtjS )N)r   r   rh   r   r   )r   r   r   r   Bool_  s    z
Value.Boolc             C   s   t | tj|S )N)r   r   rn   )r   rc   r   r   r   Intc  s    z	Value.Intc             C   s   t | tj|S )N)r   r   r|   )r   rc   r   r   r   UIntg  s    z
Value.UIntc             C   s   t | tj|S )N)r   r   rg   )r   rc   r   r   r   Floatk  s    zValue.Floatc             C   s   t | tjtjS )N)r   r   r}   r   r   )r=   r   r   r   r   o  s    z	Value.Keyc             C   s   || _ || _|| _d S )N)_valuer   _min_bit_width)r   r   rb   Zmin_bit_widthr   r   r   r   s  s    zValue.__init__c             C   s   | j S )N)r   )r   r   r   r   r   z  s    zValue.Valuec             C   s   | j S )N)r   )r   r   r   r   r   ~  s    z
Value.Typec             C   s   | j S )N)r   )r   r   r   r   MinBitWidth  s    zValue.MinBitWidthc             C   s   t | j| |S )N)r   rd   r   StoredWidth)r   parent_bit_widthr   r   r   StoredPackedType  s    zValue.StoredPackedTyper   c             C   sb   t | jr| jS xBdD ]:}|t|| ||  }t|| j }|d|> kr|S qW tdd S )N)r   r	   r   r   r   zrelative offset is too big)	r   ri   r   r   r7   r   r   r   r   )r   r6   Z
elem_indexr   Z
offset_locrc   r   r   r   	ElemWidth  s    

zValue.ElemWidthc             C   s   t | jrt| j|S | jS )N)r   ri   r   maxr   )r   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   r   r     s    zValue.__repr__c             C   s
   t | jS )N)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  s    
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)r,   r   r   )r   r   )r   r   r   r     s    zInMapForString.<locals>.wrapperr   )r   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 )N)_pool)r   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 )Nr   r   )r   r$   r   r   r   rF     rG   z#Pool.FindOrInsert.<locals>.<lambda>rH   )rJ   r  insert)r   datar=   dorI   _r   r   r   FindOrInsert  s    zPool.FindOrInsertc             C   s
   g | _ d S )N)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 )N)r,   r   )r   r   r   r   r     s    zBuilder.__len__c             C   s   | j S )N)r  )r   r   r   r   
StringPool  s    zBuilder.StringPoolc             C   s   | j S )N)r  )r   r   r   r   KeyPool  s    zBuilder.KeyPoolc             C   s,   | j   | j  d| _t | _g | _d S )NF)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 )Nr   )r   r   )r   r=   r   r   r   r   _ReadKey  s    zBuilder._ReadKeyc             C   s(   d|> }| j dtt| j |  |S )Nr       )r   extendr7   r,   )r   Z	alignmentr   r   r   r   r    s    zBuilder._Alignc             C   s   | j t||| d S )N)r   r  r2   )r   r-   r   r   r   r   r   r    s    zBuilder._Writec             C   s   | j t||| d S )N)r   r  r4   )r   r-   r3   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   )r,   r   r   r  r   )r   r=   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 )N)r   r{   r   rh   rn   r   r|   rg   r   getr  r   r  )r   r   r   r-   r   r   r   r    s
    "zBuilder._WriteAnyc             C   sh   t t|}| |}| tt|| t| j}| j| |rP| jd | jt	||| |S )Nr   )
r   r   r,   r  r  r   r  appendr  r   )r   r  append_zerorb   rc   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   r  r  r   r   rn   r   r|   rg   r   r  r   r  rz   r  r  r   )	r   ry   r   elementsfixedrc   r   r-   rb   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	}xVt
|D ]J\}	}
t||
t | j||	 }|r`|	dkr|
j}q`||
jkr`tdq`W |rt|std| |}|r| |j| | td|j> | |s| t|| t | j}x|D ]}
| |
| qW |sVx |D ]}
| j|
| q:W |rdtj}n$|rt||rz|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 typez'must be fixed typed vector element type)r,   r   r   r  r   r   r   r   r   r}   	enumerater  ru   r  r  r   r  r   r  r  r   r   rz   r   )r   r"  typedr#  keysr0   rc   Zprefix_elemsZvector_typer&   r   r   r   rb   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 )N)r  r,   r   r   r~   r   r   r   r   r   r  r  r  r   )r   r   rb   rc   r   r   r-   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.zutf-8T)r  rb   NrH   )r,   r   r   r!  r   ro   r	  r  r  r  r   )r   r   Zreset_tor   r   prev_locr   r   r   r     s    

zBuilder.Stringc             C   s   | j |dtjdS )zEncodes binary blob value.

    Args:
      value: A byte/bytearray value to encode

    Returns:
      Offset of the encoded value in underlying the byte buffer.
    F)r  rb   )r!  r   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   r,   r   r  r  r
  r  r  r  r   r   )r   r   r   r   r*  r   r   r   r     s    


zBuilder.Keyc             C   s"   |r|  | | jt  dS )zEncodes None value.N)r   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   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   rc   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   r)  r   r~   )r   r   r   rc   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   )r   r   r   rc   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   r)  r   r   )r   r   r   rc   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   )r   r   r   rc   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   r)  r   r   )r   r   r   rc   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)r(  r  r  r   )r   r8   r&  r#  Zvecr   r   r   
_EndVector  s    zBuilder._EndVectorc             c   s8   |r|  | z|  }| V  W d | j|ddd X d S )NF)r&  r#  )r   r/  r0  )r   r   r8   r   r   r   r   $  s    

zBuilder.Vectorc          	   C   s0   |    x|D ]}| | qW W d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   r"  r   r   r   r   VectorFromElements/  s    

zBuilder.VectorFromElementsc             c   s8   |r|  | z|  }| V  W d | j|ddd X d S )NTF)r&  r#  )r   r/  r0  )r   r   r8   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 nB|d
kr| j
n| |}|   x|D ]}|| qW W d
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)r#  r+   r   )r$   r%   r&   lr'   )r   r(   r   Lr)   zunsupported array typecode: %sN)r   arraytypecoder$  r   rg   rn   itemsizer|   r   r1  Adderr   )r   r"  ry   addr   r   r   r   TypedVectorFromElementsE  s     	





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   )type)r   r   r   r   r   	<setcomp>v  s    z7Builder.FixedTypedVectorFromElements.<locals>.<setcomp>r   z%all elements must be of the same typeNzunsupported element_type: %sr   c             3   s   | ]} |V  qd S )Nr   )r   r   )widthr   r   	<genexpr>  s    z7Builder.FixedTypedVectorFromElements.<locals>.<genexpr>T)r#  )r,   r   r   ra   r   rn   r   rg   r  r|   r   r   r   r   r   r$  )r   r"  ry   r   typesrb   r   )r=  r   FixedTypedVectorFromElementsa  s"    
z$Builder.FixedTypedVectorFromElementsc             C   s
   t | jS )zStarts map construction.)r,   r  )r   r   r   r   	_StartMap  s    zBuilder._StartMapc                s   j |d }t|d dkr&tdx0|ddd D ]}|jtjk	r6tdtj q6W t|ddd |ddd }t| fddd	} j |d= x|D ]} j | qW  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 )Nr   )r  r   )pair)r   r   r   rF     rG   z!Builder._EndMap.<locals>.<lambda>)r   TF)r&  r#  )r&  r#  r'  )r  r,   r  r   r}   r   sortedr  r(  r  r   )r   r8   stackr   pairsrB  r'  r3   r   )r   r   _EndMap  s"    
zBuilder._EndMapc          	   c   s2   |r|  | z|  }| V  W d | | X d S )N)r   rA  rF  )r   r   r8   r   r   r   r     s    

zBuilder.Mapc             C   s@   |   }x(| D ]\}}| | | | qW | | d S )N)rA  itemsr   r1  rF  )r   r"  r8   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 )N)r   rh   r   rn   r   r~   r,  r|   r   r   r-  rg   r   r   r.  r}   r   r   r   ro   r   )r   rb   r   r   r   r8    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|  0 x(| D ]\}}| | | | qW W d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   ra   r   r   r   r   r   r+  r   r   dictr   rG  r   r1  r5  r:  r   r2  r   r;  )r   r   r   r   r   r   r   r1    s,    







zBuilder.Addc             C   s
   | j d S )NrH   )r  )r   r   r   r   	LastValue  s    zBuilder.LastValuec             C   s   | j | d S )N)r  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   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/  r0  
contextlibcontextmanagerr   r2  r   r:  r@  rA  rF  r   rH  r8  r1  rJ  rK  r   r   r   r   r     sr   	
:
	







 &
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 smallrH   r	   r   )re   )r,   r   r   r   r   )r.   r   r   r   r   r     s
    r   c             C   s   t  }||  | S )z1Returns bytearray with the encoded python object.)r   r1  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   )r.   r   r   r   r     s    r   )(r"   r5  rL  enumr   __all__IntEnumr   r   r   r   r/   r1   r2   r4   r5   r7   r>   rC   rJ   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
     	