a
    ¾·DfÛ$  ã                   @   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ÚsizeZis_negativeZwrapped_index© r   úb/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/numba/cpython/slicing.pyÚ	fix_index   s    r   c           	   	      sò   t  ˆjd¡‰t  ˆjd¡}‡ ‡‡‡fdd„}ˆ  t ˆ ˆj¡¡œ\}}|( |dˆˆƒ |dˆˆƒ W d  ƒ n1 sz0    Y  |8 |}ˆ  ˆ|¡}|d||ƒ |d||ƒ W d  ƒ n1 sÆ0    Y  W d  ƒ n1 sä0    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 s`0    Y  ˆ  d|ˆ¡}ˆ j|dd tˆ| |ƒ W d   ƒ n1 s¨0    Y  d S )Nr   F©Zlikelyú>=)Úgetattrr   Úsetattrr   Úif_then)Z
bound_nameZ
lower_replZ
upper_replÚboundZ	underflowZoverflow©r   r   ÚsliceÚzeror   r   Ú	fix_bound"   s    
*zfix_slice.<locals>.fix_boundÚstartÚstopN)r   r   r   Zif_elser   Ú
is_neg_intÚstepr   )	r   r$   r   Z	minus_oner&   Zif_neg_stepZif_pos_stepÚlowerÚupperr   r#   r   Ú	fix_slice   s    *r-   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'   r(   r*   r   r   r   r   r)   Úsubr   r   Zsdivr   )r   Úslicestructr'   r(   r*   Úoner%   Úis_step_negativeÚdeltaZpos_dividendZneg_dividendZdividendZnominal_lengthZis_zero_lengthr   r   r   Úget_slice_length=   s     þr4   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'   r(   r   r   r*   r   r   )	r   r0   r'   r(   r%   r1   r2   r+   r,   r   r   r   Úget_slice_boundsi   s    

ÿÿr5   c                 C   s   |   |j|¡S )z4
    Fix the given stride for the slice's step.
    )Úmulr*   )r   r$   Zstrider   r   r   Ú
fix_stride{   s    r7   c                 C   s    |j rt | ||jtdf¡ dS )zP
    Guard against *slicestruct* having a zero step (and raise ValueError).
    úslice step cannot be zeroN)Úhas_stepr   Z
guard_nullr*   Ú
ValueError)Úcontextr   Útypr0   r   r   r   Úguard_invalid_slice   s    ÿr=   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   )Zaddress_size)r;   Zmaxintr   r   r   Úget_defaultsŠ   s    r>   c                    s   ‡ fdd„t ˆ ƒD ƒ\}}}}}d gd ‰t|ƒdkrT|jd tjurT|d ˆd< n0tt|j|ƒƒD ]\}	\}
}|
tjurd|ˆ|	< qd‡fdd„}|d|ƒ}| d	|ˆ  tj	d¡¡}| 
|||¡}| 
|||¡}|d|ƒ}|d|ƒ}|j}
ˆ  ||j¡}||_||_||_| ¡ }tˆ ||j|ƒS )
Nc                    s   g | ]}ˆ   tj|¡‘qS r   ©Úget_constantr   Úintp©Ú.0Úx©r;   r   r   Ú
<listcomp>Ÿ   ó    z*slice_constructor_impl.<locals>.<listcomp>é   r.   r   c                    s   ˆ |  }|d u r|S |S d S ©Nr   )ÚiÚdefaultÚval)Ú
slice_argsr   r   Úget_arg_value¬   s    z-slice_constructor_impl.<locals>.get_arg_valueé   r   )r>   ÚlenÚargsr   ÚnoneÚ	enumerateÚzipr   r@   rA   r   Úreturn_typeÚmake_helperr'   r(   r*   Ú	_getvaluer
   )r;   r   ÚsigrQ   Údefault_start_posÚdefault_start_negÚdefault_stop_posÚdefault_stop_negÚdefault_steprJ   ÚtyrL   rN   r*   r2   Zdefault_stopZdefault_startr(   r'   ÚsliÚresr   )r;   rM   r   Úslice_constructor_impl—   sB    ú



ÿÿÿ

ra   r'   c                 C   s   |   |||¡}|jS rI   )rV   r'   ©r;   r   r<   Úvaluer_   r   r   r   Úslice_start_implÇ   s    rd   r(   c                 C   s   |   |||¡}|jS rI   )rV   r(   rb   r   r   r   Úslice_stop_implÌ   s    re   r*   c                 C   s,   |j r|  |||¡}|jS |  tjd¡S d S )Nr.   )r9   rV   r*   r@   r   rA   rb   r   r   r   Úslice_step_implÑ   s    rf   zslice.indicesc                 C   sÖ   |d }|   ||jd |d ¡}|jt ||¡dd  | j |td¡ W d   ƒ n1 s\0    Y  |jt ||j	¡dd  | j |td¡ W d   ƒ n1 s¤0    Y  t
|||ƒ |  ||j|j|j|j	f¡S )Nr.   r   Fr   )zlength should not be negative)r8   )rV   rQ   r!   r   r)   Z	call_convZreturn_user_excr:   Zis_scalar_zeror*   r-   Z
make_tuplerU   r'   r(   )r;   r   rX   rQ   Úlengthr_   r   r   r   Úslice_indicesÚ   s$    þ"þ"ýrh   c                    sÆ   ˆ   ||¡}ˆ  tj¡}‡ fdd„tˆ ƒD ƒ\}}}}	}
|j}|d u rPd}|
}n|dk }||ƒ}|j}|d u r~|rx|}q†|}n||ƒ}|j}|d u r¤|rž|	}q¬|}n||ƒ}||_||_||_| ¡ S )Nc                    s   g | ]}ˆ   tj|¡‘qS r   r?   rB   rE   r   r   rF   ý   rG   z,make_slice_from_constant.<locals>.<listcomp>Fr   )	rV   Zget_value_typer   rA   r>   r*   r'   r(   rW   )r;   r   r^   Úpyvalr_   ZltyrY   rZ   r[   r\   r]   r*   Zstep_is_negr'   r(   r   rE   r   Úmake_slice_from_constantó   s>    úrj   c                 C   s&   t |tjƒr|j}n|}t| |||ƒS rI   )Ú
isinstancer   ÚLiteralZliteral_typerj   )r;   r   r^   ri   r<   r   r   r   Úconstant_slice   s    rm   c                 C   s   t | |||jƒS rI   )rj   Zliteral_value)r;   r   ZfromtyZtotyrL   r   r   r   Úcast_from_literal*  s    
ÿrn   N))Ú__doc__Ú	itertoolsr   Zllvmliter   Z
numba.corer   r   r   r   Znumba.core.imputilsr   r	   r
   r   r   r   r   r   r   r-   r4   r5   r7   r=   r>   r$   ZVarArgÚAnyra   Z	SliceTyperd   re   rf   ZIntegerrh   rj   rm   ÚmiscZSliceLiteralrn   r   r   r   r   Ú<module>   s4   (
$,	
/






-
	