U
    iâËd?  ã                   @   sx   d Z ddlZddlZddlmZ ddlmZ dZdZdZ	dZ
dZ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 typed-list
é    N)ÚTestCase)Ú
_helperlibéÿÿÿÿéþÿÿÿéýÿÿÿéüÿÿÿéûÿÿÿ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edd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zd8d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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7S )9ÚListzQA wrapper around the C-API to provide a minimal list object for
    testing.
    c                 C   s   || _ || _|  ||¡| _dS )zÎ
        Parameters
        ----------
        tc : TestCase instance
        item_size : int
            byte size for the items
        allocated : int
            number of items to allocate for
        N)ÚtcÚ	item_sizeÚlist_newÚlp)Úselfr
   r   Ú	allocated© r   úR/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_listimpl.pyÚ__init__   s    
zList.__init__c                 C   s   | j  | j¡ d S ©N)r
   Únumba_list_freer   ©r   r   r   r   Ú__del__(   s    zList.__del__c                 C   s   |   ¡ S r   )Úlist_lengthr   r   r   r   Ú__len__+   s    zList.__len__c                 C   s   |   ||¡S r   )Úlist_setitem©r   ÚiÚitemr   r   r   Ú__setitem__.   s    zList.__setitem__c                 C   s
   |   |¡S r   )Úlist_getitem©r   r   r   r   r   Ú__getitem__1   s    zList.__getitem__c                 C   s   t | ƒS r   )ÚListIterr   r   r   r   Ú__iter__4   s    zList.__iter__c                 C   s   |   |¡ d S r   )Úlist_delitemr   r   r   r   Ú__delitem__7   s    zList.__delitem__c                 C   s6   |dk st | ƒdkrtdƒ n|dkr2t | ƒd }|S )Nr   r   úlist index out of rangeé   )ÚlenÚ
IndexErrorr   r   r   r   Úhandle_index:   s
    
zList.handle_indexc                 C   s   |   ¡ S r   )Úlist_allocatedr   r   r   r   r   C   s    zList.allocatedc                 C   s   |   ¡ S r   )Úlist_is_mutabler   r   r   r   Ú
is_mutableG   s    zList.is_mutablec                 C   s
   |   d¡S )Nr&   ©Úlist_set_is_mutabler   r   r   r   Úset_mutableK   s    zList.set_mutablec                 C   s
   |   d¡S ©Nr   r-   r   r   r   r   Úset_immutableN   s    zList.set_immutablec                 C   s   |   |¡ d S r   )Úlist_append)r   r   r   r   r   ÚappendQ   s    zList.appendr   c                 C   s
   |   |¡S r   )Úlist_popr   r   r   r   ÚpopT   s    zList.popc                 C   s0   t  ¡ }| j t  |¡||¡}| j |t¡ |S r   )ÚctypesÚc_void_pr
   Únumba_list_newÚbyrefÚassertEqualÚLIST_OK)r   r   r   r   Ústatusr   r   r   r   Y   s      ÿzList.list_newc                 C   s   | j  | j¡S r   )r
   Únumba_list_lengthr   r   r   r   r   r   a   s    zList.list_lengthc                 C   s   | j  | j¡S r   )r
   Únumba_list_allocatedr   r   r   r   r   r*   d   s    zList.list_allocatedc                 C   s   | j  | j¡S r   )r
   Únumba_list_is_mutabler   r   r   r   r   r+   g   s    zList.list_is_mutablec                 C   s   | j  | j|¡S r   )r
   Únumba_list_set_is_mutabler   )r   r,   r   r   r   r.   j   s    zList.list_set_is_mutablec                 C   sH   | j  | j||¡}|tkr$tdƒ‚n |tkr6tdƒ‚n| j  |t¡ d S )Nr%   úlist is immutable)	r
   Únumba_list_setitemr   ÚLIST_ERR_INDEXr(   ÚLIST_ERR_IMMUTABLEÚ
ValueErrorr:   r;   )r   r   r   r<   r   r   r   r   m   s    

zList.list_setitemc                 C   sR   |   |¡}t | j¡}| j | j||¡}|tkr:tdƒ‚n| j 	|t
¡ |jS d S )Nr%   )r)   r6   Úcreate_string_bufferr   r
   Únumba_list_getitemr   rC   r(   r:   r;   Úraw)r   r   Zitem_out_bufferr<   r   r   r   r   v   s    

zList.list_getitemc                 C   s2   | j  | j|¡}|tkr tdƒ‚| j  |t¡ d S )NrA   )r
   Únumba_list_appendr   rD   rE   r:   r;   )r   r   r<   r   r   r   r2   €   s    zList.list_appendc                 C   s"   |   |¡}|  |¡}|  |¡ |S r   )r)   r   r#   r   r   r   r   r4   †   s    


zList.list_popc                 C   s’   t |tƒrD| j | j|j|j|j¡}|tkr4t	dƒ‚| j 
|t¡ nJ|  |¡}| j | j|¡}|tkrptdƒ‚n|tkr€t	dƒ‚| j 
|t¡ d S )NrA   r%   )Ú
isinstanceÚslicer
   Únumba_list_delete_slicer   ÚstartÚstopÚsteprD   rE   r:   r;   r)   Únumba_list_delitemrC   r(   )r   r   r<   r   r   r   r#   �   s     

ý

zList.list_delitemc                 C   s   | j  || j¡ d S r   )r
   Únumba_list_iterr   )r   Úitptrr   r   r   Ú	list_iter¡   s    zList.list_iterc                 C   sj   t  d¡}| j |t  |¡¡}|tkr0tdƒ‚n6|tkr>t‚n(| j 	|d¡ t j
| j  |j¡}|jS d S )Nr   zlist mutated)r6   r7   r
   Únumba_list_iter_nextr9   ÚLIST_ERR_MUTATEDrE   ÚLIST_ERR_ITER_EXHAUSTEDÚStopIterationZassertGreaterEqualZc_charr   Zfrom_addressÚvalue)r   rR   Zbir<   r   r   r   r   Úlist_iter_next¤   s    
 ÿ
zList.list_iter_nextN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r    r"   r$   r)   Úpropertyr   r,   r/   r1   r3   r5   r   r   r*   r+   r.   r   r   r2   r4   r#   rS   rY   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!   z An iterator for the `List`.
    c                 C   sF   || _ | j j ¡ }tj| dƒ| _t | jtj¡| _| j  	| j¡ d S r0   )
Úparentr
   Únumba_list_iter_sizeofr6   Úc_char_pZit_state_bufÚcastr7   ÚitrS   )r   r_   Zitsizer   r   r   r   ¶   s
    zListIter.__init__c                 C   s   | S r   r   r   r   r   r   r"   ½   s    zListIter.__iter__c                 C   s   | j  | j¡S r   )r_   rY   rc   r   r   r   r   Ú__next__À   s    zListIter.__next__N)rZ   r[   r\   r]   r   r"   rd   Únextr   r   r   r   r!   ³   s
   r!   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„ 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 )$ÚTestListImplc                 C   s\  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|gƒ| _	|d
t j|gƒ| _
|dd|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|t jgƒ| _|dt j|t jt jt jgƒ| _|dt jƒ| _|dd||gƒ| _|d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   )r6   Z	CFUNCTYPEr   Z	c_helpers)ÚnameÚrestypeZargtypesÚprotor   r   r   ÚwrapÍ   s    z TestListImpl.setUp.<locals>.wrapZ	test_listr   Z	list_freeNr   r*   r+   r.   r   r2   r   r#   Zlist_delete_sliceZlist_iter_sizeofrS   rY   )r   )r6   r7   Úc_intÚnumba_test_listZPOINTERZ	c_ssize_tr8   r   r=   r>   r?   r@   ra   rB   rI   rG   rP   rL   Zc_size_tr`   rQ   rT   )r   Zlist_tZiter_trj   r   r   r   ÚsetUpÇ   s     
þýýýýýýýýýý	ýþþý	
þýzTestListImpl.setUpc                 C   s   |   ¡ }|  |d¡ d S r0   )rl   r:   )r   Úretr   r   r   Útest_simple_c_test4  s    zTestListImpl.test_simple_c_testc                 C   s    t | ddƒ}|  t|ƒd¡ d S ©Né   r   )r	   r:   r'   ©r   Úlr   r   r   Útest_length9  s    zTestListImpl.test_lengthc                 C   s<   t dƒD ].}t| d|ƒ}|  t|ƒd¡ |  |j|¡ qd S )Né   rq   r   )Úranger	   r:   r'   r   )r   r   rs   r   r   r   Útest_allocation=  s    zTestListImpl.test_allocationc                 C   s>   t | ddƒ}| d¡ |  t|ƒd¡ |d }|  |d¡ d S )Nrq   r&   ó   abcdefghr   ©r	   r3   r:   r'   ©r   rs   Úrr   r   r   Útest_append_get_stringC  s
    
z#TestListImpl.test_append_get_stringc                 C   sR   t | ddƒ}| t dd¡¡ |  t|ƒd¡ t d|d ¡d }|  |d¡ d S )Nrq   r&   Úqr   )r	   r3   ÚstructÚpackr:   r'   Úunpackrz   r   r   r   Útest_append_get_intJ  s
    z TestListImpl.test_append_get_intc                 C   sX   t | ddƒ}| d¡ |  t|ƒd¡ | d¡ |  t|ƒd¡ |d }|  |d¡ d S )Nrq   r&   rx   s   hijklmnoé   ry   rz   r   r   r   Útest_append_get_string_reallocQ  s    

z+TestListImpl.test_append_get_string_reallocc              	   C   sL   t | ddƒ}|  t¡� |d  W 5 Q R X |  t¡� d|d< W 5 Q R X d S )Nrq   r   rx   )r	   ÚassertRaisesr(   rr   r   r   r   Ú!test_set_item_getitem_index_errorZ  s
    z.TestListImpl.test_set_item_getitem_index_errorc                 C   s\   t | ddƒ}ddddddd	d
g}|D ]}| |¡ q$g }|D ]}| |¡ q<|  ||¡ d S )Nr&   r   ó   aó   bó   có   dó   eó   fó   gó   h)r	   r3   r:   )r   rs   Úvaluesr   ÚreceivedÚjr   r   r   Ú	test_itera  s    zTestListImpl.test_iterc                 C   s  t | ddƒ}ddddddd	d
g}|D ]}| |¡ q$|  t|ƒd¡ | ¡ }|  d
|¡ |  t|ƒd¡ dd„ |D ƒ}|  ||d d… ¡ | d¡}|  d|¡ |  t|ƒd¡ | d¡}|  d|¡ |  t|ƒd¡ ddddd	g}dd„ |D ƒ}|  ||¡ d S )Nr&   r   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rq   é   c                 S   s   g | ]}|‘qS r   r   ©Ú.0r�   r   r   r   Ú
<listcomp>u  s     z)TestListImpl.test_pop.<locals>.<listcomp>r   é   r‚   é   c                 S   s   g | ]}|‘qS r   r   r“   r   r   r   r•   �  s     ©r	   r3   r:   r'   r5   ©r   rs   rŽ   r   r�   Úexpectedr   r   r   Útest_popk  s&    

zTestListImpl.test_popc              	   C   s.   t | ddƒ}|  t¡� | ¡  W 5 Q R X d S rp   )r	   r„   r(   r5   rr   r   r   r   Útest_pop_index_error„  s    z!TestListImpl.test_pop_index_errorc                 C   s  t | ddƒ}ddddddd	d
g}|D ]}| |¡ q$|  t|ƒd¡ | ¡ }|  d|¡ |  t|ƒd¡ dd„ |D ƒ}|  ||d d… ¡ | d¡}|  d|¡ |  t|ƒd¡ | d¡}|  d|¡ |  t|ƒd¡ ddddd	g}dd„ |D ƒ}|  ||¡ d S )Né   r   s   aaaas   bbbbs   ccccs   dddds   eeees   ffffs   ggggs   hhhhhrq   s   hhhhr’   c                 S   s   g | ]}|‘qS r   r   r“   r   r   r   r•   ”  s     z.TestListImpl.test_pop_byte.<locals>.<listcomp>r   r–   r‚   r—   c                 S   s   g | ]}|‘qS r   r   r“   r   r   r   r•      s     r˜   r™   r   r   r   Útest_pop_byte‰  s0       ÿ

zTestListImpl.test_pop_bytec                 C   sÔ   t | ddƒ}ddddddd	d
g}|D ]}| |¡ q$|  t|ƒd¡ |d= |  t|ƒd¡ |  t|ƒ|dd … ¡ |d= |  t|ƒd¡ |  t|ƒ|dd… ¡ |d= |  t|ƒd¡ |  t|ƒddddd	g¡ d S )Nr&   r   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rq   r’   r   r–   r‚   r—   ©r	   r3   r:   r'   Úlist©r   rs   rŽ   r   r   r   r   Útest_delitem£  s    zTestListImpl.test_delitemc                 C   s  t | ddƒ}ddddddd	d
g}|D ]}| |¡ q$|  t|ƒd¡ |ddd…= |  t|ƒd¡ |  t|ƒ|ddd… ¡ |ddd…= |  t|ƒd¡ |  t|ƒddd
g¡ |ddd…= |  t|ƒd¡ |  t|ƒddg¡ |ddd…= |  t|ƒd¡ |  t|ƒg ¡ d S )Nr&   r   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rq   r‚   r�   é   rŸ   r¡   r   r   r   Útest_delete_slice·  s"    zTestListImpl.test_delete_slicec                    sl   t | ˆ dƒ}‡ ‡fdd„}tˆƒD ]}| ||ƒ¡ q"|  t|ƒˆ¡ tˆƒD ]}|  || ||ƒ¡ qNd S )Nr   c                    s&   d  ˆ|  d ˆ ¡ d¡}|d ˆ … S )Nz{:0{}}r&   zlatin-1)ÚformatÚencode)ÚvÚtmp©r   Únmaxr   r   Ú	make_item×  s    z,TestListImpl.check_sizing.<locals>.make_item)r	   rv   r3   r:   r'   )r   r   rª   rs   r«   r   r   r©   r   Úcheck_sizingÓ  s    zTestListImpl.check_sizingc                 C   s&   t ddƒD ]}| j|d| d� q
d S )Nr&   ru   r‚   r©   )rv   r¬   r   r   r   r   Útest_sizingã  s    zTestListImpl.test_sizingc              	   C   s®  t | ddƒ}t dd¡}| |¡ |  |j¡ |  t|ƒd¡ t d|d ¡d }|  |d¡ | 	¡  |  
|j¡ |  t¡�}| |¡ W 5 Q R X |  dt|jƒ¡ |  t¡�}||d< W 5 Q R X |  dt|jƒ¡ |  t¡�}| ¡  W 5 Q R X |  dt|jƒ¡ |  t¡�}|d= W 5 Q R X |  dt|jƒ¡ |  t¡�}|ddd…= W 5 Q R X |  dt|jƒ¡ | ¡  |  |j¡ |  t|ƒd¡ t d|d ¡d }|  |d¡ d S )Nrq   r&   r}   r   rA   )r	   r~   r   r3   Ú
assertTruer,   r:   r'   r€   r1   ZassertFalser„   rE   ZassertInÚstrÚ	exceptionr5   r/   )r   rs   Úoner{   Zraisesr   r   r   Útest_mutabilityè  s:    
zTestListImpl.test_mutabilityN)rZ   r[   r\   rm   ro   rt   rw   r|   r�   rƒ   r…   r‘   r›   rœ   rž   r¢   r¤   r¬   r­   r²   r   r   r   r   rf   Æ   s"   m	
rf   )r]   r6   r~   Znumba.tests.supportr   Znumbar   r;   rC   ZLIST_ERR_NO_MEMORYrU   rV   rD   Úobjectr	   r!   rf   r   r   r   r   Ú<module>   s     