U
    hâËdÛ$  ã                   @   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   úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cpython/slicing.pyÚ	fix_index   s    r   c           	   
      s¶   t  ˆjd¡‰t  ˆjd¡}‡ ‡‡‡fdd„}ˆ  t ˆ ˆj¡¡�j\}}|� |dˆˆƒ |dˆˆƒ W 5 Q R X |�. |}ˆ  ˆ|¡}|d||ƒ |d||ƒ W 5 Q R X W 5 Q R X 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 5 Q R X ˆ  d|ˆ¡}ˆ j|dd�� tˆ| |ƒ W 5 Q R X d S )Nr   F©Zlikelyú>=)Úgetattrr   Úsetattrr   Úif_then)Z
bound_nameZ
lower_replZ
upper_replÚboundZ	underflowÚ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     þr5   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   r1   r(   r)   r&   r2   r3   r,   r-   r   r   r   Úget_slice_boundsi   s    


 ÿ
 ÿr6   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    r8   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   Útypr1   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k	rT|d ˆd< n0tt|j|ƒƒD ]\}	\}
}|
tjk	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>Ÿ   s     z*slice_constructor_impl.<locals>.<listcomp>é   r/   r   c                    s   ˆ |  }|d k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   rA   rB   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+   r3   Zdefault_stopZdefault_startr)   r(   ÚsliÚresr   )r<   rM   r   Úslice_constructor_impl—   sF    ú



ÿ ÿ ÿ

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/   )r:   rV   r+   rA   r   rB   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 5 Q R X |jt ||j	¡dd�� | j |td¡ W 5 Q R X t
|||ƒ |  ||j|j|j|j	f¡S )Nr/   r   Fr   )zlength should not be negative)r9   )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 krPd}|
}n|dk }||ƒ}|j}|d kr~|rx|}q†|}n||ƒ}|j}|d kr¤|rž|	}q¬|}n||ƒ}||_||_||_| ¡ S )Nc                    s   g | ]}ˆ   tj|¡‘qS r   r@   rC   rF   r   r   rG   ý   s     z,make_slice_from_constant.<locals>.<listcomp>Fr   )	rV   Zget_value_typer   rB   r?   r+   r(   r)   rW   )r<   r   r^   Úpyvalr_   ZltyrY   rZ   r[   r\   r]   r+   Zstep_is_negr(   r)   r   rF   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.   r5   r6   r8   r>   r?   r%   ZVarArgÚAnyra   Z	SliceTyperd   re   rf   ÚIntegerrh   rj   rm   ÚmiscZSliceLiteralrn   r   r   r   r   Ú<module>   s4   (
$,	
/






-
	