B
     \/                 @   s2  d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZ ddlmZ ddlmZ ddl m!Z! ddlm"Z" ej#Z$ej#Z%ej#Z&ej'Z(ej)Z*e*Z+ej#Z,e-ej.Z/G dd deZ0G dd deZ1dd Z2eeG dd dej3Z4eeeeeeeeG dd dej3Z5dd Z6edd Z7edd Z8d d! Z9d"d# Z:d$d% Z;d&d' Z<d(d) Z=d*d+ Z>ed,d- Z?ed.d/ Z@ed0d1 ZAd2d3 ZBd4d5 ZCed6d7 ZDed8d9 ZEed:d; ZFed<d= ZGed>d? ZHed@dA ZIedBdC ZJdDdE ZKedFdG ZLedHdI ZMedJdK ZNedLdM ZOee2dNdO ZPeeQdPdQ ZReejSdRdS ZTeejdTddUdVZUeejVdWdX ZWeejdYdZd[ ZXeejd\dd]d^ZYeejZd_d` Z[eej\dadb Z]eejdcddde Z^eejdfdgdh Z_eejdiddjdkZ`eejdldmdn Zaeejdodpdq Zbeejdrdsdt Zceejddudv Zeeejfdwdx Zgedyejedyejedyejdzd{ Zhedyejd|d} Zied~ejedd ZjdS )z1
Compiler-side implementation of the dictionary.
    N)IntEnum)ir)cgutils)
_helperlib)
cpu_target)overloadoverload_method	intrinsicregister_modelmodelslower_builtin)iternext_impl)types)DictTypeDictItemsIterableTypeDictKeysIterableTypeDictValuesIterableTypeDictIteratorTypeType)
Conversion)impl_ret_borrowed)TypingError)typingc               @   s   e Zd ZdZdZdS )DKIXz)Special return value of dict lookup.
    N)__name__
__module____qualname____doc__EMPTY r    r    /lib/python3.7/site-packages/numba/dictobject.pyr   4   s   r   c               @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
Statusz+Status code for other dict operations.
    r      r   N)r   r   r   r   OKOK_REPLACEDZERR_NO_MEMORYZERR_DICT_MUTATEDZERR_ITER_EXHAUSTEDERR_DICT_EMPTYERR_CMP_FAILEDr    r    r    r!   r"   :   s   r"   c             C   s   t dS )zConstruct a new dict. (Not implemented in the interpreter yet)

    Parameters
    ----------
    key, value : TypeRef
        Key type and value type of the new dict.
    N)NotImplementedError)keyvaluer    r    r!   new_dictF   s    r/   c                   s   e Zd Z fddZ  ZS )	DictModelc                s*   dt fdtjfg}tt| ||| d S )Nmeminfodata)_meminfo_dictptrr   voidptrsuperr0   __init__)selfdmmfe_typemembers)	__class__r    r!   r6   S   s    zDictModel.__init__)r   r   r   r6   __classcell__r    r    )r;   r!   r0   Q   s   r0   c                   s   e Zd Z fddZ  ZS )DictIterModelc                s,   d|j fdtjfg}tt| ||| d S )Nparentstate)r>   r   r4   r5   r=   r6   )r7   r8   r9   r:   )r;   r    r!   r6   `   s    zDictIterModel.__init__)r   r   r   r6   r<   r    r    )r;   r!   r=   [   s   r=   c          	   C   sF   | ttj}||d|| | j|t|f W dQ R X dS )z?Raise an internal error depending on the value of *status*
    z!=N)	typeintr"   r(   if_thenicmp_signed	call_convZreturn_user_excRuntimeError)contextbuilderstatusmsgZ	ok_statusr    r    r!   _raise_if_errorh   s    rJ   c             C   s,   t |tjstddd }t|}||fS )z0Returns the MemInfoPointer of a dictionary.
    z"expected *dctobj* to be a DictTypec             S   s<   |j \}|\}| j||| t|}|| ||d}|jS )N)r.   )argsnrtincrefr   create_struct_proxyr1   )rF   rG   sigrK   tddctordstructr    r    r!   codegenw   s    
z_as_meminfo.<locals>.codegen)
isinstancer   r   r   r3   )	typingctxZdctobjrT   rO   r    r    r!   _as_meminfop   s
    
rW   c                sL   |t krtd|j t ts.tdt fdd} ||}||fS )z0Recreate a dictionary from a MemInfoPointer
    z#expected a MemInfoPointer for dict.zexpected a {}c                sn   |j \}}|j}|\}}t|}	|	| |}
| j||}||t }|	||
_
||
_t| | |
 S )N)rK   instance_typer   rN   rL   meminfo_databitcastll_dict_type
as_pointerloadr2   r1   r   	_getvalue)rF   rG   rO   rK   ZtmiZtdrefrP   mi_rR   rS   data_pointer)dicttyper    r!   rT      s    


z_from_meminfo.<locals>.codegen)r3   r   rX   rU   r   format)rV   r_   ZdicttyperefrT   rO   r    )rb   r!   _from_meminfo   s    

rd   c             C   s4   t t  tg}|jj|dd}|||g dS )zCall numba_dict_free(ptr)
    Znumba_dict_free)nameN)r   FunctionTypeVoidTyper[   moduleget_or_insert_functioncall)rF   rG   ptrfntyZfreer    r    r!   _call_dict_free   s
    rm   c       
      C   s   |  tj}|  tj}tt |||g}d}|j||d}|jrd|_	t
| }||jd t }||}	t| ||	 |  |S )z#Define the dtor for dictionary
    Z_numba_dict_dtor)re   Zlinkonce_odrr   )get_value_typer   r4   uintpr   rf   rg   ri   Zis_declarationZlinkage	IRBuilderappend_basic_blockrZ   rK   r[   r\   r]   rm   ret_void)
rF   rh   Z	llvoidptrZllsizerl   fnamefnrG   dprQ   r    r    r!   	_imp_dtor   s    
rv   c             C   s   t |}|| ||d}|jS )z6Helper to get the C dict pointer in a numba dict.
    )r.   )r   rN   r2   )rF   rG   dict_tyrQ   rR   rS   r    r    r!   _dict_get_data   s    
rx   c             C   s   |  |tjS )zHelper to do (void*)ptr
    )rZ   r   	voidptr_t)rG   rk   r    r    r!   	_as_bytes   s    rz   c             C   s   t j}|| |}|dks$|tjkrt| tjr@t|tjr@dS t| tjr\t|tjr\dS t| tjrxt|tjrxdS t	d
| |dS )zLCheck and raise TypingError if *fromty* cannot be safely cast to *toty*
    Nzcannot safely cast {} to {})r   typing_contextZcan_convertr   ZsaferU   r   ZIntegerZFloatr   rc   )ZfromtyZtotyZtyctxtZbyr    r    r!   _sentry_safe_cast   s    r|   c             C   s,   | dkrdS t | tjtjfr"dS t| |S )z;Similar to _sentry_safe_cast but handle default value.
    N)rU   r   OmittedZNoneTyper|   )defaultvaltyr    r    r!   _sentry_safe_cast_default   s
    r   c             C   s*   dd }|j }t|| |||}||fS )zCast *val* to *typ*
    c             S   s   |\}}| j ||j| |S )N)rL   rM   return_type)rF   rG   	signaturerK   valtypr    r    r!   rT      s    z_cast.<locals>.codegen)rX   r|   )rV   r   r   rT   castedrO   r    r    r!   _cast   s
    

r   c             C   s2   t |tjstddd }|j}||}||fS )z*Typing trick to cast Optional[T] to T
    zexpected an optionalc             S   s   | j ||j|d  |d S )Nr   )rL   rM   r   )rF   rG   rO   rK   r    r    r!   rT     s    z_nonoptional.<locals>.codegen)rU   r   Optional	TypeErrorr@   )rV   r   rT   r   rO   r    r    r!   _nonoptional  s    r   c                s&   t j}| } fdd}||fS )zWrap numba_dict_new_minsize.

    Allocate a new dictionary object with the minimum capacity.

    Parameters
    ----------
    keyty, valty: Type
        Type of the key and value, respectively.

    c                s   t tt ttg}|jj|dd}|  j	}| j	}| 
|}| 
|}	tj|tdd}
|||
t|t|	g}t| ||dd ||
}|S )NZnumba_dict_new_minsize)re   T)zfillzFailed to allocate dictionary)rI   )r   rf   	ll_statusr[   r\   
ll_ssize_trh   ri   get_data_typerX   get_abi_sizeofr   alloca_oncerj   rJ   r]   )rF   rG   rO   rK   rl   rt   Zll_keyll_valZsz_keyZsz_valZrefdprH   ru   )keytyr   r    r!   rT   &  s"    


z"_dict_new_minsize.<locals>.codegen)r   r4   )rV   r   r   restyrO   rT   r    )r   r   r!   _dict_new_minsize  s    
r   c       	      C   s   |  st|j}|  }tt |g}|j|d	|d}t
| }| j||||jd  |  |j|d	|d}t
| }| j||||jd  |  ||fS )Nz.numba_dict_incref${})re   r   z.numba_dict_decref${})contains_nrt_meminfoAssertionErrorr9   r   r\   r   rf   rg   ri   rc   rp   rq   rL   rM   r]   rK   rr   Zdecref)	rF   rh   	datamodelr9   data_ptr_tyZ
refct_fntyZ	incref_fnrG   Z	decref_fnr    r    r!   _get_incref_decref@  s"    r   c          
      s^  |  st|j|  }jtjg}g  fdd}|j	|d
d}|| ttd||g}|j	|d
d}t| }	||	|jd }
||	|jd }j|	|tj |
|g\}}|	j|jd	d
P |	|j |	tjd W d Q R X |	|tjtj}|	| W d Q R X |	tjd |S )Nc       	         s   t |  }j| | }ttj}t	j
}j|}|j|ji  ||}|||}||tjtj}j|| d S )N)r   rp   rq   rD   Zdecode_argumentsr   r   r   booleanoperatoreqr{   Zresolve_value_typeZget_call_typerK   Zget_functioncastint32Zreturn_value)	rt   rG   rK   rO   opZfnopZeqfnZresZintres)argtypesrF   r9   r    r!   build_wrapperb  s    
z!_get_equal.<locals>.build_wrapperz.numba_dict_key_equal.wrap${})re       z.numba_dict_key_equal${}r   r#   T)Zlikelyr   )r   r   r9   r   r\   rD   Zget_function_typer   r   ri   rc   r   rf   IntTyperp   rq   load_from_data_pointerrK   Zcall_functionr   rB   Zis_okZis_noneZretget_constantr   )rF   rh   r   r   Zwrapfntyr   ZwrapfnZ
equal_fntyZequal_fnrG   ZlhsZrhsrH   Zretvalr    )r   rF   r9   r!   
_get_equalY  s4    r   c                s(   t j}|| } fdd}||fS )z%Wrap numba_dict_set_method_table
    c                s  t tttttg}t t  t| g}t j|j|dd}|d }t	j
||dd}t	||dd}	t	||dd}
t	||dd}t	||dd}t	||dd	}| j j }| r$t| |j|}t| |j|\}}||||	jj|	 ||||
jj|
 ||||jj| | jj }| r|t| |j|\}}||||jj| ||||jj| ||||g d S )
NZnumba_dict_set_method_table)re   r   T)r   r#            )r   ZLiteralStructTypell_voidptr_typerf   rg   r[   r\   ZFunctionrh   r   r   Zgep_inboundsdata_model_managerrX   r   r   r   storerZ   r@   Zpointeerj   )rF   rG   rO   rK   ZvtabletyZsetmethod_fntyZsetmethod_fnru   ZvtableZkey_equal_ptrZkey_incref_ptrZkey_decref_ptrZval_incref_ptrZval_decref_ptrdm_keyZequalZ
key_increfZ
key_decrefdm_valZ
val_increfZ
val_decref)r   r   r    r!   rT     sZ    

z'_dict_set_method_table.<locals>.codegen)r   void)rV   ru   r   r   r   rO   rT   r    )r   r   r!   _dict_set_method_table  s    >r   c             C   s*   t j}|||jt j|j}dd }||fS )zWrap numba_dict_insert
    c          
   S   s   t ttttttg}|\}}}}|j\}	}
}}|jj|dd}| j	|
 }| j	| }|
||}|
||}t||}t||}t||j}t| ||	|}|||t|||t||t||g}|S )NZnumba_dict_insert)re   )r   rf   r   r[   ll_bytesll_hashrK   rh   ri   r   as_datar   alloca_once_valuer   r@   rx   rj   rz   )rF   rG   rO   rK   rl   rQ   r-   hashvalr   rP   tkeythashvalZtvalrt   r   r   data_keyZdata_valptr_keyptr_valZ
ptr_oldvalru   rH   r    r    r!   rT     s,    

z_dict_insert.<locals>.codegen)r   r   key_typeintp
value_type)rV   rQ   r-   r   r   r   rO   rT   r    r    r!   _dict_insert  s    !r   c             C   s   t j}||}dd }||fS )zFWrap numba_dict_length

    Returns the length of the dictionary.
    c       
      S   sL   t ttg}|jj|dd}|\}|j\}t| |||}|||g}	|	S )NZnumba_dict_length)re   )	r   rf   r   r[   rh   ri   rK   rx   rj   )
rF   rG   rO   rK   rl   rt   rQ   rP   ru   nr    r    r!   rT     s    z_dict_length.<locals>.codegen)r   r   )rV   rQ   r   rO   rT   r    r    r!   _dict_length  s    r   c             C   s   t j}||}dd }||fS )zRDump the dictionary keys and values.
    Wraps numba_dict_dump for debugging.
    c       	      S   sP   t t  tg}|j\}|\}t| |||}|jj|dd}|||g d S )NZnumba_dict_dump)re   )	r   rf   rg   r[   rK   rx   rh   ri   rj   )	rF   rG   rO   rK   rl   rP   rQ   ru   rt   r    r    r!   rT     s    z_dict_dump.<locals>.codegen)r   r   )rV   rQ   r   rO   rT   r    r    r!   
_dict_dump  s    r   c                s8   t t jt |jg  |||} fdd}||fS )zGWrap numba_dict_lookup

    Returns 2-tuple of (intp, ?value_type)
    c          	      sN  t tttttg}|j\}}}|\}}	}
|jj|dd}| j	| }| j	|j
 }|||	}t||}| |j
}t||}t| |||}|||t|||
t||g}|d||ttj}| ||j
}t||}||@ |||}| j||j
| | ||j
|}||| W d Q R X ||}|  | ||gS )NZnumba_dict_lookup)re   z>=)!r   rf   r   r[   r   r   rK   rh   ri   r   r   r   r   r   r   r   rx   rj   rz   rC   r@   rA   r   r   make_optional_nonerB   r   rL   rM   make_optional_valuer   r]   
make_tuple)rF   rG   rO   rK   rl   rP   r   r   rQ   r-   r   rt   r   r   r   r   r   r   ru   ixfoundoutpoutr   Zloaded)r   r    r!   rT   7  s:    


z_dict_lookup.<locals>.codegen)r   Tupler   r   r   )rV   rQ   r-   r   rO   rT   r    )r   r!   _dict_lookup.  s    +r   c                sD   t |j|jg t t jt  g}||} fdd}||fS )zWrap numba_dict_popitem
    c          	      s:  t ttttg}|\}|j\}|jj|dd}| j|j	 }| j|j
 }	t|| }
t||	 }t| |||}|||t||
t||g}| | }t||}|d||ttj}||J |||
}|	||}| | ||g}| | |}||| W d Q R X ||}t|||gS )NZnumba_dict_popitem)re   z==)r   rf   r   r[   r   rK   rh   ri   r   r   r   r   r   r   rx   rj   rz   r   r   rC   r@   rA   r"   r(   rB   r   r   r   r   r]   Zpack_struct)rF   rG   rO   rK   rl   rQ   rP   rt   r   r   r   r   ru   rH   r   r   Zcondr-   r   keyvalZ	optkeyval)keyvaltyr    r!   rT   n  s6    
z_dict_popitem.<locals>.codegen)r   r   r   r   r   r   )rV   rQ   r   rO   rT   r    )r   r!   _dict_popiteme  s
    &r   c             C   s$   t j}|||t j}dd }||fS )zWrap numba_dict_delitem
    c             S   s\   t ttttg}|\}}}|j\}}	}
|jj|dd}t	| |||}|
||||g}|S )NZnumba_dict_delitem)re   )r   rf   r   r[   r   r   rK   rh   ri   rx   rj   )rF   rG   rO   rK   rl   rQ   hkr   rP   ZthkZtixrt   ru   rH   r    r    r!   rT     s    
z_dict_delitem.<locals>.codegen)r   r   r   )rV   rQ   r   r   r   rO   rT   r    r    r!   _dict_delitem  s    r   c                s    fdd}|S )z`The common codegen for iterator intrinsics.

    Populates the iterator struct and increfs.
    c                s@   |\}|j \}| | }||_|jd |_t| | | S )N)rK   make_helperr>   r?   r@   r   r^   )rF   rG   rO   rK   rQ   rP   Z
iterhelper)r   r    r!   rT     s    z"_iterator_codegen.<locals>.codegenr    )r   rT   r    )r   r!   _iterator_codegen  s    r   c             C   s"   t |}||}t|}||fS )z$Get dictionary iterator for .items())r   r   r   )rV   rQ   r   rO   rT   r    r    r!   _dict_items  s    
r   c             C   s"   t |}||}t|}||fS )z#Get dictionary iterator for .keys())r   r   r   )rV   rQ   r   rO   rT   r    r    r!   
_dict_keys  s    
r   c             C   s"   t |}||}t|}||fS )z%Get dictionary iterator for .values())r   r   r   )rV   rQ   r   rO   rT   r    r    r!   _dict_values  s    
r   c                s0   t |j|j  fdd} |||}||fS )zMake a dictionary struct with the given *ptr*

    Parameters
    ----------
    keyty, valty: Type
        Type of the key and value, respectively.
    ptr : llvm pointer value
        Points to the dictionary object.
    c                s   |\}}}t  }|| |}||_| | tj}t| |j}	| j	
|| tj||	}
| j	||
}||t }||| |
|_| S )N)r   rN   r2   r   rn   r   r4   rv   rh   rL   Zmeminfo_alloc_dtorr   ro   rY   rZ   r[   r\   r   r1   r^   )rF   rG   r   rK   r`   rk   rR   rS   Z
alloc_sizeZdtorr1   ra   )rw   r    r!   rT     s     


z_make_dict.<locals>.codegen)r   r   rX   )rV   r   r   rk   rT   rO   r    )rw   r!   
_make_dict  s    r   c                s@   t t| t t|t gr$td| |   fdd}|S )zsCreates a new dictionary with *key* and *value* as the type
    of the dictionary key and value, respectively.
    z.expecting *key* and *value* to be a numba Typec                s&   t  }t|  t |}|S )N)r   r   r   )r-   r.   ru   rQ   )r   r   r    r!   imp  s    
zimpl_new_dict.<locals>.imp)anyrU   r   r   )r-   r.   r   r    )r   r   r!   impl_new_dict	  s    

r   c             C   s   t | tjsdS dd }|S )zlen(dict)
    Nc             S   s   t | S )N)r   )rQ   r    r    r!   impl&  s    zimpl_len.<locals>.impl)rU   r   r   )rQ   r   r    r    r!   impl_len  s    r   c                s0   t | tjsd S | j| j   fdd}|S )Nc                sb   t | }t |}t| |t||}|tjkr4d S |tjkrBd S |tjkrVtdntdd S )Nzkey comparison failedz$dict.__setitem__ failed unexpectedly)	r   r   hashr"   r(   r)   r+   
ValueErrorrE   )rQ   r-   r.   	castedkeyZ	castedvalrH   )r   r   r    r!   r   3  s    





zimpl_setitem.<locals>.impl)rU   r   r   r   r   )rQ   r-   r.   r   r    )r   r   r!   impl_setitem,  s
    r   getc                s8   t | tjsd S | j | j}t|| d fdd	}|S )Nc                s0   t | }t| |t|\}}|tjkr,|S |S )N)r   r   r   r   r   )dctr-   r~   r   r   r   )r   r    r!   r   L  s
    

zimpl_get.<locals>.impl)N)rU   r   r   r   r   r   )r   r-   r~   r   r   r    )r   r!   impl_getD  s    
r   c                s&   t | tjsd S | j  fdd}|S )Nc                sP   t | }t| |t|\}}|tjkr0t n|tjk rDtdnt|S d S )Nz!internal dict error during lookup)r   r   r   r   r   KeyErrorr   r   )rQ   r-   r   r   r   )r   r    r!   r   ]  s    



zimpl_getitem.<locals>.impl)rU   r   r   r   )rQ   r-   r   r    )r   r!   impl_getitemV  s
    
r   popitemc             C   s   t | tjsd S dd }|S )Nc             S   s<   t | \}}|tjkrt|S |tjkr0t ntdd S )Nz"internal dict error during popitem)r   r"   r(   r   r*   r   r   )rQ   rH   r   r    r    r!   r   o  s    

zimpl_popitem.<locals>.impl)rU   r   r   )rQ   r   r    r    r!   impl_popitemj  s    	r   popc                sF   t | tjsd S | j | j}t |tjt|| d fdd	}|S )Nc                sx   t | }t|}t| ||\}}|tjkr>r8t qt|S n6|tjk rRtdn"t| ||}|tj	krptd|S d S )Nz!internal dict error during lookupz"internal dict error during delitem)
r   r   r   r   r   r   r   r   r"   r(   )r   r-   r~   r   Zhashedr   r   rH   )r   should_raiser    r!   r     s    




zimpl_pop.<locals>.impl)N)rU   r   r   r   r   r}   r   )r   r-   r~   r   r   r    )r   r   r!   impl_pop{  s    
r   c             C   s   t | tjsd S dd }|S )Nc             S   s   |  | d S )N)r   )rQ   kr    r    r!   r     s    zimpl_delitem.<locals>.impl)rU   r   r   )rQ   r   r   r    r    r!   impl_delitem  s    r   c                s&   t | tjsd S | j  fdd}|S )Nc                s(   t | }t| |t|\}}|tjkS )N)r   r   r   r   r   )rQ   r   r   r   )r   r    r!   r     s    
zimpl_contains.<locals>.impl)rU   r   r   r   )rQ   r   r   r    )r   r!   impl_contains  s
    r   clearc             C   s   t | tjsd S dd }|S )Nc             S   s   xt | r|   qW d S )N)lenr   )rQ   r    r    r!   r     s    
zimpl_clear.<locals>.impl)rU   r   r   )rQ   r   r    r    r!   
impl_clear  s    r   copyc                s0   t | tjsd S | j| j   fdd}|S )Nc                s,   t  }x|  D ]\}}|||< qW |S )N)r/   items)rQ   Znewdr   v)r   val_typer    r!   r     s    
zimpl_copy.<locals>.impl)rU   r   r   r   r   )rQ   r   r    )r   r   r!   	impl_copy  s
    r   
setdefaultc             C   s   t | tjsd S ddd}|S )Nc             S   s   || kr|| |< | | S )Nr    )r   r-   r~   r    r    r!   r     s    zimpl_setdefault.<locals>.impl)N)rU   r   r   )r   r-   r~   r   r    r    r!   impl_setdefault  s    
r   r   c             C   s   t | tjsd S dd }|S )Nc             S   s   t | }|S )N)r   )rQ   itr    r    r!   r     s    zimpl_items.<locals>.impl)rU   r   r   )rQ   r   r    r    r!   
impl_items  s    r   keysc             C   s   t | tjsd S dd }|S )Nc             S   s   t | S )N)r   )rQ   r    r    r!   r     s    zimpl_keys.<locals>.impl)rU   r   r   )rQ   r   r    r    r!   	impl_keys  s    r   valuesc             C   s   t | tjsd S dd }|S )Nc             S   s   t | S )N)r   )rQ   r    r    r!   r     s    zimpl_values.<locals>.impl)rU   r   r   )rQ   r   r    r    r!   impl_values  s    r   c                s>   t | tjsd S t |tjs(dd }|S |j  fdd}|S )Nc             S   s   dS )NFr    )dadbr    r    r!   impl_type_mismatch  s    z&impl_equal.<locals>.impl_type_mismatchc                sf   t | t |krdS xL|  D ]@\}}t| }t||t|\}}|tjkrRdS ||krdS qW dS )NFT)r   r   r   r   r   r   r   )r   r   ZkaZvaZkbr   Zvb)
otherkeytyr    r!   impl_type_matched  s    

z%impl_equal.<locals>.impl_type_matched)rU   r   r   r   )r   r   r   r   r    )r   r!   
impl_equal  s    r   c             C   s   t | tjsd S dd }|S )Nc             S   s
   | |k S )Nr    )r   r   r    r    r!   r     s    zimpl_not_equal.<locals>.impl)rU   r   r   )r   r   r   r    r    r!   impl_not_equal  s    r  Zgetiterc             C   s   |j d }| ||j|d }tt ttg}|jj	|dd}t
t
j}|tjd }	ttd|	 }
tj||
dd}t|||_t| ||j|j}|||j|g t| ||j| S )z6Implement iter() for .keys(), .values(), .items()
    r   numba_dict_iter)re   dict_iter_sizeof   T)r   )rK   r   iterator_typer   rf   rg   ll_dictiter_typer[   rh   ri   ctypes	CFUNCTYPEc_size_tr   	c_helpers	ArrayTyper   r   r   rz   r?   rx   r>   rj   r   r   r^   )rF   rG   rO   rK   
iterabletyr   rl   rt   protodictiter_sizeof
state_typepstateru   r    r    r!   impl_iterable_getiter%  s$    

r  c             C   s   |j \}|\}t|}| ||j}tt tt	g}|j
j|dd}	ttj}
|
tjd }ttd| }tj||dd}t|||_||_t| ||j|d }||	|j|g t| ||j| S )zBImplement iter(Dict).  Semantically equivalent to dict.keys()
    r  )re   r  r  T)r   r   )rK   r   r   r   r  r   rf   rg   r  r[   rh   ri   r  r  r	  r   r
  r  r   r   r   rz   r?   r>   rx   rj   r   r   r^   )rF   rG   rO   rK   rP   rQ   r  r   rl   rt   r  r  r  r  ru   r    r    r!   impl_dict_getiterF  s*    

r  iternextc          	   C   s  |j d }| |||d }t }ttt||g}|jj|dd}	t	
|t}
t	
|t}||	|j|
|f}|d||d}|| || |j}|jj\}}| j| }| j| }|||
|  }||||  }|||}|||}t|jtr:| ||||g}|| nDt|jtrT|| n*t|jtrn|| nt d!|jW d Q R X d S )Nr   Znumba_dict_iter_next)re   z==zunknown type: {})"rK   r   r   r\   r   rf   r   rh   ri   r   r   rj   r?   Zicmp_unsignedr@   Z	set_validrB   
yield_typer>   Zkeyvalue_typer   rZ   r]   r   r   rU   iterabler   r   Zyield_r   r   r   rc   )rF   rG   rO   rK   resultZ	iter_typer   Z	p2p_bytesZiternext_fntyr  Zkey_raw_ptrZval_raw_ptrrH   Zis_validr  Zkey_tyZval_tyr   r   Zkey_ptrZval_ptrr-   r   tupr    r    r!   impl_iterator_iternexth  sF    



r  )N)N)N)kr   r  r   enumr   Zllvmliter   Znumbar   r   Znumba.targets.registryr   Znumba.extendingr   r   r	   r
   r   r   Znumba.targets.imputilsr   r   Znumba.typesr   r   r   r   r   r   Znumba.typeconvr   r   Znumba.errorsr   r   ry   r[   r  r   Zint32_tr   Zintp_tr   r   r   ZMemInfoPointerr4   r3   r   r"   r/   ZStructModelr0   r=   rJ   rW   rd   rm   rv   rx   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   setitemr   r   getitemr   r   r   delitemr   containsr   r   r   r   r   r   r   r   r   ner  r  r  r  r    r    r    r!   <module>   s     
		#)3H+72			)





"
