U
    ,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(  qe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   :/tmp/pip-unpacked-wheel-eu7e0c37/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countptrZ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   resultrB   rA   r,   Zis_validr.   rC   rF   r   r   iternext   s    


z+make_range_impl.<locals>.RangeIter.iternextN)__name__
__module____qualname__classmethodr*   rI   r   rF   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&    



		rP   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   rW   rX   valZolditemsitemsr   rV   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rdd }ttj||fS t |tj	rd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   ra      s    c                 S   sd   |j \}|\}| tj}| j|||d}|j}t|| ||jd}	t	||	j
}
t| |||
d S )N)r.   r   )r!   rb   r   rc   Zmake_helperZ
array_typer   arrayr   rZ   shaper   )r   r   r    r!   itertyr.   re   r_   ZarraytyZaryrg   r   r   r   ra      s    c                 S   s2   |j \}|j}| tj}||j}t| |||S N)r!   	containerrb   r   rc   r,   r   )r   r   r    r!   rh   Ztupletyre   Zcount_constr   r   r   ra      s
    
c                 S   sB   |\}|  tj}ddlm} || ||jd |}t| |||jS )Nr   r   )rb   r   rc   Znumba.typed.listobjectr   r!   r   rd   )r   r   r    r!   r.   re   r   r_   r   r   r   ra      s
    zdUnsupported iterator found in array comprehension, try preallocating the array and filling manually.N)
isinstancer   ZRangeIteratorTypeZ
yield_typer   ZListIterrc   ZArrayIteratorZUniTupleIterZListTypeIteratorTyper   ZTypingError)	typingctxr[   ra   msgr   r`   r   length_of_iterator   s$    
rn   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 )NrQ   )r   rZ   r   return_type)r   r   r    r!   r[   r\   indexr   r   ra      s
    
z?make_range_attr.<locals>.rangetype_attr_getter.<locals>.codegen)rk   r   	RangeTyper   rS   )rl   ara   rp   r   r   rangetype_attr_getter   s    z.make_range_attr.<locals>.rangetype_attr_getterc                    s    fdd}|S )Nc                    s    | S ri   r   )rngert   r   r   get   s    z0make_range_attr.<locals>.range_attr.<locals>.getr   )ru   rw   rv   r   r   
range_attr   s    z#make_range_attr.<locals>.range_attr)r   r   r   rr   )rq   	attributerx   r   )rq   rt   r   make_range_attr   s    	
rz   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
    
)	rk   r   rr   ZIntegerBooleanr}   ZFloatComplexNumber)r|   r[   r~   r   r   r   r   impl_contains	  s    r   )r   r   r   )rq   ry   )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   rP   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_typesrr   r]   rn   rz   r}   containsr   	enumerateixattrr   r   r   r   <module>   s@     
 
 


7
	
 