o
    Td,                     @   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'ge(R   qie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 qd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   i/home/ncw/WWW/www-new/content/articles/pi-bbp/venv/lib/python3.10/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 d   n1 stw   Y  ||k\}}| |||j W d   n1 sw   Y  |5 ||
|}|||||}|d||}|||
|||||}|||j W d   n1 sw   Y  W d   |S W d   |S 1 sw   Y  |S )z[
            Create a RangeIter initialized from the given RangeState *state*.
            r   r   >z==)zrange() arg 3 must not be zeroN)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onepos_diffpos_stepsign_differs	zero_stepthenorelseremunevennewcountr%   r   r   r*   f   sV   



z3make_range_impl.<locals>.RangeIter.from_range_statec           
         s   |  d}| j}||}|d||}|| ||3 || j}|| |  d}	||j	||	dgd| ||
|| j| j W d    d S 1 sUw   Y  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   rX   r   r   iternext   s   


"z+make_range_impl.<locals>.RangeIter.iternextN)__name__
__module____qualname__classmethodr*   r`   r   rX   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&   



		rg   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   rn   ro   valolditemsitemsr   rm   r   range_to_range   s
   rv   c                    s   t |tjr|j  fdd}t ||fS t |tjr(dd }ttj||fS t |tjr:dd }ttj||fS t |tjrLdd }ttj||fS t |tj	r^dd }ttj||fS d}t
|)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%   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_try   r   r   r   r|      s   c                 S   sd   |j \}|\}| tj}| j|||d}|j}t|| ||jd}	t	||	j
}
t| |||
d S )N)r.   r   )r!   r}   r   r~   make_helper
array_typer   arrayr   rq   shaper   )r   r   r    r!   itertyr.   r   ry   arraytyaryr   r   r   r   r|      s   c                 S   s2   |j \}|j}| tj}||j}t| |||S N)r!   	containerr}   r   r~   r,   r   )r   r   r    r!   r   tupletyr   count_constr   r   r   r|      s
   
c                 S   sB   |\}|  tj}ddlm} || ||jd |}t| |||jS )Nr   r   )r}   r   r~   numba.typed.listobjectr   r!   r   r   )r   r   r    r!   r.   r   r   ry   r   r   r   r|      s
   zdUnsupported iterator found in array comprehension, try preallocating the array and filling manually.)
isinstancer   RangeIteratorType
yield_typer   ListIterr~   ArrayIteratorUniTupleIterListTypeIteratorTyper   TypingError)	typingctxrs   r|   msgr   rz   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 )Nrh   )r   rq   r   return_type)r   r   r    r!   rs   ru   indexr   r   r|      s
   
z?make_range_attr.<locals>.rangetype_attr_getter.<locals>.codegen)r   r   	RangeTyper   rj   )r   ar|   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 r"|| jks || jkr"dS || j | j  dkS )Nr   F)r   r   r   robjrs   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r#dd }|S t |tjr/dd }|S t |tjs7|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 )Nr   r   F)r   intr   r   r   r   impl  s   zimpl_contains.<locals>.implc                 S   s0   |j dkrdS |jd dkrdS t| t|jS )Nr   Fr   )imagrealr   r   r   r   r   r   r     s
   
)	r   r   r   IntegerBooleanr   FloatComplexNumber)r   rs   r   r   r   r   r   impl_contains	  s   r   )r   r   r   )r   r   )3__doc__operatornumbar   
numba.corer   r   r   numba.cpython.listobjr   numba.np.arrayobjr   numba.core.imputilsr	   r
   r   r   numba.core.typingr   numba.core.extendingr   r   r   r   numba.parfors.parforr   r   rg   int32range_state32_typerange_iter32_typeint64range_state64_typerange_iter64_typeuint64unsigned_range_state64_typeunsigned_range_iter64_typerw   ru   r%   state_typesr   rv   r   r   r   containsr   	enumerateixattrr   r   r   r   <module>   s>     

7
	
 