U
    ì¾|eÛ$  ã                   @   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   úR/var/www/website-v5/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©Úlikelyú>=)Úgetattrr   Úsetattrr   Úif_then)Z
bound_nameZ
lower_replZ
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   Z	minus_oner)   Zif_neg_stepZif_pos_stepÚlowerÚupperr   r&   r   Ú	fix_slice   s    r1   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   Ú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     þr9   c           	      C   sd   |j }|j}| d¡}| d¡}|  d|j|¡}|  ||  ||¡|¡}|  ||  ||¡|¡}||fS )z?
    Return the [lower, upper) indexing bounds of a slice.
    r   r2   r   )r*   r+   r   r   r.   r   r   )	r   r5   r*   r+   r(   r6   r7   r/   r0   r   r   r   Úget_slice_boundsi   s    


 ÿ
 ÿr:   c                 C   s   |   |j|¡S )z4
    Fix the given stride for the slice's step.
    )Úmulr.   )r   r'   Ústrider   r   r   Ú
fix_stride{   s    r=   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   Ú
guard_nullr.   Ú
ValueError)Úcontextr   Útypr5   r   r   r   Úguard_invalid_slice�   s    ÿrD   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)
    r2   r   )Úaddress_size)rB   Zmaxintr   r   r   Úget_defaultsŠ   s    rF   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©rB   r   r   Ú
<listcomp>Ÿ   s     z*slice_constructor_impl.<locals>.<listcomp>é   r2   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   )rF   ÚlenÚargsr   ÚnoneÚ	enumerateÚzipr   rH   rI   r   Úreturn_typeÚmake_helperr*   r+   r.   Ú	_getvaluer
   )rB   r   ÚsigrX   Údefault_start_posÚdefault_start_negÚdefault_stop_posÚdefault_stop_negÚdefault_steprQ   ÚtyrS   rU   r.   r7   Zdefault_stopZdefault_startr+   r*   ÚsliÚresr   )rB   rT   r   Úslice_constructor_impl—   sF    ú



ÿ ÿ ÿ

rh   r*   c                 C   s   |   |||¡}|jS rP   )r]   r*   ©rB   r   rC   Úvaluerf   r   r   r   Úslice_start_implÇ   s    rk   r+   c                 C   s   |   |||¡}|jS rP   )r]   r+   ri   r   r   r   Úslice_stop_implÌ   s    rl   r.   c                 C   s,   |j r|  |||¡}|jS |  tjd¡S d S )Nr2   )r?   r]   r.   rH   r   rI   ri   r   r   r   Úslice_step_implÑ   s    rm   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 )Nr2   r   Fr   )zlength should not be negative)r>   )r]   rX   r"   r   r-   Ú	call_convÚreturn_user_excrA   Úis_scalar_zeror.   r1   Ú
make_tupler\   r*   r+   )rB   r   r_   rX   Úlengthrf   r   r   r   Úslice_indicesÚ   s(     þ þýrs   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   rG   rJ   rM   r   r   rN   ý   s     z,make_slice_from_constant.<locals>.<listcomp>Fr   )	r]   Úget_value_typer   rI   rF   r.   r*   r+   r^   )rB   r   re   Úpyvalrf   Últyr`   ra   rb   rc   rd   r.   Zstep_is_negr*   r+   r   rM   r   Úmake_slice_from_constantó   s>    úrw   c                 C   s&   t |tjƒr|j}n|}t| |||ƒS rP   )Ú
isinstancer   ÚLiteralÚliteral_typerw   )rB   r   re   ru   rC   r   r   r   Úconstant_slice   s    r{   c                 C   s   t | |||jƒS rP   )rw   Úliteral_value)rB   r   ÚfromtyÚtotyrS   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   r1   r9   r:   r=   rD   rF   r'   ÚVarArgÚAnyrh   Ú	SliceTyperk   rl   rm   ÚIntegerrs   rw   r{   ÚmiscÚSliceLiteralr   r   r   r   r   Ú<module>   s4   (
$,	
/






-
	