U
    hâËd!§  ã                   @   sR  d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ dd„ Zd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 ƒZ#dd„ Z$ee%ej&ƒdd„ ƒZ'ee%ƒdd„ ƒZ'ee(ej)ƒdd„ ƒZ*edej)ƒdd „ ƒZ+ed!ej,ƒeej-ƒd"d#„ ƒƒZ.eej/ej)ej0ƒd$d%„ ƒZ1eej2ej)ej0ej3ƒd&d'„ ƒZ4eej/ej)ej5ƒd(d)„ ƒZ6eej2ej)ej5ej3ƒd*d'„ ƒZ4eej7ej)ej0ƒd+d,„ ƒZ8eej7ej)ej5ƒd-d.„ ƒZ9eej:ej;ej3ƒd/d0„ ƒZ<ee=ej;ƒd1d2„ ƒZ>eej?ƒd3d4„ ƒZ@eejAej)ej)ƒd5d6„ ƒZBeejCej)ej)ƒd7d8„ ƒZDeejEej)ej0ƒeejEej0ej)ƒd9d:„ ƒƒZFeejGej)ej0ƒd;d<„ ƒZHeejIej)ej)ƒd=d>„ ƒZJeejKej)ej)ƒd?d@„ ƒZLdAdB„ ZMeejNƒdCdD„ ƒZOeejPƒdEdF„ ƒZQeejRƒdGdH„ ƒZSeejTƒdIdJ„ ƒZUeejVƒdKdL„ ƒZWedMej)ej3ƒdNdO„ ƒZXedPej)ƒdQdR„ ƒZYeej)dSƒdTdU„ ƒZZeej)dVƒdWdX„ ƒZ[dYdZ„ Z\ed[ej)ej&ƒd\d]„ ƒZ]ej^j_Z`eej)d^ƒde`fd_d`„ƒZaedaej)ej0ej3ƒdbdc„ ƒZbeddej)ƒdedf„ ƒZceddej)ej0ƒdgdf„ ƒZceej)dhƒdidj„ ƒZdeej)dkƒdldm„ ƒZedndo„ ZVe f¡ jgZhejfeVdp�jgZiejfdqdqdr�jgZjejfdqeVdqds�jgZkdtdu„ Zldvdw„ Zmeej)dxƒd¨dzd{„ƒZneeoƒd©d|d}„ƒZpeej)ej)ƒd~d„ ƒZqe
 rd€¡Zseejtd�ƒd‚dƒ„ ƒZueejtd„ƒd…d†„ ƒZveejtd‡ƒdˆd‰„ ƒZweejtdhƒdŠd‹„ ƒZxeejtdŒƒdªdŽd�„ƒZyeejtd�ƒd‘d’„ ƒZzeejtdxƒd«d“d”„ƒZ{eejtdkƒd•d–„ ƒZ|ej^j_Z}eejtd^ƒde}fd—d˜„ƒZ~eejtdVƒd™dš„ ƒZeejtdSƒd›dš„ ƒZeej7ƒdœd�„ ƒZ€eej2ƒdždŸ„ ƒZ�eej/ƒd d¡„ ƒZ‚ee(ƒd¢d£„ ƒZƒeej:ƒd¤d¥„ ƒZ„eejtejtƒd¦d§„ ƒZ…dS )¬z'
Support for native homogeneous lists.
é    N)Úcached_property)Úir)ÚtypesÚtypingÚerrorsÚcgutils)Úlower_builtinÚ
lower_castÚiternext_implÚimpl_ret_borrowedÚimpl_ret_new_refÚimpl_ret_untrackedÚRefType)Úoverload_methodÚoverload)Ú	quicksort)Úslicing©Úliteral_unrollc                 C   sD   t  |¡}| j ||j¡}|  |¡ ¡ }| ||¡}| j|||d�S )zy
    Given a list value and type, get its payload structure (as a
    reference, so that mutations are seen by all).
    ©Úref)	r   ÚListPayloadÚnrtZmeminfo_dataÚmeminfoÚget_data_typeÚ
as_pointerÚbitcastÚmake_data_helper)ÚcontextÚbuilderÚ	list_typeÚvalueÚpayload_typeÚpayloadÚptrty© r%   úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cpython/listobj.pyÚget_list_payload   s
    
r'   c                 C   s   |   |j¡}|  |¡S )z7
    Return the item size for the given list type.
    )r   ÚdtypeÚget_abi_sizeof)r   r    Zlltyr%   r%   r&   Úget_itemsize"   s    r*   c                   @   s†   e Zd Zedd„ ƒZejdd„ ƒZedd„ ƒZe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 )Ú_ListPayloadMixinc                 C   s   | j jS ©N©Ú_payloadÚsize©Úselfr%   r%   r&   r/   ,   s    z_ListPayloadMixin.sizec                 C   s   || j _d S r,   r-   ©r1   r!   r%   r%   r&   r/   0   s    c                 C   s   | j jS r,   )r.   Údirtyr0   r%   r%   r&   r3   4   s    z_ListPayloadMixin.dirtyc                 C   s   | j  d¡S )NÚdata)r.   Z_get_ptr_by_namer0   r%   r%   r&   r4   8   s    z_ListPayloadMixin.datac                 C   s   t  | j| j|¡S r,   )r   ZgepÚ_builderr4   ©r1   Úidxr%   r%   r&   Ú_gep<   s    z_ListPayloadMixin._gepc                 C   s&   |   |¡}| j |¡}| j | j|¡S r,   )r8   r5   ÚloadÚ
_datamodelÚ	from_data)r1   r7   ÚptrÚ	data_itemr%   r%   r&   Úgetitem?   s    
z_ListPayloadMixin.getitemc                 C   s:   | j  d|t |jd¡¡}| j  || j¡}| j  |||¡S )zp
        Fix negative indices by adding the size to them.  Positive
        indices are left untouched.
        ú<r   )r5   Úicmp_signedr   ÚConstantÚtypeÚaddr/   Úselect)r1   r7   Zis_negativeZwrapped_indexr%   r%   r&   Ú	fix_indexD   s
    
ÿz_ListPayloadMixin.fix_indexc                 C   s:   | j  d|t |jd¡¡}| j  d|| j¡}| j  ||¡S )z<
        Return whether the index is out of bounds.
        r?   r   ú>=)r5   r@   r   rA   rB   r/   Úor_)r1   r7   Ú	underflowÚoverflowr%   r%   r&   Úis_out_of_boundsN   s
    
ÿz"_ListPayloadMixin.is_out_of_boundsc              	   C   sœ   | j }t ||¡}t |jd¡}| j}| j  d||¡}|j|dd�� | 	||¡ W 5 Q R X | j  d||¡}|j|dd�� | 	||¡ W 5 Q R X | 
|¡S )z/
        Clamp the index in [0, size].
        r   r?   F©ZlikelyrF   )r5   r   Úalloca_once_valuer   rA   rB   r/   r@   Úif_thenÚstorer9   )r1   r7   r   ZidxptrÚzeror/   rH   rI   r%   r%   r&   Úclamp_indexW   s    z_ListPayloadMixin.clamp_indexc              	   C   s<   | j j|  |¡dd�� | jj | j t|f¡ W 5 Q R X dS )z?
        Raise an error if the index is out of bounds.
        FrK   N)r5   rM   rJ   Ú_contextÚ	call_convÚreturn_user_excÚ
IndexError)r1   r7   Úmsgr%   r%   r&   Úguard_indexj   s
     ÿz_ListPayloadMixin.guard_indexc                 C   s   t  | j|| j¡S )zo
        Fix slice start and stop to be valid (inclusive and exclusive, resp)
        indexing bounds.
        )r   Ú	fix_slicer5   r/   )r1   Úslicer%   r%   r&   rW   r   s    z_ListPayloadMixin.fix_slicec                 C   s   | j j | j| j|¡ dS )zIncref an element valueN)rQ   r   Úincrefr5   r(   ©r1   Úvalr%   r%   r&   Úincref_valuey   s    z_ListPayloadMixin.incref_valuec                 C   s   | j j | j| j|¡ dS )zDecref an element valueN)rQ   r   Údecrefr5   r(   rZ   r%   r%   r&   Údecref_value}   s    z_ListPayloadMixin.decref_valueN)Ú__name__Ú
__module__Ú__qualname__Úpropertyr/   Úsetterr3   r4   r8   r>   rE   rJ   rP   rV   rW   r\   r^   r%   r%   r%   r&   r+   *   s"   




	r+   c                   @   s   e Zd ZdZdd„ ZdS )ÚListPayloadAccessorzb
    A helper object to access the list attributes given the pointer to the
    payload type.
    c                 C   s^   || _ || _|| _|j|j | _t |¡}| |¡ 	¡ }| 
||¡}|j|||d�}|| _d S )Nr   )rQ   r5   Ú_tyÚdata_model_managerr(   r:   r   r   r   r   r   r   r.   )r1   r   r   r    Zpayload_ptrr"   r$   r#   r%   r%   r&   Ú__init__‡   s    
ÿzListPayloadAccessor.__init__N)r_   r`   ra   Ú__doc__rg   r%   r%   r%   r&   rd   ‚   s   rd   c                   @   sÎ   e Zd Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZejd	d„ ƒZed
d„ ƒZ	edd„ ƒZ
dd„ Zdd„ Zd(dd„Zd)dd„Zdd„ Zedd„ ƒZdd„ Zdd„ Zedd „ ƒZed!d"„ ƒZd#d$„ Zd%d&„ Zd'S )*ÚListInstancec                 C   s@   || _ || _|| _| |||¡| _t||ƒ| _|j|j | _	d S r,   )
rQ   r5   re   Úmake_helperÚ_listr*   Ú	_itemsizerf   r(   r:   )r1   r   r   r    Úlist_valr%   r%   r&   rg   –   s    zListInstance.__init__c                 C   s   | j jS r,   )re   r(   r0   r%   r%   r&   r(   ž   s    zListInstance.dtypec                 C   s   t | j| j| j| jƒS r,   )r'   rQ   r5   re   rk   r0   r%   r%   r&   r.   ¢   s    zListInstance._payloadc                 C   s   | j jS r,   ©rk   Úparentr0   r%   r%   r&   ro   §   s    zListInstance.parentc                 C   s   || j _d S r,   rn   r2   r%   r%   r&   ro   «   s    c                 C   s
   | j  ¡ S r,   )rk   Ú	_getvaluer0   r%   r%   r&   r!   ¯   s    zListInstance.valuec                 C   s   | j jS r,   )rk   r   r0   r%   r%   r&   r   ³   s    zListInstance.meminfoc                 C   s    | j jr|rtjntj| j_d S r,   )re   Z	reflectedr   Útrue_bitÚ	false_bitr.   r3   rZ   r%   r%   r&   Ú	set_dirty·   s    zListInstance.set_dirtyc              	   C   s0   |   |  |¡¡ |  || j || d¡¡¡ dS )z)Remove the value at the location
        é   N)r^   r>   Úzfillr5   rC   rB   r6   r%   r%   r&   Úclear_value»   s    zListInstance.clear_valueTc                 C   sX   |r|   |  |¡¡ |  |¡}| j | j|¡}| j ||¡ |  d¡ |rT|  |¡ d S )NT)	r^   r>   r8   r:   Úas_datar5   rN   rs   r\   )r1   r7   r[   rY   Údecref_old_valuer<   r=   r%   r%   r&   ÚsetitemÂ   s    

zListInstance.setitemc                 C   s:   |   |¡}| j | j|¡}| j ||¡ |r6|  |¡ d S r,   )r8   r:   rw   r5   rN   r\   )r1   r7   r[   rY   r<   r=   r%   r%   r&   ÚinititemÏ   s
    
zListInstance.inititemc                 C   sb   | j }|  |¡}|  |¡}| j tj¡}| | ||¡| ||¡¡}t 	|||t
 d¡dƒ¡ dS )zjZero-fill the memory at index *start* to *stop*

        *stop* MUST not be smaller than *start*.
        é   r   N)r5   r8   rQ   Úget_value_typer   ÚintpÚsubÚptrtointr   Zmemsetr   ZIntType)r1   ÚstartÚstopr   ÚbaseÚendZ	intaddr_tr/   r%   r%   r&   ru   Ö   s    


ÿzListInstance.zfillc                 C   sœ  |  tj¡}t|tƒr"t ||¡}| t |¡¡}| 	|¡}t
||ƒ}||8 }t |tj¡}	| |||dƒ}
t ||t ||¡t ||¡¡\}}|j|dd�� | tj|	¡ W 5 Q R X |j| |	¡dd��¾ |jj|||
 ¡ d�}|jt ||¡dd��†\}}|� | tj|	¡ W 5 Q R X |�T ||
j_| tj¡|
j_||
j_t |d¡|
j_tj|
j_ |
 !|
j "d¡|¡ W 5 Q R X W 5 Q R X W 5 Q R X | |	¡|
fS )zð
        Allocate a ListInstance with its storage.
        Return a (ok, instance) tuple where *ok* is a LLVM boolean and
        *instance* is a ListInstance object (the object's contents are
        only valid when *ok* is true).
        NFrK   T)r/   Údtorr   )#r|   r   r}   Ú
isinstanceÚintr   rA   r   r   r)   r*   r   rL   rq   Úmuladd_with_overflowrM   rN   rr   r9   r   Z"meminfo_new_varsize_dtor_uncheckedÚget_dtorÚif_elseZis_nullrk   r   Úget_constant_nullÚpyobjectro   r.   Ú	allocatedr/   r3   ru   rB   )Úclsr   r   r    ÚnitemsÚintp_tr"   Úpayload_sizeÚitemsizeÚokr1   Ú	allocsizeÚovfr   Zif_errorZif_okr%   r%   r&   Úallocate_exã   sF    




þ  ÿÿ
2zListInstance.allocate_exc              	   C   sÒ   | j }| j}|j}t t ¡ tjg¡}t ||d 	| j
¡¡}|jsF|S d|_t | ¡ ¡}|jd }t||| j|ƒ}|jj}tj||dƒ|j|dƒ|d��&\}	}
| |	¡}|j || j
|¡ W 5 Q R X | ¡  |S )z,Define the destructor if not already definedz.dtor.list.{}Zlinkonce_odrr   rt   )r€   r�   Ústepr}   )rQ   r5   Úmoduler   ÚFunctionTypeZVoidTyper   Ú	voidptr_tZget_or_insert_functionÚformatr(   Zis_declarationÚlinkageZ	IRBuilderZappend_basic_blockÚargsrd   re   r/   rB   Úfor_range_slicer>   r   r]   Zret_void)r1   r   r   ÚmodZfntyÚfnZbase_ptrr#   r}   r7   Ú_r[   r%   r%   r&   Údefine_dtor  s4    
ÿ
   þ
zListInstance.define_dtorc                 C   s   |   ¡ }| j |tj¡}|S )zp"Get the element dtor function pointer as void pointer.

        It's safe to be called multiple times.
        )r¡   r5   r   r   r™   )r1   r„   Z
dtor_fnptrr%   r%   r&   rˆ   1  s    zListInstance.get_dtorc              	   C   sH   |   ||||¡\}}|j| |¡dd�� |j |td¡ W 5 Q R X |S )zù
        Allocate a ListInstance with its storage.  Same as allocate_ex(),
        but return an initialized *instance*.  If allocation failed,
        control is transferred to the caller using the target's current
        call convention.
        FrK   )zcannot allocate list)r•   rM   Únot_rR   rS   ÚMemoryError)r�   r   r   r    rŽ   r’   r1   r%   r%   r&   Úallocate;  s    
ÿzListInstance.allocatec                 C   s<   | |||dƒ}||j _| tj¡|j _|j |||j¡ |S )z©
        Allocate a new list instance pointing to an existing payload
        (a meminfo pointer).
        Note the parent field has to be filled by the caller.
        N)	rk   r   rŠ   r   r‹   ro   r   rY   r!   )r�   r   r   r    r   r1   r%   r%   r&   Úfrom_meminfoI  s
    zListInstance.from_meminfoc           	         sú   ‡ ‡‡‡‡fdd„}ˆj ‰ˆj‰ |j‰tˆˆjƒ‰ˆjj}t ˆd¡}t ˆd¡}ˆ  	d||¡}ˆ  	dˆ  
||¡|¡}ˆ j|dd�� ||ƒ W 5 Q R X ˆ j|dd��8 ˆ  |ˆ  |ˆ  
||¡¡¡}||ƒ ˆ ˆj|¡ W 5 Q R X |ˆj_ˆ d	¡ d
S )zE
        Ensure the list is properly sized for the new size.
        c              	      s¤   ˆ  t ˆj¡¡}ˆ |¡}|ˆ8 }t ˆ | t ˆˆ¡t ˆ|¡¡\}}ˆ j	|dd�� ˆj
 ˆ td¡ W 5 Q R X ˆjjˆ ˆjj|d�}t ˆˆ |d¡ | ˆj_d S )NFrK   )úcannot resize list)r/   r¦   )r   r   r   re   r)   r   r‡   r   rA   rM   rR   rS   r£   r   Z!meminfo_varsize_realloc_uncheckedrk   r   Zguard_memory_errorr.   rŒ   )Únew_allocatedr"   r�   r“   r”   r<   ©r   r   r�   r‘   r1   r%   r&   Ú_payload_realloc[  s*    
 

ý
ÿþ
ÿz-ListInstance.resize.<locals>._payload_reallocé   r{   r?   ú>FrK   TN)rQ   r5   rB   r*   re   r.   rŒ   r   rA   r@   ZashrrM   rC   ru   r/   rs   )	r1   Únew_sizer©   rŒ   ÚtwoÚeightZis_too_smallZis_too_larger§   r%   r¨   r&   ÚresizeW  s,    
ÿÿzListInstance.resizec                 C   s:   |   |¡}|   |¡}tj| j|||| jd� |  d¡ dS )zE
        Move `count` elements from `src_idx` to `dest_idx`.
        )r‘   TN)r8   r   Zraw_memmover5   rl   rs   )r1   Zdest_idxZsrc_idxÚcountZdest_ptrZsrc_ptrr%   r%   r&   Úmove�  s    

 ÿzListInstance.moveN)T)T)r_   r`   ra   rg   rb   r(   r.   ro   rc   r!   r   rs   rv   ry   rz   ru   Úclassmethodr•   r¡   rˆ   r¤   r¥   r¯   r±   r%   r%   r%   r&   ri   ”   s8   








/


9ri   c                   @   sR   e Zd Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZ	e	j
dd
„ ƒZ	dS )ÚListIterInstancec                 C   s4   || _ || _|| _| |||¡| _|j|j | _d S r,   )rQ   r5   re   rj   Ú_iterrf   Z
yield_typer:   )r1   r   r   Ú	iter_typeZiter_valr%   r%   r&   rg   �  s
    zListIterInstance.__init__c                 C   sJ   t |||j|ƒ}| |||d ƒ}| tjd¡}t ||¡|j_|j	|j_	|S ©Nr   )
ri   Ú	containerÚget_constantr   r}   r   rL   r´   Úindexr   )r�   r   r   rµ   rm   Z	list_instr1   r¹   r%   r%   r&   Ú	from_list¤  s    
zListIterInstance.from_listc                 C   s   t | j| j| jj| jƒS r,   )r'   rQ   r5   re   r·   r´   r0   r%   r%   r&   r.   ­  s    
 ÿzListIterInstance._payloadc                 C   s
   | j  ¡ S r,   )r´   rp   r0   r%   r%   r&   r!   ³  s    zListIterInstance.valuec                 C   s   | j  | jj¡S r,   )r5   r9   r´   r¹   r0   r%   r%   r&   r¹   ·  s    zListIterInstance.indexc                 C   s   | j  || jj¡ d S r,   )r5   rN   r´   r¹   r2   r%   r%   r&   r¹   »  s    N)r_   r`   ra   rg   r²   rº   rb   r.   r!   r¹   rc   r%   r%   r%   r&   r³   ›  s   



r³   c                 C   sd   t |ƒ}t | |||¡}|  tj|¡|_t|ƒD ]"\}}|j|  tj|¡|dd� q0t	| |||j
ƒS )zE
    Build a list of the given type, containing the given items.
    T©rY   )Úlenri   r¤   r¸   r   r}   r/   Ú	enumeratery   r   r!   )r   r   r    ÚitemsrŽ   ÚinstÚir[   r%   r%   r&   Ú
build_listÃ  s    rÁ   c                 C   s   dd„ }|   ||||¡S )Nc                 S   s   g }|  | ¡ |S r,   )Úextend)ÚiterableÚresr%   r%   r&   Ú	list_implÔ  s    
z#list_constructor.<locals>.list_impl©Úcompile_internal)r   r   Úsigrœ   rÅ   r%   r%   r&   Úlist_constructorÑ  s    rÉ   c                 C   s*   |j }d}t | |||¡}t| |||jƒS r¶   )Úreturn_typeri   r¤   r   r!   )r   r   rÈ   rœ   r    Úlist_lenr¿   r%   r%   r&   rÉ   Û  s    c                 C   s   t | ||jd |d ƒ}|jS r¶   )ri   rœ   r/   ©r   r   rÈ   rœ   r¿   r%   r%   r&   rË   å  s    rË   Zgetiterc                 C   s(   t  | ||j|d ¡}t| ||j|jƒS r¶   )r³   rº   rÊ   r   r!   rÌ   r%   r%   r&   Úgetiter_listê  s    rÍ   Ziternextc           	   	   C   s~   t | ||jd |d ƒ}|j}|j}| d||¡}| |¡ | |¡�. | | |¡¡ | 	||  
tjd¡¡|_W 5 Q R X d S )Nr   r?   rt   )r³   rœ   r¹   r/   r@   Z	set_validrM   Zyield_r>   rC   r¸   r   r}   )	r   r   rÈ   rœ   Úresultr¿   r¹   rŽ   Zis_validr%   r%   r&   Úiternext_listiterï  s    
rÏ   c                 C   sR   t | ||jd |d ƒ}|d }| |¡}|j|dd� | |¡}t| ||j|ƒS )Nr   rt   zgetitem out of range©rU   )ri   rœ   rE   rV   r>   r   rÊ   )r   r   rÈ   rœ   r¿   r¹   rÎ   r%   r%   r&   Úgetitem_listþ  s    

rÑ   c                 C   sX   t | ||jd |d ƒ}|d }|d }| |¡}|j|dd� |j||dd� |  ¡ S )Nr   rt   rª   zsetitem out of rangerÐ   Tr»   )ri   rœ   rE   rV   ry   Úget_dummy_value)r   r   rÈ   rœ   r¿   r¹   r!   r%   r%   r&   Úsetitem_list	  s    
rÓ   c              
   C   s  t | ||jd |d ƒ}|  ||jd |d ¡}t | ||jd |¡ | |¡ t ||¡}t  | ||j|¡}||_	t
 ||j|j|j¡�f\}}	|�$\}
}| |
¡}|j||dd� W 5 Q R X |	�$\}
}| |
¡}|j||dd� W 5 Q R X W 5 Q R X t| ||j|jƒS ©Nr   rt   Tr»   )ri   rœ   rj   r   Úguard_invalid_slicerW   Úget_slice_lengthr¤   rÊ   r/   r   Úfor_range_slice_genericr€   r�   r–   r>   rz   r   r!   )r   r   rÈ   rœ   r¿   rX   Zresult_sizerÎ   Ú	pos_rangeÚ	neg_ranger7   r°   r!   r%   r%   r&   Úgetslice_list  s(    
ÿÿ



$rÚ   c                 C   s   t | ||jd |d ƒ}t | ||jd |d ƒ}|  ||jd |d ¡}t | ||jd |¡ | |¡ |j}t ||¡}| |j|¡}	t	 
|	jd¡}
t	 
|	jd¡}| | d|j|¡¡��Ö\}}|�ú | |j|¡}| |j|¡}| | d|	|
¡¡�0 | | |j|	¡¡ | | ||	¡||¡ W 5 Q R X | | d|	|
¡¡�0 | | ||	¡||¡ | | |j|	¡¡ W 5 Q R X |j}t ||¡�,}| |j¡}|j| |j|¡|dd� W 5 Q R X W 5 Q R X |�¾ | | d	|	|
¡¡� d
}| j |t|f¡ W 5 Q R X t ||j|j|j¡�f\}}|�$\}}| |¡}|j||dd� W 5 Q R X |�$\}}| |¡}|j||dd� W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X |  ¡ S )Nr   rª   rt   ú==r«   r?   Tr»   ú!=z0cannot resize extended list slice with step != 1)ri   rœ   rj   r   rÕ   rW   r/   rÖ   r~   r   rA   rB   r‰   r@   r–   rC   r€   rM   r¯   r±   r   Ú	for_ranger>   r¹   ry   rR   rS   Ú
ValueErrorr×   r�   rÒ   )r   r   rÈ   rœ   ÚdestÚsrcrX   Úsrc_sizeZ
avail_sizeZ
size_deltarO   ÚoneZthenZ	otherwiseÚ	real_stopÚ	tail_sizeÚdest_offsetÚloopr!   rU   rØ   rÙ   r¹   r°   r%   r%   r&   rÓ   ,  s\    
ÿÿ.   ÿ



8c                 C   s   dd„ }|   ||||¡S )Nc                 S   s   |   |¡ d S r,   )Úpop)ÚlstrÀ   r%   r%   r&   Úlist_delitem_impll  s    z-delitem_list_index.<locals>.list_delitem_implrÆ   )r   r   rÈ   rœ   ré   r%   r%   r&   Údelitem_list_indexi  s    rê   c              	   C   s&  t | ||jd |d ƒ}|  ||jd |d ¡}t | ||jd |¡ | |¡ t ||¡}t |j	d¡}|j
| d|j|¡dd�� d}| j |t|f¡ W 5 Q R X |j}	| |	|¡}
t ||	|
|	 	d¡¡�\}}| | |¡¡ W 5 Q R X | |j|
¡}| |	|
|¡ | | |j|¡¡ |  ¡ S )Nr   rt   rÜ   FrK   z4unsupported del list[start:stop:step] with step != 1)ri   rœ   rj   r   rÕ   rW   rÖ   r   rA   rB   rM   r@   r–   rR   rS   ÚNotImplementedErrorr€   rC   r   r�   r^   r>   r~   r/   r±   r¯   rÒ   )r   r   rÈ   rœ   r¿   rX   Z	slice_lenrâ   rU   r€   rã   r7   r    rä   r%   r%   r&   Údelitem_listr  s.    
   ÿrì   c                 C   s   dd„ }|   ||||¡S )Nc                 S   s   | D ]}||kr dS qdS ©NTFr%   )rè   r!   Úelemr%   r%   r&   Úseq_contains_impl—  s    z!in_seq.<locals>.seq_contains_implrÆ   )r   r   rÈ   rœ   rï   r%   r%   r&   Úin_seq•  s    rð   c                 C   s   dd„ }|   ||||¡S )Nc                 S   s   t | ƒdkS r¶   ©r¼   ©Úseqr%   r%   r&   Úsequence_bool_impl¡  s    z)sequence_bool.<locals>.sequence_bool_implrÆ   )r   r   rÈ   rœ   rô   r%   r%   r&   Úsequence_boolŸ  s    rõ   c                 C   s   t | tjƒrdd„ }|S d S )Nc                 S   s   t | ƒdkS r¶   rñ   rò   r%   r%   r&   Úimplª  s    zsequence_truth.<locals>.impl)r…   r   ÚSequence)ró   rö   r%   r%   r&   Úsequence_truth§  s    rø   c              	   C   s  t | ||jd |d ƒ}t | ||jd |d ƒ}|j}|j}| ||¡}t  | ||j|¡}	||	_t ||¡�8}
| |
j	¡}|  
|||j|	j¡}|	j|
j	|dd� W 5 Q R X t ||¡�@}
| |
j	¡}|  
|||j|	j¡}|	j| |
j	|¡|dd� W 5 Q R X t| ||j|	jƒS rÔ   )ri   rœ   r/   rC   r¤   rÊ   r   rÝ   r>   r¹   Úcastr(   ry   r   r!   )r   r   rÈ   rœ   ÚaÚbÚa_sizeZb_sizerŽ   rß   ræ   r!   r%   r%   r&   Úlist_add¯  s     $rý   c                 C   s8   |j d j|jjkst‚t| |||ƒ}t| ||j|jƒS r¶   )rœ   r(   rÊ   ÚAssertionErrorÚ_list_extend_listr   r!   )r   r   rÈ   rœ   rß   r%   r%   r&   Úlist_add_inplaceÅ  s    r   c              
   C   s  t |jd tjƒrd\}}nd\}}t| ||j| || ƒ}|j}|| }t |jd¡}	| 	t
 ||¡|	|¡}| ||¡}
t | ||j|
¡}|
|_t
j||	|
|dd��H\}}t
 ||¡�,}| |j¡}|j| |j|¡|dd� W 5 Q R X W 5 Q R X t| ||j|jƒS )Nr   )r   rt   )rt   r   T©Úincr»   )r…   rœ   r   ÚListri   r/   r   rA   rB   rD   r   Ú
is_neg_intÚmulr¤   rÊ   r�   rÝ   r>   r¹   ry   rC   r   r!   )r   r   rÈ   rœ   Zlist_idxZint_idxrà   rá   ÚmultrO   rŽ   rß   rå   r    ræ   r!   r%   r%   r&   Úlist_mulÍ  s     
.r  c              
   C   sÔ   t | ||jd |d ƒ}|j}|d }t |jd¡}| t ||¡||¡}| 	||¡}| 
|¡ tj||||dd��H\}	}
t ||¡�,}| |j¡}|j| |j|	¡|dd� W 5 Q R X W 5 Q R X t| ||j|jƒS )Nr   rt   Tr  r»   )ri   rœ   r/   r   rA   rB   rD   r   r  r  r¯   r�   rÝ   r>   r¹   ry   rC   r   rÊ   r!   )r   r   rÈ   rœ   r¿   rá   r  rO   rŽ   rå   r    ræ   r!   r%   r%   r&   Úlist_mul_inplaceæ  s    
.r  c                 C   s^   t | ||jd |d ƒ}t | ||jd |d ƒ}| |jtj¡}| |jtj¡}| d||¡S ©Nr   rt   rÛ   )ri   rœ   r   r   r   r�   r@   )r   r   rÈ   rœ   rú   rû   ÚmaÚmbr%   r%   r&   Úlist_isý  s
    r  c                 C   sð   |j \}}t| |||d ƒ}t| |||d ƒ}|j}| d||j¡}	t ||	¡}
| |	¡�† t ||¡�n}| |j	¡}| |j	¡}|  
|tj|j|jf||f¡}| | |¡¡� | tj|
¡ | ¡  W 5 Q R X W 5 Q R X W 5 Q R X | |
¡S r	  )rœ   ri   r/   r@   r   rL   rM   rÝ   r>   r¹   Zgeneric_compareÚoperatorÚeqr(   r¢   rN   rr   Zdo_breakr9   )r   r   rÈ   rœ   ZatyZbtyrú   rû   rü   Z	same_sizerÄ   ræ   ÚvÚwZitemresr%   r%   r&   Úlist_eq  s$    


 ÿ&r  c                  G   s   t dd„ | D ƒƒS )Nc                 S   s   g | ]}t |tjƒ‘qS r%   )r…   r   r  )Ú.0Útypr%   r%   r&   Ú
<listcomp>  s     zall_list.<locals>.<listcomp>)Úall)rœ   r%   r%   r&   Úall_list  s    r  c                 C   s   t | |ƒsd S dd„ }|S )Nc                 S   s
   | |k S r,   r%   ©rú   rû   r%   r%   r&   Úlist_ne_impl&  s    z"impl_list_ne.<locals>.list_ne_impl©r  )rú   rû   r  r%   r%   r&   Úimpl_list_ne!  s    
r  c                 C   s   t | |ƒsd S dd„ }|S )Nc                 S   sX   t | ƒ}t |ƒ}tt||ƒƒD ]0}| | || k r8 dS | | || kr dS q||kS rí   ©r¼   ÚrangeÚmin©rú   rû   ÚmÚnrÀ   r%   r%   r&   Úlist_le_impl0  s    z"impl_list_le.<locals>.list_le_implr  )rú   rû   r!  r%   r%   r&   Úimpl_list_le+  s    

r"  c                 C   s   t | |ƒsd S dd„ }|S )Nc                 S   sX   t | ƒ}t |ƒ}tt||ƒƒD ]0}| | || k r8 dS | | || kr dS q||k S rí   r  r  r%   r%   r&   Úlist_lt_implA  s    z"impl_list_lt.<locals>.list_lt_implr  )rú   rû   r#  r%   r%   r&   Úimpl_list_lt<  s    

r$  c                 C   s   t | |ƒsd S dd„ }|S )Nc                 S   s   || kS r,   r%   r  r%   r%   r&   Úlist_ge_implR  s    z"impl_list_ge.<locals>.list_ge_implr  )rú   rû   r%  r%   r%   r&   Úimpl_list_geM  s    
r&  c                 C   s   t | |ƒsd S dd„ }|S )Nc                 S   s   || k S r,   r%   r  r%   r%   r&   Úlist_gt_impl\  s    z"impl_list_gt.<locals>.list_gt_implr  )rú   rû   r'  r%   r%   r&   Úimpl_list_gtW  s    
r(  zlist.appendc                 C   s^   t | ||jd |d ƒ}|d }|j}| |t |jd¡¡}| |¡ |j||dd� |  	¡ S rÔ   )
ri   rœ   r/   rC   r   rA   rB   r¯   ry   rÒ   )r   r   rÈ   rœ   r¿   Úitemr   r¬   r%   r%   r&   Úlist_appendd  s    
r*  z
list.clearc                 C   s4   t | ||jd |d ƒ}| |  tjd¡¡ |  ¡ S r¶   )ri   rœ   r¯   r¸   r   r}   rÒ   rÌ   r%   r%   r&   Ú
list_clearp  s    r+  Úcopyc                 C   s   dd„ }|S )Nc                 S   s   t | ƒS r,   )Úlist©rè   r%   r%   r&   Úlist_copy_implz  s    z!list_copy.<locals>.list_copy_implr%   )rè   r/  r%   r%   r&   Ú	list_copyx  s    r0  r°   c                 C   s   dd„ }|S )Nc                 S   s"   d}| D ]}||kr|d7 }q|S ©Nr   rt   r%   )rè   r!   rÄ   rî   r%   r%   r&   Úlist_count_implƒ  s
    
z#list_count.<locals>.list_count_implr%   )rè   r!   r2  r%   r%   r&   Ú
list_count€  s    r3  c              	   C   s®   t | ||jd |d ƒ}t | ||jd |d ƒ}|j}|j}| ||¡}| |¡ ||_t ||¡�@}	| |	j¡}
|  	||
|j
|j
¡}
|j| |	j|¡|
dd� W 5 Q R X |S )Nrt   r   Tr»   )ri   rœ   r/   rC   r¯   r   rÝ   r>   r¹   rù   r(   ry   )r   r   rÈ   rœ   rà   rß   rá   Z	dest_sizerŽ   ræ   r!   r%   r%   r&   rÿ   �  s    
$rÿ   zlist.extendc                 C   s@   t |jd tjƒr(t| |||ƒ |  ¡ S dd„ }|  ||||¡S )Nrt   c                 S   s   | j }|D ]}||ƒ q
d S r,   )Úappend)rè   rÃ   Úmethr  r%   r%   r&   Úlist_extend¥  s    z list_extend.<locals>.list_extend)r…   rœ   r   r  rÿ   rÒ   rÇ   )r   r   rÈ   rœ   r6  r%   r%   r&   r6  ž  s
    r6  r¹   c                 C   sZ   t |ttjtjfƒs$t d|› �¡‚t |ttjtjfƒsHt d|› �¡‚dtfdd„}|S )Nz$arg "start" must be an Integer. Got z#arg "stop" must be an Integer. Got r   c                 S   sp   t | ƒ}|dk r$||7 }|dk r$d}|dk r4||7 }||kr@|}t||ƒD ]}| | |krJ|  S qJtdƒ‚d S )Nr   zvalue not in list)r¼   r  rÞ   )rè   r!   r€   r�   r   rÀ   r%   r%   r&   Úlist_index_impl¹  s    
z#list_index.<locals>.list_index_impl)r…   r†   r   ÚIntegerÚOmittedr   ÚTypingErrorÚintp_max)rè   r!   r€   r�   r7  r%   r%   r&   Ú
list_index±  s    r<  zlist.insertc           
      C   sš   t | ||jd |d ƒ}| |d ¡}| |¡}|d }|j}t |jd¡}| ||¡}	| 	|	¡ | 
| ||¡|| ||¡¡ |j||ddd� |  ¡ S )Nr   rt   rª   TF)rY   rx   )ri   rœ   rE   rP   r/   r   rA   rB   rC   r¯   r±   r~   ry   rÒ   )
r   r   rÈ   rœ   r¿   r¹   r!   r   râ   r¬   r%   r%   r&   Úlist_insertË  s    

r=  zlist.popc                 C   s€   t | ||jd |d ƒ}|j}t | ||tdf¡ | |t |j	d¡¡}| 
|¡}| |¡ | |¡ | |¡ t| ||j|ƒS )Nr   úpop from empty listrt   )ri   rœ   r/   r   Ú
guard_zerorT   r~   r   rA   rB   r>   r\   rv   r¯   r   rÊ   )r   r   rÈ   rœ   r¿   r   rÄ   r%   r%   r&   Úlist_popÜ  s    
ÿ



r@  c           	      C   s²   t | ||jd |d ƒ}| |d ¡}|j}t | ||tdf¡ | |d¡ | |¡}t	 
|jd¡}| |t	 
|jd¡¡}| || ||¡| ||¡¡ | |¡ t| ||j|ƒS )Nr   rt   r>  zpop index out of range)ri   rœ   rE   r/   r   r?  rT   rV   r>   r   rA   rB   r~   r±   rC   r¯   r   rÊ   )	r   r   rÈ   rœ   r¿   r7   r   rÄ   râ   r%   r%   r&   r@  ê  s    
ÿ

Úremovec                 C   s   dd„ }|S )Nc                 S   s:   t t| ƒƒD ] }| | |kr|  |¡  d S qtdƒ‚d S )Nzlist.remove(x): x not in list)r  r¼   rç   rÞ   )rè   r!   rÀ   r%   r%   r&   Úlist_remove_implÿ  s
    
z%list_remove.<locals>.list_remove_implr%   )rè   r!   rB  r%   r%   r&   Úlist_removeü  s    rC  Úreversec                 C   s   dd„ }|S )Nc                 S   s@   t dt| ƒd ƒD ](}| d }| | | |  | |< | |< qd S )Nr   rª   rt   )r  r¼   )rè   rú   rû   r%   r%   r&   Úlist_reverse_impl  s    
z'list_reverse.<locals>.list_reverse_implr%   )rè   rE  r%   r%   r&   Úlist_reverse	  s    rF  c                 C   s   | |kS r,   r%   r  r%   r%   r&   Úgt  s    rG  )ÚltT)Ú
is_argsortÚis_list)rI  rH  rJ  c                 C   sX   t | tjƒr| j}nt | tjƒr(| j}n| }t |tjtjtt	fƒsTd|  }t
 |¡‚|S )Nz2an integer is required for 'reverse' (got type %s))r…   r   r9  r!   ÚOptionalrB   ÚBooleanr8  r†   Úboolr   r:  )rD  ZrtyrU   r%   r%   r&   Ú_sort_check_reverse"  s    
rN  c                 C   sB   t | tjƒrd}t |¡‚t | ¡s>t | tjƒs>d}t |¡‚d S )NzoKey must concretely be None or a Numba JIT compiled function, an Optional (union of None and a value) was foundz1Key must be None or a Numba JIT compiled function)r…   r   rK  r   r:  r   Úis_nonelikeÚ
Dispatcher)ÚkeyrU   r%   r%   r&   Ú_sort_check_key/  s    
rR  ÚsortFc                    sV   t |ƒ t|ƒ t |¡r(d‰ t‰t‰nt|tjƒr@d‰ t	‰t
‰d‡ ‡‡fdd„	}|S )NFTc                    sh   ˆdkr‡ fdd„ˆD ƒ}nˆ}|dks0|dkr:ˆ|ƒ}nˆ|ƒ}ˆdkrd‡fdd„|D ƒˆd d …< d S )NTc                    s   g | ]}ˆ |ƒ‘qS r%   r%   )r  Úx)rQ  r%   r&   r  J  s     z.ol_list_sort.<locals>.impl.<locals>.<listcomp>Fr   c                    s   g | ]}ˆ | ‘qS r%   r%   )r  rÀ   r.  r%   r&   r  R  s     r%   )rè   rQ  rD  Z_lstÚtmp©ZKEYZsort_bZsort_f)rQ  rè   r&   rö   H  s    
zol_list_sort.<locals>.impl)NF)rR  rN  r   rO  Úsort_forwardsÚsort_backwardsr…   r   rP  Úarg_sort_forwardsÚarg_sort_backwards)rè   rQ  rD  rö   r%   rV  r&   Úol_list_sort9  s    
r[  c                 C   s.   t | tjƒsdS t|ƒ t|ƒ ddd„}|S )NFc                 S   s   t | ƒ}|j||d� |S )N)rQ  rD  )r-  rS  )rÃ   rQ  rD  rè   r%   r%   r&   rö   _  s    zol_sorted.<locals>.impl)NF)r…   r   ÚIterableTyperR  rN  )rÃ   rQ  rD  rö   r%   r%   r&   Ú	ol_sortedV  s    
r]  c                 C   s   |j |j kst‚|S r,   )r(   rþ   )r   r   ÚfromtyÚtotyr[   r%   r%   r&   Úlist_to_listh  s    r`  úCannot mutate a literal listr4  c                 C   s   t ‚d S r,   ©Ú_banned_error)rè   Úobjr%   r%   r&   Úliteral_list_banned_appendv  s    re  rÂ   c                 C   s   t ‚d S r,   rb  )rè   rÃ   r%   r%   r&   Úliteral_list_banned_extend{  s    rf  Úinsertc                 C   s   t ‚d S r,   rb  )rè   r¹   rd  r%   r%   r&   Úliteral_list_banned_insert€  s    rh  c                 C   s   t ‚d S r,   rb  )rè   r!   r%   r%   r&   Úliteral_list_banned_remove…  s    ri  rç   éÿÿÿÿc                 C   s   t ‚d S r,   rb  ©rè   r¹   r%   r%   r&   Úliteral_list_banned_popŠ  s    rl  Úclearc                 C   s   t ‚d S r,   rb  r.  r%   r%   r&   Úliteral_list_banned_clear�  s    rn  c                 C   s   t ‚d S r,   rb  )rè   rQ  rD  r%   r%   r&   Úliteral_list_banned_sort”  s    ro  c                 C   s   t ‚d S r,   rb  r.  r%   r%   r&   Úliteral_list_banned_reverse™  s    rp  c                 C   s   t | tjƒrd}t |¡‚d S )Nz+list.index is unsupported for literal lists©r…   r   ÚLiteralListr   r:  )rè   rT  r€   rƒ   rU   r%   r%   r&   Úliteral_list_indexŸ  s    rs  c                 C   s   t | tjƒrdd„ }|S d S )Nc                 S   s&   d}t | ƒD ]}||kr|d7 }q|S r1  r   )rè   rT  r°   r[   r%   r%   r&   rö   «  s
    
ú literal_list_count.<locals>.impl©r…   r   rr  )rè   rT  rö   r%   r%   r&   Úliteral_list_count¨  s    rv  c                 C   s   t | tjƒrdd„ }|S d S )Nc                 S   s   | S r,   r%   r.  r%   r%   r&   rö   ¶  s    rt  ru  )rè   rö   r%   r%   r&   rv  ³  s    c                 C   s   t | tjƒrt‚d S r,   )r…   r   rr  rc  rk  r%   r%   r&   Úliteral_list_delitemº  s    rw  c                 C   s   t | tjƒrt d¡‚d S )Nra  rq  )rè   r¹   r!   r%   r%   r&   Úliteral_list_setitem¿  s    rx  c                 G   s"   t | tjƒsd S d}t |¡‚d S )NzRCannot __getitem__ on a literal list, return type cannot be statically determined.rq  )rè   rœ   rU   r%   r%   r&   Úliteral_list_getitemÄ  s    ry  c                    s"   t | tjƒsd S | j‰ ‡ fdd„S )Nc                    s   ˆ S r,   r%   r.  ©Úlr%   r&   Ú<lambda>Ñ  ó    z"literal_list_len.<locals>.<lambda>)r…   r   rr  r°   r.  r%   rz  r&   Úliteral_list_lenÌ  s    r~  c                 C   s   t | tjƒrdd„ }|S d S )Nc                 S   s    t | ƒD ]}||kr dS qdS rí   r   )rè   r)  r[   r%   r%   r&   rö   Ö  s    z#literal_list_contains.<locals>.implru  )rè   r)  rö   r%   r%   r&   Úliteral_list_containsÓ  s    r  c                    sP   t |ƒt |ƒkrt‚t ˆ |t |ƒ¡}‡ ‡fdd„t|||ƒD ƒ}ˆ ˆ ||¡S )Nc                    s"   g | ]\}}}ˆ  ˆ |||¡‘qS r%   )rù   )r  r  ÚfÚt©r   r   r%   r&   r  ä  s   ÿz.literallist_to_literallist.<locals>.<listcomp>)r¼   rë   r   Zunpack_tupleÚzipZ
make_tuple)r   r   r^  r_  r[   Zolditemsr¾   r%   r‚  r&   Úliterallist_to_literallistÝ  s    
ÿr„  )NF)NF)rj  )NF)†rh   Úmathr  Ú	functoolsr   Zllvmliter   Z
numba.corer   r   r   r   Znumba.core.imputilsr   r	   r
   r   r   r   r   Znumba.core.extendingr   r   Z
numba.miscr   Znumba.cpythonr   Znumbar   r'   r*   Úobjectr+   rd   ri   r³   rÁ   r-  r\  rÉ   r¼   r  rË   rÍ   ZListIterZBORROWEDrÏ   r>   r8  rÑ   ry   ÚAnyrÓ   Z	SliceTyperÚ   Údelitemrê   rì   Úcontainsr÷   rð   rM  rõ   Útruthrø   rC   rý   Úiaddr   r  r  Úimulr  Úis_r  r  r  r  Úner  Úler"  rH  r$  Úger&  rG  r(  r*  r+  r0  r3  rÿ   r6  r}   Úmaxvalr;  r<  r=  r@  rC  rF  Zmake_jit_quicksortZrun_quicksortrW  rX  rY  rZ  rN  rR  r[  Úsortedr]  r`  r:  rc  rr  re  rf  rh  ri  rl  rn  ro  rp  Z
_index_endrs  rv  rw  rx  ry  r~  r  r„  r%   r%   r%   r&   Ú<module>   s.  $X  	(

	
	









<

"
	








	


	









ÿ








ÿÿ


	

























	