o
    Td$                     @   s8  d 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mZmZmZmZmZmZmZ dd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zeeeejdd Zeejddd Zeejddd Z eejddd Z!edejej"d d! Z#d"d# Z$eejd$d% Z%eej&j'ejd&d' Z(d(S ))z2
Implement slices and various slice computations.
    )zip_longest)ir)cgutilstypestypingutils)impl_ret_borrowedimpl_ret_new_refimpl_ret_untrackediternext_impllower_builtin
lower_castlower_constantlower_getattrc                 C   s2   |  d|t|jd}| ||}| |||S )z^
    Fix negative index by adding *size* to it.  Positive
    indices are left untouched.
    <r   )icmp_signedr   Constanttypeaddselect)builderidxsizeis_negativewrapped_index r   h/home/ncw/WWW/www-new/content/articles/pi-bbp/venv/lib/python3.10/site-packages/numba/cpython/slicing.py	fix_index   s   r   c           	   	      s  t jdt jd} fdd} t jW\}}| |d |d W d   n1 s=w   Y  | |} |}|d|| |d|| W d   n1 scw   Y  W d   dS W d   dS 1 s{w   Y  dS )z
    Fix *slice* start and stop to be valid (inclusive and exclusive, resp)
    indexing bounds for a sequence of the given *size*.
    r   c                    s   t | }t |}t| |  d|} j|dd t| | W d    n1 s0w   Y   d|} j|dd t| | W d    d S 1 sUw   Y  d S )Nr   Flikely>=)getattrr   setattrr   if_then)
bound_name
lower_repl
upper_replbound	underflowoverflowr   r   slicezeror   r   	fix_bound"   s   
"zfix_slice.<locals>.fix_boundstartstopN)r   r   r   if_elser   
is_neg_intstepr   )	r   r,   r   	minus_oner.   if_neg_stepif_pos_steplowerupperr   r+   r   	fix_slice   s"   "r9   c              	   C   s   |j }|j}|j}t|jd}t|jd}t| |}| ||}| ||}	| 	||}
| 
||
|	}| 	|| ||}| 
|| d||| d||}| 
|||S )a   
    Given a slice, compute the number of indices it spans, i.e. the
    number of iterations that for_range_slice() will execute.

    Pseudo-code:
        assert step != 0
        if step > 0:
            if stop <= start:
                return 0
            else:
                return (stop - start - 1) // step + 1
        else:
            if stop >= start:
                return 0
            else:
                return (stop - start + 1) // step + 1

    (see PySlice_GetIndicesEx() in CPython)
       r   r!   z<=)r/   r0   r3   r   r   r   r   r2   subr   r   sdivr   )r   slicestructr/   r0   r3   oner-   is_step_negativedeltapos_dividendneg_dividenddividendnominal_lengthis_zero_lengthr   r   r   get_slice_length=   s    rF   c           	      C   sd   |j }|j}|d}|d}| d|j|}| || |||}| || |||}||fS )z?
    Return the [lower, upper) indexing bounds of a slice.
    r   r:   r   )r/   r0   r   r   r3   r   r   )	r   r=   r/   r0   r-   r>   r?   r7   r8   r   r   r   get_slice_boundsi   s   

rG   c                 C   s   |  |j|S )z4
    Fix the given stride for the slice's step.
    )mulr3   )r   r,   strider   r   r   
fix_stride{   s   rJ   c                 C   s$   |j rt| ||jtdf dS dS )zP
    Guard against *slicestruct* having a zero step (and raise ValueError).
    slice step cannot be zeroN)has_stepr   
guard_nullr3   
ValueError)contextr   typr=   r   r   r   guard_invalid_slice   s
   rQ   c                 C   s&   d| j d > d }d||| d dfS )z
    Get the default values for a slice's members:
    (start for positive step, start for negative step,
     stop for positive step, stop for negative step, step)
    r:   r   )address_size)rO   maxintr   r   r   get_defaults   s   rT   c                    s    fddt  D \}}}}}d gd t|dkr*|jd tjur*|d d< ntt|j|D ]\}	\}
}|
tjurA||	< q2fdd}|d|}|d	| tj	d}|
|||}|
|||}|d|}|d|}|j}
 ||j}||_||_||_| }t ||j|S )
Nc                       g | ]	}  tj|qS r   get_constantr   intp.0xrO   r   r   
<listcomp>       z*slice_constructor_impl.<locals>.<listcomp>   r:   r   c                    s    |  }|d u r
|S |S Nr   )idefaultval)
slice_argsr   r   get_arg_value   s   z-slice_constructor_impl.<locals>.get_arg_value   r   )rT   lenargsr   none	enumeratezipr   rW   rX   r   return_typemake_helperr/   r0   r3   	_getvaluer
   )rO   r   sigrh   default_start_posdefault_start_negdefault_stop_posdefault_stop_negdefault_stepra   tyrc   re   r3   r?   default_stopdefault_startr0   r/   sliresr   )rO   rd   r   slice_constructor_impl   sD   




rz   r/   c                 C      |  |||}|jS r`   )rm   r/   rO   r   rP   valuerx   r   r   r   slice_start_impl      r~   r0   c                 C   r{   r`   )rm   r0   r|   r   r   r   slice_stop_impl   r   r   r3   c                 C   s(   |j r| |||}|jS | tjdS )Nr:   )rL   rm   r3   rW   r   rX   r|   r   r   r   slice_step_impl   s   r   zslice.indicesc                 C   s   |d }|  ||jd |d }|jt||dd | j|td W d    n1 s.w   Y  |jt||j	dd | j|td W d    n1 sRw   Y  t
||| | ||j|j|j|j	fS )Nr:   r   Fr   )zlength should not be negative)rK   )rm   rh   r$   r   r2   	call_convreturn_user_excrN   is_scalar_zeror3   r9   
make_tuplerl   r/   r0   )rO   r   ro   rh   lengthrx   r   r   r   slice_indices   s(   r   c                    s     ||} tj} fddt D \}}}}	}
|j}|d u r(d}|
}n|dk }||}|j}|d u r?|r<|}n|}n||}|j}|d u rR|rO|	}n|}n||}||_||_||_| S )Nc                    rU   r   rV   rY   r\   r   r   r]      r^   z,make_slice_from_constant.<locals>.<listcomp>Fr   )	rm   get_value_typer   rX   rT   r3   r/   r0   rn   )rO   r   ru   pyvalrx   ltyrp   rq   rr   rs   rt   r3   step_is_negr/   r0   r   r\   r   make_slice_from_constant   s>   r   c                 C   s&   t |tjr
|j}n|}t| |||S r`   )
isinstancer   Literalliteral_typer   )rO   r   ru   r   rP   r   r   r   constant_slice   s   r   c                 C   s   t | |||jS r`   )r   literal_value)rO   r   fromtytotyrc   r   r   r   cast_from_literal*  s   
r   N))__doc__	itertoolsr   llvmliter   
numba.corer   r   r   r   numba.core.imputilsr   r	   r
   r   r   r   r   r   r   r9   rF   rG   rJ   rQ   rT   r,   VarArgAnyrz   	SliceTyper~   r   r   Integerr   r   r   miscSliceLiteralr   r   r   r   r   <module>   s6    (
$,	

/





-
	