U
    ì¾|eÜ,  ã                   @   sV  d Z ddlZddlmZ ddl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dlmZ dd	lmZmZmZmZ dd
lmZ dd„ Zdd„ Zejejejfejej ej!fej"ej#ej$fiZ%e% &¡ D ]\Z'Z(ee'fe(žŽ  qÒeej)ej)ƒdd„ ƒZ*edd„ ƒZ+dd„ Z,edd„ ƒZ-eej.ƒdd„ ƒZ/e0dƒD ]\Z1Z2e,e1e2d� �q:dS )z=
Implementation of the range object for fixed-size integers.
é    N)Úprange)ÚtypesÚcgutilsÚerrors©ÚListIterInstance)Ú
make_array)Úlower_builtinÚ
lower_castÚiterator_implÚimpl_ret_untracked)Ú	signature)Ú	intrinsicÚoverloadÚoverload_attributeÚregister_jitable)Úinternal_prangec                 C   s
   t  | ¡S )zn
    Return the Structure representation of the given *typ* (an
    instance of types.RangeIteratorType).
    )r   Úcreate_struct_proxy)Útyp© r   úS/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/cpython/rangeobj.pyÚmake_range_iterator   s    r   c                    sþ   t  ˆ¡‰ttˆƒttˆƒttˆƒ‡‡‡fdd„ƒƒƒ}ttˆˆƒttˆˆƒttˆˆƒ‡‡‡fdd„ƒƒƒ}ttˆˆˆƒttˆˆˆƒttˆˆˆƒ‡‡fdd„ƒƒƒ}ttˆƒ‡ ‡‡fdd„ƒ}td	ˆƒ‡ ‡‡fd
d„ƒ}tˆˆƒG ‡fdd„dtˆƒƒƒ‰ d S )Nc                    sD   |\}ˆ | |ƒ}|   ˆd¡|_||_|   ˆd¡|_t| |ˆ| ¡ ƒS )z2
        range(stop: int) -> range object
        r   é   )Úget_constantÚstartÚstopÚstepr   Ú	_getvalue)ÚcontextÚbuilderÚsigÚargsr   Ústate©Ú
RangeStateÚint_typeÚrange_state_typer   r   Úrange1_impl   s    
ýz$make_range_impl.<locals>.range1_implc                    s>   |\}}ˆ | |ƒ}||_ ||_|  ˆd¡|_t| |ˆ| ¡ ƒS )z>
        range(start: int, stop: int) -> range object
        r   )r   r   r   r   r   r   )r   r   r    r!   r   r   r"   r#   r   r   Úrange2_impl-   s    
ýz$make_range_impl.<locals>.range2_implc                    s8   |\}}}ˆ | |ƒ}||_ ||_||_t| |ˆ| ¡ ƒS )zI
        range(start: int, stop: int, step: int) -> range object
        )r   r   r   r   r   )r   r   r    r!   r   r   r   r"   )r$   r&   r   r   Úrange3_impl>   s    

ýz$make_range_impl.<locals>.range3_implc                    s6   |\}ˆ| ||ƒ}ˆ   | ||¡}t| |ˆ| |j¡ƒS )z
        len(range)
        )Úfrom_range_stater   ÚloadÚcount©r   r   r    r!   Úvaluer"   Úres)Ú	RangeIterr$   r%   r   r   Ú	range_lenO   s    z"make_range_impl.<locals>.range_lenÚgetiterc                    s2   |\}ˆ| ||ƒ}ˆ   | ||¡ ¡ }t| |ˆ|ƒS )z 
        range.__iter__
        )r*   r   r   r-   )r0   r$   Úrange_iter_typer   r   Úgetiter_range32_implY   s    z-make_range_impl.<locals>.getiter_range32_implc                       s(   e Zd Ze‡ fdd„ƒZ‡ fdd„ZdS )z"make_range_impl.<locals>.RangeIterc              
      s„  | ||ƒ}|j }|j}|j}t ||j¡}| ||¡ t ||j¡}	||_||_||_|	|_| 	||¡}
| 
ˆ d¡}| 
ˆ d¡}| d|
|¡}| d||¡}| ||¡}| d||¡}t ||¡� |j |td¡ W 5 Q R X | |¡�’\}}|� | ||j¡ W 5 Q R X |�` | |
|¡}| ||| |¡¡}| d||¡}| | |
|¡| |||¡¡}| ||j¡ W 5 Q R X W 5 Q R X |S )z[
            Create a RangeIter initialized from the given RangeState *state*.
            r   r   ú>z==)zrange() arg 3 must not be zero)r   r   r   r   Úalloca_onceÚtypeÚstoreÚiterr,   Úsubr   Úicmp_signedÚxorÚicmp_unsignedÚif_unlikelyÚ	call_convÚreturn_user_excÚ
ValueErrorÚif_elseÚsremÚselectÚnegÚaddÚsdiv)Úclsr   r   r"   Úselfr   r   r   ÚstartptrÚcountptrÚdiffÚzeroÚoneZpos_diffZpos_stepZsign_differsZ	zero_stepÚthenÚorelseÚremZunevenÚnewcount©r%   r   r   r*   f   sD    

ÿÿ"z3make_range_impl.<locals>.RangeIter.from_range_statec           
   	      s¢   |  ˆ d¡}| j}| |¡}| d||¡}| |¡ | |¡�Z | | j¡}| |¡ |  ˆ d¡}	| |j	||	dgd�|¡ | | 
|| j¡| j¡ W 5 Q R X d S )Nr   r5   r   Únsw)Úflags)r   r,   r+   r;   Ú	set_validÚif_thenr9   Úyield_r8   r:   rF   r   )
rI   r   r   ÚresultrM   rK   r,   Úis_validr.   rN   rS   r   r   Úiternext•   s    


z+make_range_impl.<locals>.RangeIter.iternextN)Ú__name__Ú
__module__Ú__qualname__Úclassmethodr*   r[   r   rS   r   r   r0   c   s   .r0   )	r   r   r	   Úranger   r   Úlenr   r   )r%   r&   r3   r'   r(   r)   r1   r4   r   )r0   r$   r%   r3   r&   r   Úmake_range_impl   s&    



		rb   c                    s2   t  ˆ |d¡}‡ ‡‡‡fdd„|D ƒ}t  ˆ |¡S )Né   c                    s    g | ]}ˆ  ˆ |ˆjˆj¡‘qS r   )ÚcastÚdtype)Ú.0Úv©r   r   ÚfromtyÚtotyr   r   Ú
<listcomp>±   s   ÿz"range_to_range.<locals>.<listcomp>)r   Úunpack_tupleÚmake_anonymous_struct)r   r   ri   rj   ÚvalÚolditemsÚitemsr   rh   r   Úrange_to_range®   s
    ÿrq   c                    sÎ   t |tjƒr,|j‰ ‡ fdd„}tˆ |ƒ|fS t |tjƒrPdd„ }ttj|ƒ|fS t |tjƒrtdd„ }ttj|ƒ|fS t |tjƒr˜dd„ }ttj|ƒ|fS t |tj	ƒr¼dd„ }ttj|ƒ|fS d}t
 |¡‚dS )	z€
    An implementation of len(iter) for internal use.
    Primary use is for array comprehensions (see inline_closurecall).
    c                    sB   |\}t ˆ  d }t |¡| ||ƒ}|jj}t| ||| |j¡ƒS )Nr   )Úrange_impl_mapr   r   r,   r7   r   r+   )r   r   r    r!   r.   Ú	iter_typeÚiterobjr%   ©Zval_typer   r   Úcodegen½   s
    z#length_of_iterator.<locals>.codegenc                 S   s6   |\}|   tj¡}t| ||jd |ƒ}t| |||jƒS )Nr   )Úget_value_typer   Úintpr   r!   r   Úsize)r   r   r    r!   r.   Úintp_trt   r   r   r   rv   Å   s    c                 S   sd   |j \}|\}|  tj¡}| j|||d�}|j}t|ƒ| ||jd�}	t 	||	j
¡}
t| |||
d ƒS )N)r.   r   )r!   rw   r   rx   Úmake_helperÚ
array_typer   Úarrayr   rl   Úshaper   )r   r   r    r!   Úitertyr.   rz   rt   ÚarraytyÚaryr~   r   r   r   rv   Ì   s    c                 S   s2   |j \}|j}|  tj¡}||jƒ}t| |||ƒS ©N)r!   Ú	containerrw   r   rx   r,   r   )r   r   r    r!   r   Ztupletyrz   Zcount_constr   r   r   rv   Ø   s
    
c                 S   sB   |\}|   tj¡}ddlm} || ||jd |ƒ}t| |||jƒS )Nr   r   )rw   r   rx   Znumba.typed.listobjectr   r!   r   ry   )r   r   r    r!   r.   rz   r   rt   r   r   r   rv   á   s
    zdUnsupported iterator found in array comprehension, try preallocating the array and filling manually.N)Ú
isinstancer   ÚRangeIteratorTypeÚ
yield_typer   ÚListIterrx   ÚArrayIteratorÚUniTupleIterÚListTypeIteratorTyper   ÚTypingError)Ú	typingctxrn   rv   Úmsgr   ru   r   Úlength_of_iteratorµ   s$    
rŽ   c                    s,   t ‡ fdd„ƒ‰ttj|ƒ‡fdd„ƒ}d S )Nc                    s,   t |tjƒr(‡ fdd„}t|j|ƒ|fS d S )Nc                    s(   |\}t  ||d¡}t| ||j|ˆ  ƒS )Nrc   )r   rl   r   Úreturn_type)r   r   r    r!   rn   rp   ©Úindexr   r   rv   ñ   s
    
ÿz?make_range_attr.<locals>.rangetype_attr_getter.<locals>.codegen)r„   r   Ú	RangeTyper   re   )rŒ   Úarv   r�   r   r   Úrangetype_attr_getterî   s    z.make_range_attr.<locals>.rangetype_attr_getterc                    s   ‡ fdd„}|S )Nc                    s   ˆ | ƒS r‚   r   )Úrnge©r”   r   r   Úgetú   s    z0make_range_attr.<locals>.range_attr.<locals>.getr   )r•   r—   r–   r   r   Ú
range_attrø   s    z#make_range_attr.<locals>.range_attr)r   r   r   r’   )r‘   Ú	attributer˜   r   )r‘   r”   r   Úmake_range_attrí   s    	
rš   c                 C   sX   | j dkr"|| jk s|| jkr"dS | j dk rD|| jks@|| jkrDdS || j | j  dkS )Nr   F)r   r   r   ©Úrobjrn   r   r   r   Úimpl_contains_helperÿ   s
    r�   c                 C   sr   dd„ }t | tjƒsd S t |tjtjfƒr.tS t |tjƒrFdd„ }|S t |tjƒr^dd„ }|S t |tjƒsn|S d S )Nc                 S   s   dS )NFr   r›   r   r   r   Ú
impl_false  s    z!impl_contains.<locals>.impl_falsec                 S   s"   |d dkrdS t | t|ƒƒS d S )Nr   r   F)r�   Úintr›   r   r   r   Úimpl  s    zimpl_contains.<locals>.implc                 S   s4   |j dkrdS |jd dkr dS t| t|jƒƒS d S )Nr   Fr   )ÚimagÚrealr�   rŸ   r›   r   r   r   r      s
    
)	r„   r   r’   ÚIntegerÚBooleanr�   ÚFloatÚComplexÚNumber)rœ   rn   rž   r    r   r   r   Úimpl_contains	  s    r¨   )r   r   r   )r‘   r™   )3Ú__doc__ÚoperatorÚnumbar   Ú
numba.corer   r   r   Znumba.cpython.listobjr   Znumba.np.arrayobjr   Únumba.core.imputilsr	   r
   r   r   Únumba.core.typingr   Únumba.core.extendingr   r   r   r   Znumba.parfors.parforr   r   rb   Úint32Úrange_state32_typeÚrange_iter32_typeÚint64Úrange_state64_typeÚrange_iter64_typeÚuint64Úunsigned_range_state64_typeÚunsigned_range_iter64_typerr   rp   r%   Ústate_typesr’   rq   rŽ   rš   r�   Úcontainsr¨   Ú	enumerateÚixÚattrr   r   r   r   Ú<module>   s@     
 
 
ý

7
	
 