U
    9%eM                     @   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   X/var/www/html/Darija-Ai-API/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 mutatedz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   zA 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|rt|}| \}}| 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 ]}| ||| qd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    