o
    1&iP                     @   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	 ddl
mZ ddlmZ ddlmZmZmZmZ dZer:d	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)
_helperlibjittypedtypes)	IS_32BITS)UniTupleModel)register_modeltypeof_implunboxoverload      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   DC:\wamp64\www\opt\env\Lib\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__+      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   sB   t | }| jt|| j | |\}}|tkrt|	 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 | |st|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 y   Y d S w r   )r-   )r   r&   r   r   r   getD   s
   
zDict.getc                 C      t | S r   )DictIterr   r   r   r   itemsJ   r    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   ]      zDict.dict_lengthc                 C   s.   t |}| j| j|||}| j|d d S r:   )hashr   numba_dict_insert_ezr   assertGreaterEqual)r   	key_bytes	val_byteshashvalrA   r   r   r   r%   `   s
   
zDict.dict_insertc                 C   s@   t |}t| j}| j| j|||}| j|t ||j	fS r   )
rD   r;   create_string_bufferr   r   numba_dict_lookupr   rF   r,   value)r   rG   rI   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,   rD   r   numba_dict_delitemr   r#   )r   rG   r/   ZoldvalrI   rA   r   r   r   r2   p   s   zDict.dict_delitemc                 C   sZ   t | j}t | j}| j| j||}|dkr'|dkr!td| jd |j	|j	fS )Nr   popitem(): dictionary is emptyUnknown)
r;   rJ   r   r   r   numba_dict_popitemr   r-   Z_failrL   )r   rG   rH   rA   r   r   r   r8   y   s   zDict.dict_popitemc                 C   s   | j || j d S r   )r   numba_dict_iterr   )r   itptrr   r   r   	dict_iter      zDict.dict_iterc                 C   s   t d}t d}| j|t |t |}|dkr td|dkr&d 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 )Nr   zdictionary mutatedzkey not aligned)msgzval not aligned)r;   r<   r   numba_dict_iter_nextr>   
ValueErrorrF   r#   rL   ALIGNc_charr   from_addressr   )r   rS   r(   r)   rA   keyvalr   r   r   dict_iter_next   s   

zDict.dict_iter_nextN)__name__
__module____qualname____doc__r   r   r   r*   r1   r3   r4   r7   r9   r   r   r%   r+   r2   r8   rT   r`   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 )	r6   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 r:   )
parentr   numba_dict_iter_sizeofr;   c_char_pZit_state_bufcastr<   itrT   )r   re   Zitsizer   r   r   r      s
   zDictIter.__init__c                 C   s   | S r   r   r   r   r   r   __iter__      zDictIter.__iter__c                 C   s2   | j | j}|d u rt|\}}| | fS r   )re   r`   ri   StopIterationr.   )r   outr&   r'   r   r   r   __next__   s
   zDictIter.__next__N)ra   rb   rc   rd   r   rj   rn   nextr   r   r   r   r6      s    r6   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J 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)r   tupr   r   r   r      s   zParametrized.__init__N)ra   rb   rc   rd   r   r   r   r   r   rp      s    rp   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 )Nrw   )superrw   r   r   unicode_typedtyper$   n)r   rL   	__class__r   r   r      s   zParametrizedType.__init__c                 C      | j S r   r{   r   r   r   r   r^      s   zParametrizedType.keyc                 C   r~   r   r   r   r   r   r   r      s   zParametrizedType.__len__)	ra   rb   rc   rd   r   propertyr^   r   __classcell__r   r   r|   r   rw      s    
rw   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|g|R  }|tj|  S r   )r;   	CFUNCTYPEr   Z	c_helpers)namerestypeargtypesprotor   r   r   wrap   s   z TestDictImpl.setUp.<locals>.wrapZ	test_dictZdict_new_sizedZ	dict_freeNr   Zdict_insert_ezr+   r2   r8   Zdict_iter_sizeofrT   r`   )r   )r;   r<   	c_ssize_tc_intnumba_test_dictPOINTERr=   r   rB   rg   rE   rK   rM   rQ   c_size_trf   rR   rY   )r   Zdict_tZiter_tZhash_tr   r   r   r   setUp   s   





zTestDictImpl.setUpc                 C   s   |   }| |d d S r:   )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$   assertIsNoner4   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 ]}| ||| || q+d S )Nr   c                 S   
   d | S )Nz	key_{:04}formatr'   r   r   r   make_key     
z3TestDictImpl.check_insertion_many.<locals>.make_keyc                 S   r   )Nz	val_{:04}r   r   r   r   r   make_val  r   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 d    n1 sw   Y  |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   r4   assertRaisesr-   r   r   r   r   test_deletion_small  s:   z TestDictImpl.test_deletion_smallr   c                 C   s  t | t| dd}i }dd }dd }t|D ]
}	||	|||	< qt|D ]}	||	}
||	}|||
< | ||
 | q(| t|| t t||}| }t	|ddD ]\}	}
||
= ||
= | t|||	  qY| t|||  |D ]
}
| 
||
 qz|D ]}
| ||
 ||
  qt|D ]}	|||	 }
|||	 }|||
< |||
< q| t|t| |D ]}
| ||
 ||
  qd S )Nr   c                 S   r   Nzk_{:06x}r   r   r   r   r   r     r   z4TestDictImpl.check_delete_randomly.<locals>.make_keyc                 S   r   Nzv_{:06x}r   r   r   r   r   r     r   z4TestDictImpl.check_delete_randomly.<locals>.make_valr   )start)randomseedr   r   r#   r$   samplelistcopy	enumerater   r4   )r   r   ndropnrefillr   r   keysr   r   r   r&   r'   droplistZremainr   r   r   check_delete_randomly  sB   

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   sN  d}t | dd}dd }dd }t|D ]
}|||||< q| t|| | \}}| t||d  | ||t| | ||t| t|r{t|}| \}}| t||d  | ||t| | ||t| t|sO| t|d | t}	|  W d    n1 sw   Y  | d	t|	j	 d S )
Nr   r   c                 S   r   r   r   r   r   r   r   r     r   z+TestDictImpl.test_popitem.<locals>.make_keyc                 S   r   r   r   r   r   r   r   r     r   z+TestDictImpl.test_popitem.<locals>.make_valr   r   rO   )
r   r   r#   r$   r9   r   r-   ZassertInrr   	exception)
r   r   r   r   r   r   r&   r'   r{   Zraisesr   r   r   test_popitem  s4   
zTestDictImpl.test_popitemc                    s   t | dd}d dd } fdd}t D ]
}|||||< qt| D ]\}\}}| ||| | ||| q'd S )Nr   i  c                 S   r   Nz{:04}r   r   r   r   r   r   <  r   z.TestDictImpl.test_iter_items.<locals>.make_keyc                    s   d |   S r   r   r   r   r   r   r   ?  rC   z.TestDictImpl.test_iter_items.<locals>.make_valr   r   r   r7   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 ]\}\}}	| ||| | |||	 q(d S )Nc                    s   d |  d   S )N{:0{}}r   r   )r?   r   r   r   N  rU   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 }dd  t dd }td	d	d
 fdd}tdtd}}||| |	   |
  |j  tdD ]
}| ||| qOdS )z*https://github.com/numba/numba/issues/6401c                 S   r5   r   )rw   )r_   cr   r   r   typeof_unitf  s   z:TestDictImpl.test_parameterized_types.<locals>.typeof_unitc                 S   s   | t| jt| |S r   )r   r   ZUniTuplerz   r$   )typobjcontextr   r   r   unbox_parametrizedj  s   zATestDictImpl.test_parameterized_types.<locals>.unbox_parametrizedc                 S   s   J r   r   r   r   r   r   dict_vs_cache_vs_parametrizedn  rk   zLTestDictImpl.test_parameterized_types.<locals>.dict_vs_cache_vs_parametrizedc                    s   |   fdd}|S )Nc                    s   t jtj }| |d< d S )Ndata)r   r   emptyr   ry   )r'   r   r   r   r   %objmode_vs_cache_vs_parametrized_implu  s   z~TestDictImpl.test_parameterized_types.<locals>.ol_dict_vs_cache_vs_parametrized.<locals>.objmode_vs_cache_vs_parametrized_implr   )r'   r   r   r   r    ol_dict_vs_cache_vs_parametrizedq  s   zOTestDictImpl.test_parameterized_types.<locals>.ol_dict_vs_cache_vs_parametrizedT)Znopythoncachec                    s    |   | d S r   r   )xyr   r   r   set_parametrized_data|  s   zDTestDictImpl.test_parameterized_types.<locals>.set_parametrized_data)ab)r   r   N)r	   rw   r   r
   registerrp   r   r   r   Z_make_finalizerZ_reset_overloadsZ	targetctxinitr   r   )r   r   r   r   r   r   r   iir   r   r   test_parameterized_typesa  s$   




	


z%TestDictImpl.test_parameterized_typesN)r   )ra   rb   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s      	
)7
"r   )rd   r;   r   Znumba.tests.supportr   Znumbar   r   r   r   Znumba.core.configr   Znumba.core.datamodel.modelsr   Znumba.extendingr	   r
   r   r   r,   r[   objectr   r6   tuplerp   Typerw   r   r   r   r   r   <module>   s      