B
     \C                 @   s   d Z ddlmZmZm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ZerXd	nd
ZG dd deZG dd deZG dd deZdS )z2
Testing C implementation of the numba dictionary
    )print_functionabsolute_importdivisionN   )TestCase)
_helperlib)	IS_32BITS      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   8lib/python3.7/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 )N)dict_length)r   r   r   r   __len__*   s    zDict.__len__c             C   sP   t | }t | }| jt|| j | jt|| j | || d S )N)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 )N)
r   r   r   r   r   r   dict_lookup
DKIX_EMPTYKeyErrordecode)r   r   r!   ixoldr   r   r   __getitem__4   s    zDict.__getitem__c             C   s6   t | }| jt|| j | |s2t|d S )N)r   r   r   r   r   r   dict_delitemr&   )r   r   r!   r   r   r   __delitem__=   s    
zDict.__delitem__c             C   s"   y| | S  t k
r   d S X d S )N)r&   )r   r   r   r   r   getC   s    zDict.getc             C   s   t | S )N)DictIter)r   r   r   r   itemsI   s    z
Dict.itemsc             C   s   |   \}}| | fS )N)dict_popitemr'   )r   r   r    r   r   r   popitemL   s    zDict.popitemc             C   s0   t  }| jt |||}| j|d |S )Nr   )ctypesc_void_pr   numba_dict_new_minsizebyrefr   )r   key_sizeval_sizer   statusr   r   r   r   T   s
    zDict.dict_new_minsizec             C   s   | j | jS )N)r   numba_dict_lengthr   )r   r   r   r   r   \   s    zDict.dict_lengthc             C   s.   t |}| j| j|||}| j|d d S )Nr   )hashr   numba_dict_insert_ezr   assertGreaterEqual)r   	key_bytes	val_byteshashvalr8   r   r   r   r   _   s    zDict.dict_insertc             C   s@   t |}t| j}| j| j|||}| j|t ||j	fS )N)
r:   r2   create_string_bufferr   r   numba_dict_lookupr   r<   r%   value)r   r=   r?   Zoldval_bytesr(   r   r   r   r$   f   s    zDict.dict_lookupc             C   sF   |  |\}}|tkrdS t|}| j| j||}| j|d dS )NFr   T)r$   r%   r:   r   numba_dict_delitemr   r   )r   r=   r(   Zoldvalr?   r8   r   r   r   r+   o   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   zpopitem(): dictionary is emptyZUnknown)
r2   r@   r   r   r   numba_dict_popitemr   r&   Z_failrB   )r   r=   r>   r8   r   r   r   r0   x   s    
zDict.dict_popitemc             C   s   | j || j d S )N)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)r2   r3   r   numba_dict_iter_nextr5   
ValueErrorr<   r   rB   ALIGNZc_charr   Zfrom_addressr   )r   rG   r!   r"   r8   keyvalr   r   r   dict_iter_next   s    


zDict.dict_iter_nextN)__name__
__module____qualname____doc__r   r   r   r#   r*   r,   r-   r/   r1   r   r   r   r$   r+   r0   rH   rQ   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 )	r.   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 )Nr   )
parentr   numba_dict_iter_sizeofr2   c_char_pZit_state_bufcastr3   itrH   )r   rV   Zitsizer   r   r   r      s
    zDictIter.__init__c             C   s   | S )Nr   )r   r   r   r   __iter__   s    zDictIter.__iter__c             C   s8   | j | j}|d krtn|\}}| | fS d S )N)rV   rQ   rZ   StopIterationr'   )r   outr   r    r   r   r   __next__   s
    zDictIter.__next__N)rR   rS   rT   rU   r   r[   r^   nextr   r   r   r   r.      s
   r.   c               @   sv   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S )TestDictImplc             C   s   t j}t j}t j}ddd}|dt j| _|dt jt |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 )N)r2   Z	CFUNCTYPEr   Z	c_helpers)nameZrestypeZargtypesprotor   r   r   wrap   s    z TestDictImpl.setUp.<locals>.wrapZ	test_dictr   Z	dict_freeNr   Zdict_insert_ezr$   r+   r0   Zdict_iter_sizeofrH   rQ   )r   )r2   r3   Z	c_ssize_tZc_intnumba_test_dictZPOINTERr4   r   r9   rX   r;   rA   rC   rE   Zc_size_trW   rF   rL   )r   Zdict_tZiter_tZhash_trc   r   r   r   setUp   sz    



	


zTestDictImpl.setUpc             C   s   |   }| |d d S )Nr   )rd   r   )r   Z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beefcafer   cafe0000cafe0001abce   cafe0002abcf   )r   r   r   assertIsNoner-   ZassertIsNotNone)r   dr   r   r   test_insertion_smallE  s&    z!TestDictImpl.test_insertion_smallc             C   s   t | dd}dd }dd }x4t|D ](}|||||< | t||d  q&W x(t|D ]}| ||| || q\W d S )Nr   c             S   s
   d | S )Nz	key_{:04})format)r    r   r   r   make_keyg  s    z3TestDictImpl.check_insertion_many.<locals>.make_keyc             S   s
   d | S )Nz	val_{:04})rr   )r    r   r   r   make_valj  s    z3TestDictImpl.check_insertion_many.<locals>.make_valr   )r   ranger   r   )r   nmaxrp   rs   rt   ir   r   r   check_insertion_manyc  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   )rv   r   	          !   i  i   i  i  i   i  )rx   )r   r   r   r   test_insertion_manyv  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 Q R X |d	= | |d | |d d | |d	 | t|d |d= | |d | |d | |d	 | t|d d S )Nr
   r   r   rg   rh   ri   rj   rl   rm   rn   rk   r   )r   r   r   ro   r-   assertRaisesr&   )r   rp   r   r   r   test_deletion_small  s8    z TestDictImpl.test_deletion_smallr   c             C   s  t | t| dd}i }dd }dd }x t|D ]}	||	|||	< q4W x8t|D ],}	||	}
||	}|||
< | ||
 | qVW | t|| t t||}| }x8t	|ddD ](\}	}
||
= ||
= | t|||	  qW | t|||  x|D ]}
| 
||
 qW x"|D ]}
| ||
 ||
  q"W x:t|D ].}	|||	 }
|||	 }|||
< |||
< qJW | t|t| x"|D ]}
| ||
 ||
  qW d S )Nr   c             S   s
   d | S )Nzk_{:06x})rr   )r    r   r   r   rs     s    z4TestDictImpl.check_delete_randomly.<locals>.make_keyc             S   s
   d | S )Nzv_{:06x})rr   )r    r   r   r   rt     s    z4TestDictImpl.check_delete_randomly.<locals>.make_valr   )start)randomseedr   ru   r   r   Zsamplelistcopy	enumeratero   r-   )r   rv   ndropnrefillr   rp   keysrs   rt   rw   r   r    Z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   rk   )rv   r   r      
   r{   d   2      c   i   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   i   )rv   r   r   )r   )r   r   r   r   test_delete_randomly_large  s    z'TestDictImpl.test_delete_randomly_largec       
   	   C   s<  d}t | dd}dd }dd }x t|D ]}|||||< q*W | t|| | \}}| t||d  | ||t| | ||t| x\t|rt|}| \}}| t||d  | ||t| | ||t| qW | t|d | t}	|  W d Q R X | d	t|	j	 d S )
Nr   r   c             S   s
   d | S )Nzk_{:06x})rr   )r    r   r   r   rs     s    z+TestDictImpl.test_popitem.<locals>.make_keyc             S   s
   d | S )Nzv_{:06x})rr   )r    r   r   r   rt     s    z+TestDictImpl.test_popitem.<locals>.make_valr   r   zpopitem(): dictionary is empty)
r   ru   r   r   r1   r   r&   ZassertInstrZ	exception)
r   rv   rp   rs   rt   rw   r   r    nZraisesr   r   r   test_popitem  s.    
zTestDictImpl.test_popitemc                s   t | dd}d dd } fdd}x t D ]}|||||< q.W x<t| D ],\}\}}| ||| | ||| qTW d S )Nr
   i  c             S   s
   d | S )Nz{:04})rr   )r    r   r   r   rs   !  s    z.TestDictImpl.test_iter_items.<locals>.make_keyc                s   d |   S )Nz{:04})rr   )r    )rv   r   r   rt   $  s    z.TestDictImpl.test_iter_items.<locals>.make_val)r   ru   r   r/   r   )r   rp   rs   rt   rw   r   r    r   )rv   r   test_iter_items  s    zTestDictImpl.test_iter_itemsc       
         s   t |  } fdd}fdd}x tD ]}|||||< q0W x<t| D ],\}\}}	| ||| | |||	 qVW d S )Nc                s   d |  d   S )Nz{:0{}})rr   )r    )r6   r   r   rs   3  s    z+TestDictImpl.check_sizing.<locals>.make_keyc                s   d  |  d d  S )Nz{:0{}}r   )rr   )r    )rv   r7   r   r   rt   6  s    z+TestDictImpl.check_sizing.<locals>.make_val)r   ru   r   r/   r   )
r   r6   r7   rv   rp   rs   rt   rw   r   r    r   )r6   rv   r7   r   check_sizing/  s    zTestDictImpl.check_sizingc             C   s,   x&t ddD ]}| j||d| d qW d S )Nr   r   rk   )r6   r7   rv   )ru   r   )r   rw   r   r   r   test_sizingA  s    zTestDictImpl.test_sizingN)r   )rR   rS   rT   re   rf   rq   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r`      s    )
7
"r`   )rU   Z
__future__r   r   r   r2   r   Zsupportr   Znumbar   Znumba.configr   r%   rN   objectr   r.   r`   r   r   r   r   <module>   s    