o
    1&i"A                     @   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)
_helperlibc                   @   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   DC:\wamp64\www\opt\env\Lib\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 r   )list_lengthr   r   r   r   __len__+      zList.__len__c                 C   s   |  ||S r   )list_setitemr   iitemr   r   r   __setitem__.   s   zList.__setitem__c                 C   
   |  |S r   )list_getitemr   r   r   r   r   __getitem__1      
zList.__getitem__c                 C   s   t | S r   )ListIterr   r   r   r   __iter__4   r   zList.__iter__c                 C      |  | d S r   )list_delitemr"   r   r   r   __delitem__7      zList.__delitem__c                 C   s8   |dk s
t | dkrtd |S |dkrt | d }|S )Nr   r   list index out of range   )len
IndexErrorr"   r   r   r   handle_index:   s   zList.handle_indexc                 C   r   r   )list_allocatedr   r   r   r   r   C      zList.allocatedc                 C   r   r   )list_is_mutabler   r   r   r   
is_mutableG   r1   zList.is_mutablec                 C   
   |  dS )Nr,   list_set_is_mutabler   r   r   r   set_mutableK   r$   zList.set_mutablec                 C   r4   Nr   r5   r   r   r   r   set_immutableN   r$   zList.set_immutablec                 C   r'   r   )list_append)r   r   r   r   r   appendQ   r*   zList.appendr   c                 C   r    r   )list_popr"   r   r   r   popT   r$   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      | j | jS r   )r
   numba_list_lengthr   r   r   r   r   r   a   r*   zList.list_lengthc                 C   rE   r   )r
   numba_list_allocatedr   r   r   r   r   r0   d   r*   zList.list_allocatedc                 C   rE   r   )r
   numba_list_is_mutabler   r   r   r   r   r2   g   r*   zList.list_is_mutablec                 C   s   | j | j|S r   )r
   numba_list_set_is_mutabler   )r   r3   r   r   r   r6   j   s   zList.list_set_is_mutablec                 C   sD   | j | j||}|tkrtd|tkrtd| j |t d S )Nr+   list is immutable)	r
   numba_list_setitemr   LIST_ERR_INDEXr.   LIST_ERR_IMMUTABLE
ValueErrorrB   rC   )r   r   r   rD   r   r   r   r   m   s   zList.list_setitemc                 C   sL   |  |}t| j}| j| j||}|tkrtd| j	|t
 |jS )Nr+   )r/   r>   create_string_bufferr   r
   numba_list_getitemr   rL   r.   rB   rC   raw)r   r   Zitem_out_bufferrD   r   r   r   r!   v   s   
zList.list_getitemc                 C   s2   | j | j|}|tkrtd| j |t d S )NrJ   )r
   numba_list_appendr   rM   rN   rB   rC   )r   r   rD   r   r   r   r:      s   zList.list_appendc                 C   s"   |  |}| |}| | |S r   )r/   r!   r(   r   r   r   r   r<      s   


zList.list_popc                 C   s   t |tr#| j| j|j|j|j}|tkrt	d| j
|t d S | |}| j| j|}|tkr8td|tkr@t	d| j
|t d S )NrJ   r+   )
isinstanceslicer
   numba_list_delete_slicer   startstopsteprM   rN   rB   rC   r/   numba_list_delitemrL   r.   )r   r   rD   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   sb   t d}| j|t |}|tkrtd|tkrt| j	|d t j
| j |j}|jS )Nr   zlist mutated)r>   r?   r
   numba_list_iter_nextrA   LIST_ERR_MUTATEDrN   LIST_ERR_ITER_EXHAUSTEDStopIterationZassertGreaterEqualc_charr   from_addressvalue)r   r[   ZbirD   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   r3   r7   r9   r;   r=   r   r   r0   r2   r6   r   r!   r:   r<   r(   r\   rd   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 r8   )
parentr
   numba_list_iter_sizeofr>   c_char_pZit_state_bufcastr?   itr\   )r   rj   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   rE   r   )rj   rd   rn   r   r   r   r   __next__   r*   zListIter.__next__N)re   rf   rg   rh   r   r&   ro   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|g|R  }|tj|  S r   )r>   	CFUNCTYPEr   Z	c_helpers)namerestypeargtypesprotor   r   r   wrap   s   z TestListImpl.setUp.<locals>.wrapZ	test_listr   Z	list_freeNr   r0   r2   r6   r   r:   r!   r(   Zlist_delete_sliceZlist_iter_sizeofr\   rd   )r   )r>   r?   c_intnumba_test_listPOINTER	c_ssize_tr@   r   rF   rG   rH   rI   rl   rK   rR   rP   rY   rU   c_size_trk   rZ   r]   )r   Zlist_tZiter_trw   r   r   r   setUp   s   
		

zTestListImpl.setUpc                 C   s   |   }| |d d S r8   )ry   rB   )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	   rB   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   r   r   )ranger	   rB   r-   r   )r   r   r   r   r   r   test_allocation=  s
   zTestListImpl.test_allocationc                 C   s>   t | dd}|d | t|d |d }| |d d S )Nr   r,      abcdefghr   r	   r;   rB   r-   r   r   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 )Nr   r,   qr   )r	   r;   structpackrB   r-   unpackr   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 )Nr   r,   r   s   hijklmno   r   r   r   r   r   test_append_get_string_reallocQ  s   

z+TestListImpl.test_append_get_string_reallocc                 C   sv   t | dd}| t |d  W d    n1 sw   Y  | t d|d< W d    d S 1 s4w   Y  d S )Nr   r   r   )r	   assertRaisesr.   r   r   r   r   !test_set_item_getitem_index_errorZ  s   

"z.TestListImpl.test_set_item_getitem_index_errorc                 C   sP   t | dd}g d}|D ]}|| qg }|D ]}|| q| || d S )Nr,   r      a   b   c   d   e   f   g   h)r	   r;   rB   )r   r   valuesr   receivedjr   r   r   	test_itera  s   zTestListImpl.test_iterc                 C      t | dd}g d}|D ]}|| q| t|d | }| d| | t|d dd |D }| ||d d	  |d}| d
| | t|d |d}| d| | t|d g d}dd |D }| || d S )Nr,   r   r   r   r      c                 S      g | ]}|qS r   r   .0r   r   r   r   
<listcomp>u      z)TestListImpl.test_pop.<locals>.<listcomp>r   r      r   r      r   r   r   r   r   c                 S   r   r   r   r   r   r   r   r     r   r	   r;   rB   r-   r=   r   r   r   r   r   expectedr   r   r   test_popk  s&   

zTestListImpl.test_popc                 C   sD   t | dd}| t |  W d    d S 1 sw   Y  d S r   )r	   r   r.   r=   r   r   r   r   test_pop_index_error  s   
"z!TestListImpl.test_pop_index_errorc                 C   r   )N   r   )   aaaa   bbbb   cccc   dddd   eeee   ffff   ggggs   hhhhhr   s   hhhhr   c                 S   r   r   r   r   r   r   r   r     r   z.TestListImpl.test_pop_byte.<locals>.<listcomp>r   r   r   r   r   r   )r   r   r   r   r   c                 S   r   r   r   r   r   r   r   r     r   r   r   r   r   r   test_pop_byte  s&   

zTestListImpl.test_pop_bytec                 C   s   t | dd}g d}|D ]}|| q| t|d |d= | t|d | t||dd   |d= | t|d | t||dd  |d= | t|d	 | t|g d
 d S )Nr,   r   r   r   r   r   r   r   r   r   r	   r;   rB   r-   listr   r   r   r   r   r   r   test_delitem  s   zTestListImpl.test_delitemc                 C   s   t | dd}g d}|D ]}|| q| t|d |ddd= | t|d | t||ddd  |ddd= | t|d | t|g d |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   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 ]}| || || q'd 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	   r   r;   rB   r-   )r   r   r   r   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,   r   r   r   )r   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 d    n1 sNw   Y  | dt|j | t}||d< W d    n1 spw   Y  | dt|j | t}|  W d    n1 sw   Y  | dt|j | t}|d= W d    n1 sw   Y  | dt|j | t}|ddd= W d    n1 sw   Y  | dt|j |  | |j | t|d td|d d }| |d d S )Nr   r,   r   r   rJ   )r	   r   r   r;   
assertTruer3   rB   r-   r   r9   ZassertFalser   rN   ZassertInstr	exceptionr=   r7   )r   r   oner   Zraisesr   r   r   test_mutability  sD   


zTestListImpl.test_mutabilityN)re   rf   rg   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rq      s$    m	
rq   )rh   r>   r   Znumba.tests.supportr   Znumbar   rC   rL   ZLIST_ERR_NO_MEMORYr^   r_   rM   objectr	   r%   rq   r   r   r   r   <module>   s      