U
    hâËdÜ,  ã                   @   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   úO/home/sam/Atlas/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_lenZ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   Zalloca_onceÚtypeÚstoreÚiterr,   Úsubr   Úicmp_signedÚxorZicmp_unsignedZif_unlikelyZ	call_convZreturn_user_excÚ
ValueErrorZif_elseZsremÚselectÚnegÚaddZsdiv)Úclsr   r   r"   Úselfr   r   r   ZstartptrÚcountptrÚdiffÚzeroÚoneZpos_diffZpos_stepZsign_differsZ	zero_stepZthenZ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   r4   r   Znsw)Úflags)r   r,   r+   r9   Z	set_validZif_thenr7   Zyield_r6   r8   r>   r   )
r@   r   r   ÚresultrC   rA   r,   Zis_validr.   rD   rG   r   r   Úiternext•   s    


z+make_range_impl.<locals>.RangeIter.iternextN)Ú__name__Ú
__module__Ú__qualname__Úclassmethodr*   rJ   r   rG   r   r   r0   c   s   .r0   )	r   r   r	   Úranger   r   Úlenr   r   )r%   r&   r2   r'   r(   r)   r1   r3   r   )r0   r$   r%   r2   r&   r   Úmake_range_impl   s&    



		rQ   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_tupleZmake_anonymous_struct)r   r   rX   rY   ÚvalZolditemsÚitemsr   rW   r   Úrange_to_range®   s
    ÿr^   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,   r5   r   r+   )r   r   r    r!   r.   Z	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_tr`   r   r   r   rb   Å   s    c                 S   sd   |j \}|\}|  tj¡}| j|||d�}|j}t|ƒ| ||jd�}	t 	||	j
¡}
t| |||
d ƒS )N)r.   r   )r!   rc   r   rd   Zmake_helperZ
array_typer   Úarrayr   r[   Úshaper   )r   r   r    r!   Úitertyr.   rf   r`   ZarraytyZaryrh   r   r   r   rb   Ì   s    c                 S   s2   |j \}|j}|  tj¡}||jƒ}t| |||ƒS ©N)r!   Ú	containerrc   r   rd   r,   r   )r   r   r    r!   ri   Ztupletyrf   Zcount_constr   r   r   rb   Ø   s
    
c                 S   sB   |\}|   tj¡}ddlm} || ||jd |ƒ}t| |||jƒS )Nr   r   )rc   r   rd   Znumba.typed.listobjectr   r!   r   re   )r   r   r    r!   r.   rf   r   r`   r   r   r   rb   á   s
    zdUnsupported iterator found in array comprehension, try preallocating the array and filling manually.N)Ú
isinstancer   ZRangeIteratorTypeZ
yield_typer   ZListIterrd   ZArrayIteratorZUniTupleIterZListTypeIteratorTyper   ZTypingError)Ú	typingctxr\   rb   Úmsgr   ra   r   Úlength_of_iteratorµ   s$    
ro   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 )NrR   )r   r[   r   Úreturn_type)r   r   r    r!   r\   r]   ©Úindexr   r   rb   ñ   s
    
ÿz?make_range_attr.<locals>.rangetype_attr_getter.<locals>.codegen)rl   r   Ú	RangeTyper   rT   )rm   Úarb   rq   r   r   Úrangetype_attr_getterî   s    z.make_range_attr.<locals>.rangetype_attr_getterc                    s   ‡ fdd„}|S )Nc                    s   ˆ | ƒS rj   r   )Úrnge©ru   r   r   Úgetú   s    z0make_range_attr.<locals>.range_attr.<locals>.getr   )rv   rx   rw   r   r   Ú
range_attrø   s    z#make_range_attr.<locals>.range_attr)r   r   r   rs   )rr   Ú	attributery   r   )rr   ru   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   ©Úrobjr\   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
    
)	rl   r   rs   ÚIntegerÚBooleanr~   ÚFloatÚComplexÚNumber)r}   r\   r   r�   r   r   r   Úimpl_contains	  s    r‰   )r   r   r   )rr   rz   )3Ú__doc__ÚoperatorZnumbar   Z
numba.corer   r   r   Znumba.cpython.listobjr   Znumba.np.arrayobjr   Znumba.core.imputilsr	   r
   r   r   Znumba.core.typingr   Znumba.core.extendingr   r   r   r   Znumba.parfors.parforr   r   rQ   Zint32Zrange_state32_typeZrange_iter32_typeZint64Zrange_state64_typeZrange_iter64_typeZuint64Zunsigned_range_state64_typeZunsigned_range_iter64_typer_   r]   r%   Zstate_typesrs   r^   ro   r{   r~   Úcontainsr‰   Ú	enumerateZixÚattrr   r   r   r   Ú<module>   s@     
 
 
ý

7
	
 