U
    iâËdéM  ã                   @   sÎ   d Z ddlZddlZddlmZ ddl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 dZertd	nd
ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ de
jƒZG dd„ deƒZdS )z2
Testing C implementation of the numba dictionary
é    N)ÚTestCase)Úgenerated_jitÚ
_helperlibÚjitÚtypedÚtypes)Ú	IS_32BITS)ÚUniTupleModel)Úregister_modelÚtypeof_implÚunboxéÿÿÿÿé   é   c                   @   s˜   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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$S )%ÚDictzWA wrapper around the C-API to provide a minimal dictionary object for
    testing.
    c                 C   s$   || _ || _|| _|  ||¡| _dS )zÀ
        Parameters
        ----------
        tc : TestCase instance
        keysize : int
            byte size for the key
        valsize : int
            byte size for the value
        N)ÚtcÚkeysizeÚvalsizeÚdict_new_minsizeÚdp)Úselfr   r   r   © r   úR/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_dictimpl.pyÚ__init__   s    
zDict.__init__c                 C   s   | j  | j¡ d S ©N)r   Únumba_dict_freer   ©r   r   r   r   Ú__del__(   s    zDict.__del__c                 C   s   |   ¡ S r   )Údict_lengthr   r   r   r   Ú__len__+   s    zDict.__len__c                 C   sP   t | ¡ ƒ}t | ¡ ƒ}| j t|ƒ| j¡ | j t|ƒ| j¡ |  ||¡ d S r   )ÚbytesÚencoder   ÚassertEqualÚlenr   r   Údict_insert)r   ÚkÚvÚbkÚbvr   r   r   Ú__setitem__.   s
    zDict.__setitem__c                 C   sH   t | ¡ ƒ}| j t|ƒ| j¡ |  |¡\}}|tkr<t‚n| 	¡ S d S r   )
r    r!   r   r"   r#   r   Údict_lookupÚ
DKIX_EMPTYÚKeyErrorÚdecode)r   r%   r'   ÚixÚoldr   r   r   Ú__getitem__5   s    zDict.__getitem__c                 C   s6   t | ¡ ƒ}| j t|ƒ| j¡ |  |¡s2t|ƒ‚d S r   )r    r!   r   r"   r#   r   Údict_delitemr,   )r   r%   r'   r   r   r   Ú__delitem__>   s    
zDict.__delitem__c                 C   s&   z
| | W S  t k
r    Y d S X d S r   )r,   )r   r%   r   r   r   ÚgetD   s    
zDict.getc                 C   s   t | ƒS r   )ÚDictIterr   r   r   r   ÚitemsJ   s    z
Dict.itemsc                 C   s   |   ¡ \}}| ¡ | ¡ fS r   )Údict_popitemr-   )r   r%   r&   r   r   r   ÚpopitemM   s    zDict.popitemc                 C   s2   t  ¡ }| j t  |¡d||¡}| j |d¡ |S ©Nr   )ÚctypesÚc_void_pr   Únumba_dict_new_sizedÚbyrefr"   )r   Úkey_sizeÚval_sizer   Ústatusr   r   r   r   U   s       ÿzDict.dict_new_minsizec                 C   s   | j  | j¡S r   )r   Únumba_dict_lengthr   r   r   r   r   r   ]   s    zDict.dict_lengthc                 C   s.   t |ƒ}| j | j|||¡}| j |d¡ d S r8   )Úhashr   Únumba_dict_insert_ezr   ÚassertGreaterEqual)r   Ú	key_bytesÚ	val_bytesÚhashvalr?   r   r   r   r$   `   s       ÿzDict.dict_insertc                 C   s@   t |ƒ}t | j¡}| j | j|||¡}| j |t¡ ||j	fS r   )
rA   r9   Úcreate_string_bufferr   r   Únumba_dict_lookupr   rC   r+   Úvalue)r   rD   rF   Zoldval_bytesr.   r   r   r   r*   g   s       ÿzDict.dict_lookupc                 C   sF   |   |¡\}}|tkrdS t|ƒ}| j | j||¡}| j |d¡ dS )NFr   T)r*   r+   rA   r   Únumba_dict_delitemr   r"   )r   rD   r.   ZoldvalrF   r?   r   r   r   r1   p   s    zDict.dict_delitemc                 C   s\   t  | j¡}t  | j¡}| j | j||¡}|dkrP|dkrDtdƒ‚n| j d¡ |j	|j	fS )Nr   éüÿÿÿúpopitem(): dictionary is emptyÚUnknown)
r9   rG   r   r   r   Únumba_dict_popitemr   r,   Z_failrI   )r   rD   rE   r?   r   r   r   r6   y   s    
zDict.dict_popitemc                 C   s   | j  || j¡ d S r   )r   Únumba_dict_iterr   )r   Úitptrr   r   r   Ú	dict_iter„   s    zDict.dict_iterc                 C   sÄ   t  d¡}t  d¡}| j |t  |¡t  |¡¡}|dkrBtdƒ‚n~|dkrNd S | j |d¡ | jj|jt	 ddd� | jj|jt	 ddd� t j
| j  |j¡}t j
| j  |j¡}|j|jfS d S )Nr   éþÿÿÿzdictionary mutatedéýÿÿÿzkey not aligned)Úmsgzval not aligned)r9   r:   r   Únumba_dict_iter_nextr<   Ú
ValueErrorrC   r"   rI   ÚALIGNZc_charr   Zfrom_addressr   )r   rP   r'   r(   r?   ÚkeyÚvalr   r   r   Údict_iter_next‡   s"    

  ÿ
zDict.dict_iter_nextN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r)   r0   r2   r3   r5   r7   r   r   r$   r*   r1   r6   rQ   rZ   r   r   r   r   r      s$   			r   c                   @   s,   e Zd ZdZdd„ Zdd„ Zdd„ ZeZdS )	r4   z�A iterator for the `Dict.items()`.

    Only the `.items()` is needed.  `.keys` and `.values` can be trivially
    implemented on the `.items` iterator.
    c                 C   sF   || _ | j j ¡ }tj| dƒ| _t | jtj¡| _| j  	| j¡ d S r8   )
Úparentr   Únumba_dict_iter_sizeofr9   Úc_char_pZit_state_bufÚcastr:   ÚitrQ   )r   r_   Zitsizer   r   r   r   ¥   s
    zDictIter.__init__c                 C   s   | S r   r   r   r   r   r   Ú__iter__¬   s    zDictIter.__iter__c                 C   s8   | j  | j¡}|d krt‚n|\}}| ¡ | ¡ fS d S r   )r_   rZ   rc   ÚStopIterationr-   )r   Úoutr%   r&   r   r   r   Ú__next__¯   s
    zDictIter.__next__N)r[   r\   r]   r^   r   rd   rg   Únextr   r   r   r   r4   Ÿ   s
   r4   c                   @   s   e Zd ZdZdd„ ZdS )ÚParametrizedz_supporting type for TestDictImpl.test_parametrized_types
    needs to be global to be cacheablec                 C   s   t dd„ |D ƒƒst‚d S )Nc                 s   s   | ]}t |tƒV  qd S r   )Ú
isinstanceÚstr)Ú.0r&   r   r   r   Ú	<genexpr>¾   s     z(Parametrized.__init__.<locals>.<genexpr>)ÚallÚAssertionError)r   Útupr   r   r   r   ½   s    zParametrized.__init__N)r[   r\   r]   r^   r   r   r   r   r   ri   º   s   ri   c                       s4   e Zd ZdZ‡ fdd„Zedd„ ƒZdd„ Z‡  ZS )ÚParametrizedTypezUthis is essentially UniTuple(unicode_type, n)
    BUT type name is the same for all nc                    s&   t t| ƒ d¡ tj| _t|ƒ| _d S )Nrq   )Úsuperrq   r   r   Úunicode_typeÚdtyper#   Ún)r   rI   ©Ú	__class__r   r   r   Å   s    zParametrizedType.__init__c                 C   s   | j S r   ©ru   r   r   r   r   rX   Ê   s    zParametrizedType.keyc                 C   s   | j S r   rx   r   r   r   r   r   Î   s    zParametrizedType.__len__)	r[   r\   r]   r^   r   ÚpropertyrX   r   Ú__classcell__r   r   rv   r   rq   Á   s
   
rq   c                   @   s~   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Z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S ) ÚTestDictImplc                 C   s$  t j}t j}t j}ddd„}|dt jƒ| _|dt jt  |¡t jt jt jgƒ| _|dd|gƒ| _|dt j|gƒ| _|d	t j|t j	|t j	gƒ| _
|d
t j|t j	|t j	gƒ| _|dt j||t jgƒ| _|dt j|t j	t j	gƒ| _|dt jƒ| _|dd||gƒ| _|dt j|t  t j¡t  t j¡gƒ| _dS )zEBind to the c_helper library and provide the ctypes wrapper.
        r   c                 S   s   t j|f|žŽ }|tj|  ƒS r   )r9   Z	CFUNCTYPEr   Z	c_helpers)ÚnameÚrestypeZargtypesÚprotor   r   r   ÚwrapÚ   s    z TestDictImpl.setUp.<locals>.wrapZ	test_dictZdict_new_sizedZ	dict_freeNr   Zdict_insert_ezr*   r1   r6   Zdict_iter_sizeofrQ   rZ   )r   )r9   r:   Z	c_ssize_tÚc_intÚnumba_test_dictZPOINTERr;   r   r@   ra   rB   rH   rJ   rN   Zc_size_tr`   rO   rU   )r   Zdict_tZiter_tZhash_tr   r   r   r   ÚsetUpÓ   s     
þ
üýýýüýüýýýýý
þþý

ýýzTestDictImpl.setUpc                 C   s   |   ¡ }|  |d¡ d S r8   )r�   r"   )r   Úretr   r   r   Útest_simple_c_test[  s    zTestDictImpl.test_simple_c_testc                 C   s  t | ddƒ}|  t|ƒd¡ |  | d¡¡ d|d< |  t|ƒd¡ |  | d¡¡ |  |d d¡ d|d< |  t|ƒd¡ |  |d d¡ d|d	< |  t|ƒd
¡ |  |d d¡ |  |d	 d¡ d|d< |  t|ƒd¡ |  |d d¡ |  |d	 d¡ |  |d d¡ d S )Nr   r   r   ÚabcdZbeefcafeé   Úcafe0000Úcafe0001Úabceé   Úcafe0002Úabcfé   )r   r"   r#   ÚassertIsNoner3   ZassertIsNotNone©r   Údr   r   r   Útest_insertion_small`  s&    z!TestDictImpl.test_insertion_smallc                 C   sx   t | ddƒ}dd„ }dd„ }t|ƒD ](}||ƒ|||ƒ< |  t|ƒ|d ¡ q$t|ƒD ]}|  |||ƒ ||ƒ¡ qVd S )Nr   c                 S   s
   d  | ¡S )Nz	key_{:04}©Úformat©r&   r   r   r   Úmake_key‚  s    z3TestDictImpl.check_insertion_many.<locals>.make_keyc                 S   s
   d  | ¡S )Nz	val_{:04}r’   r”   r   r   r   Úmake_val…  s    z3TestDictImpl.check_insertion_many.<locals>.make_valr†   )r   Úranger"   r#   )r   Únmaxr�   r•   r–   Úir   r   r   Úcheck_insertion_many~  s    z!TestDictImpl.check_insertion_manyc                 C   s”   | j dd� | j dd� | j dd� | j dd� | j dd� | j dd� | j dd� | j d	d� | j d
d� | j dd� | j dd� | j dd� d S )Né   ©r˜   r   é	   é   é    é!   iÿ  é   i  iÿ  i   i  )rš   r   r   r   r   Útest_insertion_many‘  s    z TestDictImpl.test_insertion_manyc              	   C   s†  t | ddƒ}|  t|ƒd¡ |  | d¡¡ d|d< d|d< d|d	< |  t|ƒd
¡ |  |d d¡ |  |d d¡ |  |d	 d¡ |  t|ƒd
¡ |d= |  | d¡¡ |  |d d¡ |  |d	 d¡ |  t|ƒd¡ |  t¡� |d= W 5 Q R X |d	= |  | d¡¡ |  |d d¡ |  | d	¡¡ |  t|ƒd¡ |d= |  | d¡¡ |  | d¡¡ |  | d	¡¡ |  t|ƒd¡ d S )Nr   r   r   r…   r‡   rˆ   r‰   r‹   rŒ   r�   rŠ   r†   )r   r"   r#   rŽ   r3   ÚassertRaisesr,   r�   r   r   r   Útest_deletion_small¤  s8    z TestDictImpl.test_deletion_smallr   c                 C   sš  t  |¡ t| ddƒ}i }dd„ }dd„ }t|ƒD ]}	||	ƒ|||	ƒ< q2t|ƒD ],}	||	ƒ}
||	ƒ}|||
< |  ||
 |¡ qP|  t|ƒ|¡ t  t|ƒ|¡}| ¡ }t	|dd�D ](\}	}
||
= ||
= |  t|ƒ||	 ¡ q²|  t|ƒ|| ¡ |D ]}
|  
| |
¡¡ qô|D ]}
|  ||
 ||
 ¡ �qt|ƒD ].}	|||	 ƒ}
|||	 ƒ}|||
< |||
< �q2|  t|ƒt|ƒ¡ |D ]}
|  ||
 ||
 ¡ �qzd S )Nr   c                 S   s
   d  | ¡S ©Nzk_{:06x}r’   r”   r   r   r   r•   Ô  s    z4TestDictImpl.check_delete_randomly.<locals>.make_keyc                 S   s
   d  | ¡S ©Nzv_{:06x}r’   r”   r   r   r   r–   ×  s    z4TestDictImpl.check_delete_randomly.<locals>.make_valr†   )Ústart)ÚrandomÚseedr   r—   r"   r#   ÚsampleÚlistÚcopyÚ	enumeraterŽ   r3   )r   r˜   ÚndropÚnrefillr©   r�   Úkeysr•   r–   r™   r%   r&   ÚdroplistZremainr   r   r   Úcheck_delete_randomlyÍ  s@    
z"TestDictImpl.check_delete_randomlyc                 C   st   | j dddd� | j dddd� | j ddd	d� | j dd
dd� | j dddd� | j dddd� | j dddd� d S )Nr   rŠ   ©r˜   r®   r¯   é   é
   rž   éd   é2   éÈ   éc   r¡   iç  r†   i   ©r²   r   r   r   r   Útest_delete_randomly  s    z!TestDictImpl.test_delete_randomlyc                 C   s   | j dddd� d S )Ni   i   r¡   r³   rº   r   r   r   r   Útest_delete_randomly_large  s    z'TestDictImpl.test_delete_randomly_largec           
   	   C   s4  d}t | ddƒ}dd„ }dd„ }t|ƒD ]}||ƒ|||ƒ< q(|  t|ƒ|¡ | ¡ \}}|  t|ƒ|d ¡ |  ||t|ƒƒ¡ |  ||t|ƒƒ¡ t|ƒrðt|ƒ}| ¡ \}}|  t|ƒ|d ¡ |  ||t|ƒƒ¡ |  ||t|ƒƒ¡ q–|  t|ƒd¡ |  t¡�}	| ¡  W 5 Q R X |  d	t|	j	ƒ¡ d S )
Nrµ   r   c                 S   s
   d  | ¡S r¥   r’   r”   r   r   r   r•     s    z+TestDictImpl.test_popitem.<locals>.make_keyc                 S   s
   d  | ¡S r¦   r’   r”   r   r   r   r–     s    z+TestDictImpl.test_popitem.<locals>.make_valr†   r   rL   )
r   r—   r"   r#   r7   r£   r,   ZassertInrk   Ú	exception)
r   r˜   r�   r•   r–   r™   r%   r&   ru   Zraisesr   r   r   Útest_popitem  s0    þzTestDictImpl.test_popitemc                    s€   t | ddƒ}d‰ dd„ }‡ fdd„}tˆ ƒD ]}||ƒ|||ƒ< q,t| ¡ ƒD ],\}\}}|  ||ƒ|¡ |  ||ƒ|¡ qNd S )Nr   iè  c                 S   s
   d  | ¡S ©Nz{:04}r’   r”   r   r   r   r•   <  s    z.TestDictImpl.test_iter_items.<locals>.make_keyc                    s   d  | ˆ  ¡S r¿   r’   r”   rœ   r   r   r–   ?  s    z.TestDictImpl.test_iter_items.<locals>.make_val©r   r—   r­   r5   r"   )r   r�   r•   r–   r™   r%   r&   r   rœ   r   Útest_iter_items7  s    zTestDictImpl.test_iter_itemsc           
         s‚   t | ˆ ˆƒ}‡ fdd„}‡‡fdd„}tˆƒD ]}||ƒ|||ƒ< q.t| ¡ ƒD ],\}\}}	|  ||ƒ|¡ |  ||ƒ|	¡ qPd S )Nc                    s   d  | ˆ ¡d ˆ … S )Nú{:0{}}r’   r”   )r=   r   r   r•   N  s    z+TestDictImpl.check_sizing.<locals>.make_keyc                    s   d  ˆ |  d ˆ¡d ˆ… S )NrÂ   r†   r’   r”   )r˜   r>   r   r   r–   Q  s    z+TestDictImpl.check_sizing.<locals>.make_valrÀ   )
r   r=   r>   r˜   r�   r•   r–   r™   r%   r&   r   )r=   r˜   r>   r   Úcheck_sizingJ  s    zTestDictImpl.check_sizingc                 C   s(   t ddƒD ]}| j||d| d� q
d S )Nr†   r   rŠ   )r=   r>   r˜   )r—   rÃ   )r   r™   r   r   r   Útest_sizing\  s    zTestDictImpl.test_sizingc                    s¬   t tƒtƒ t t¡dd„ ƒ}ttƒdd„ ƒ}tdd„ ƒ‰ tddd�‡ fd	d
„ƒ}tdƒtdƒ }}|||ƒ | 	¡ ƒ  | 
¡  |j ¡  tdƒD ]}|  |||ƒ¡ q’dS )z*https://github.com/numba/numba/issues/6401c                 S   s   t | ƒS r   )rq   )rY   Úcr   r   r   Útypeof_unitf  s    z9TestDictImpl.test_parametrized_types.<locals>.typeof_unitc                 S   s   |  t | jt| ƒ¡|¡S r   )r   r   ZUniTuplert   r#   )ÚtypÚobjÚcontextr   r   r   Úunbox_parametrizedj  s    z@TestDictImpl.test_parametrized_types.<locals>.unbox_parametrizedc                    s   | ‰ ‡ fdd„}|S )Nc                    s   t j tjˆ ¡}| |d< d S )NÚdata)r   r   Úemptyr   rs   )r&   r�   ©rÇ   r   r   Ú%objmode_vs_cache_vs_parametrized_implr  s    zzTestDictImpl.test_parametrized_types.<locals>.dict_vs_cache_vs_parametrized.<locals>.objmode_vs_cache_vs_parametrized_implr   )r&   rÎ   r   rÍ   r   Údict_vs_cache_vs_parametrizedn  s    zKTestDictImpl.test_parametrized_types.<locals>.dict_vs_cache_vs_parametrizedT)ZnopythonÚcachec                    s   ˆ | ƒ ˆ |ƒ d S r   r   )ÚxÚy©rÏ   r   r   Úset_parametrized_datay  s    zCTestDictImpl.test_parametrized_types.<locals>.set_parametrized_data)ÚaÚb)rÕ   r·   N)r
   rq   r	   r   Úregisterri   r   r   r   Z_make_finalizerZ_reset_overloadsZ	targetctxÚinitr—   rŽ   )r   rÆ   rÊ   rÔ   rÑ   rÒ   Úiir   rÓ   r   Útest_parametrized_typesa  s     




	


z$TestDictImpl.test_parametrized_typesN)r   )r[   r\   r]   r‚   r„   r‘   rš   r¢   r¤   r²   r»   r¼   r¾   rÁ   rÃ   rÄ   rÚ   r   r   r   r   r{   Ò   s    	)
7
"r{   )r^   r9   r¨   Znumba.tests.supportr   Znumbar   r   r   r   r   Znumba.core.configr   Znumba.core.datamodel.modelsr	   Znumba.extendingr
   r   r   r+   rW   Úobjectr   r4   Útupleri   ÚTyperq   r{   r   r   r   r   Ú<module>   s    