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   (
$,	
/






-
	