B
     \                  @   s  d Z ddlm  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 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#x"e#$ D ]\Z%Z&ee%fe&  qW eej'ej'dd Z(edd Z)dS )z=
Implementation of the range object for fixed-size integers.
    N)typescgutilsprange   )ListIterInstance)
make_array)lower_builtin
lower_castiterator_implimpl_ret_untracked)	signature)	intrinsic)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   5lib/python3.7/site-packages/numba/targets/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   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    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_lenN   s    z"make_range_impl.<locals>.range_lenZgetiterc                s2   |\}| ||}  | || }t| ||S )z 
        range.__iter__
        )r$   r   r   )r   r   r   r   r'   r   r(   )r)   r   range_iter_typer   r   getiter_range32_implX   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}|tj|
|}|tj||}|||}|tj||}t|| |j|td W dQ R X ||\}}| |||j W dQ R X |b ||
|}|||||}|tj||}|||
|||||}|||j W dQ R X W dQ R X |S )z[
            Create a RangeIter initialized from the given RangeState *state*.
            r   r   )zrange() arg 3 must not be zeroN)r   r   r   r   Zalloca_oncetypestoreiterr&   subr   icmplcICMP_SGTxorZICMP_EQZif_unlikelyZ	call_convZreturn_user_exc
ValueErrorZif_elseZsremZ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orelseZremZunevennewcount)r   r   r   r$   e   s@    

"z3make_range_impl.<locals>.RangeIter.from_range_statec       
   	      s   |  d}| j}||}|tj||}|| ||Z || j}|	| |  d}	|
|j||	dgd| |
||| j| j W d Q R X d S )Nr   r   Znsw)flags)r   r&   r%   r1   r2   r3   Z	set_validZif_thenr/   Zyield_r.   r0   r7   r   )
r9   r   r   resultr;   r:   r&   Zis_validr'   r<   )r   r   r   iternext   s    


z+make_range_impl.<locals>.RangeIter.iternextN)__name__
__module____qualname__classmethodr$   r@   r   )r   r   r   r)   b   s   /r)   )	r   r   r   ranger   r   lenr
   r   )r   r    r+   r!   r"   r#   r*   r,   r   )r)   r   r   r+   r    r   make_range_impl   s    


  

rG   c                s2   t  |d} fdd|D }t  |S )N   c                s    g | ]}  |jjqS r   )castZdtype).0v)r   r   fromtytotyr   r   
<listcomp>   s   z"range_to_range.<locals>.<listcomp>)r   unpack_tupleZmake_anonymous_struct)r   r   rL   rM   valZolditemsitemsr   )r   r   rL   rM   r   range_to_range   s    rR   c                sx   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 dS )z@
    An implementation of len(range_iter) for internal use.
    c                sB   |\}t   d }t|| ||}|jj}t| ||||jS )Nr   )range_impl_mapr   r   r&   r-   r   r%   )r   r   r   r   r'   Z	iter_typeiterobjr   )val_typer   r   codegen   s
    zrange_iter_len.<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   Zmake_helperZ
array_typer   Zarrayr   rO   shaper   )r   r   r   r   Zitertyr'   rZ   rT   ZarraytyZaryr[   r   r   r   rV      s    N)
isinstancer   ZRangeIteratorTypeZ
yield_typer   ZListIterrX   ZArrayIterator)Z	typingctxrP   rV   r   )rU   r   range_iter_len   s    
r]   )*__doc__Zllvmlite.llvmpy.coreZllvmpyZcorer2   Znumbar   r   r   Zlistobjr   Zarrayobjr   Zimputilsr   r	   r
   r   Znumba.typingr   Znumba.extendingr   Znumba.parforr   r   rG   Zint32Zrange_state32_typeZrange_iter32_typeZint64Zrange_state64_typeZrange_iter64_typeZuint64Zunsigned_range_state64_typeZunsigned_range_iter64_typerS   rQ   r   Zstate_typesZ	RangeTyperR   r]   r   r   r   r   <module>   s$    