ó
\K]c           @   s4  d  Z  d d l Z d d l m Z d d l m Z d d l m Z m Z m	 Z	 d d l
 m Z m Z m Z m Z m Z m Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z e e e j e j ƒ ƒ d „  ƒ Z e e j d ƒ d „  ƒ Z e e j d ƒ d „  ƒ Z e e j d ƒ d „  ƒ Z d S(   s2   
Implement slices and various slice computations.
iÿÿÿÿN(   t   ir(   t   zip_longest(   t   cgutilst   typest   typingi   (   t   lower_builtint   lower_getattrt   iternext_implt   impl_ret_borrowedt   impl_ret_new_reft   impl_ret_untrackedc         C   sI   |  j  d | t j | j d ƒ ƒ } |  j | | ƒ } |  j | | | ƒ S(   s^   
    Fix negative index by adding *size* to it.  Positive
    indices are left untouched.
    t   <i    (   t   icmp_signedR    t   Constantt   typet   addt   select(   t   buildert   idxt   sizet   is_negativet   wrapped_index(    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt	   fix_index   s    $c   	         så   t  j ˆ j d ƒ ‰ t  j ˆ j d ƒ } ‡  ‡ ‡ ‡ f d †  } ˆ  j t j ˆ  ˆ j ƒ ƒ  \ } } | % | d ˆ ˆ ƒ | d ˆ ˆ ƒ Wd QX| = | } ˆ  j ˆ | ƒ } | d | | ƒ | d | | ƒ Wd QXWd QXd S(   sˆ   
    Fix *slice* start and stop to be valid (inclusive and exclusive, resp)
    indexing bounds for a sequence of the given *size*.
    i    iÿÿÿÿc      	      s·   t  ˆ |  ƒ } t ˆ  | ˆ ƒ } t ˆ |  | ƒ ˆ  j d | ˆ ƒ } ˆ  j | d t ƒ t ˆ |  | ƒ Wd  QXˆ  j d | ˆ ƒ } ˆ  j | d t ƒ t ˆ |  | ƒ Wd  QXd  S(   NR   t   likelys   >=(   t   getattrR   t   setattrR   t   if_thent   False(   t
   bound_namet
   lower_replt
   upper_replt   boundt	   underflowt   overflow(   R   R   t   slicet   zero(    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt	   fix_bound#   s    t   startt   stopN(   R    R   R   t   if_elseR   t
   is_neg_intt   stepR   (	   R   R"   R   t	   minus_oneR$   t   if_neg_stept   if_pos_stept   lowert   upper(    (   R   R   R"   R#   s4   lib/python2.7/site-packages/numba/targets/slicing.pyt	   fix_slice   s    'c         C   s  | j  } | j } | j } t j | j d ƒ } t j | j d ƒ } t j |  | ƒ } |  j | | ƒ } |  j | | ƒ }	 |  j	 | | ƒ }
 |  j
 | |
 |	 ƒ } |  j	 | |  j | | ƒ ƒ } |  j
 | |  j d | | ƒ |  j d | | ƒ ƒ } |  j
 | | | ƒ S(   s   
    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)
    i   i    s   >=s   <=(   R%   R&   R)   R    R   R   R   R(   t   subR   R   t   sdivR   (   R   t   slicestructR%   R&   R)   t   oneR#   t   is_step_negativet   deltat   pos_dividendt   neg_dividendt   dividendt   nominal_lengtht   is_zero_length(    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   get_slice_length>   s    				c   	      C   s”   | j  } | j } | j d ƒ } | j d ƒ } |  j d | j | ƒ } |  j | |  j | | ƒ | ƒ } |  j | |  j | | ƒ | ƒ } | | f S(   s?   
    Return the [lower, upper) indexing bounds of a slice.
    i    i   R   (   R%   R&   R   R   R)   R   R   (	   R   R2   R%   R&   R#   R3   R4   R-   R.   (    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   get_slice_boundsj   s    				c         C   s   |  j  | j | ƒ S(   s4   
    Fix the given stride for the slice's step.
    (   t   mulR)   (   R   R"   t   stride(    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt
   fix_stride|   s    c         C   s/   | j  r+ t j |  | | j t d f ƒ n  d S(   sP   
    Guard against *slicestruct* having a zero step (and raise ValueError).
    s   slice step cannot be zeroN(   t   has_stepR   t
   guard_nullR)   t
   ValueError(   t   contextR   t   typR2   (    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   guard_invalid_slice‚   s    	c         C   s-   d |  j  d >d } d | | | d d f S(   s©   
    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)
    i   i    (   t   address_size(   RC   t   maxint(    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   get_defaults‹   s    c            s„  g  t  |  ƒ D] } |  j t j | ƒ ^ q \ } } } } }	 d  g d ‰  xR t t | j | ƒ ƒ D]8 \ }
 \ } } | t j k r‘ d  ˆ  |
 <qc | ˆ  |
 <qc W‡  f d †  } | d |	 ƒ } | j	 d | |  j t j d ƒ ƒ } | j
 | | | ƒ } | j
 | | | ƒ } | d | ƒ } | d | ƒ } | j } |  j | | j ƒ } | | _ | | _ | | _ | j ƒ  } t |  | | j | ƒ S(   Ni   c            s"   ˆ  |  } | d  k r | S| Sd  S(   N(   t   None(   t   it   defaultt   val(   t
   slice_args(    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   get_arg_value¦   s    
i   R   i    i   (   RH   t   get_constantR   t   intpRI   t	   enumeratet   zipt   argst   noneR   R   t   return_typet   make_helperR%   R&   R)   t	   _getvalueR
   (   RC   R   t   sigRS   t   xt   default_start_post   default_start_negt   default_stop_post   default_stop_negt   default_stepRJ   t   tyRL   RN   R)   R4   t   default_stopt   default_startR&   R%   t   slit   res(    (   RM   s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   slice_constructor_impl˜   s.    =+						R%   c         C   s   |  j  | | | ƒ } | j S(   N(   RV   R%   (   RC   R   RD   t   valueRb   (    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   slice_start_implÁ   s    R&   c         C   s   |  j  | | | ƒ } | j S(   N(   RV   R&   (   RC   R   RD   Re   Rb   (    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   slice_stop_implÆ   s    R)   c         C   s<   | j  r% |  j | | | ƒ } | j S|  j t j d ƒ Sd  S(   Ni   (   R@   RV   R)   RO   R   RP   (   RC   R   RD   Re   Rb   (    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   slice_step_implË   s    	(    t   __doc__t	   itertoolst   llvmliteR    t   numba.six.movesR   t   numbaR   R   R   t   imputilsR   R   R   R   R	   R
   R   R/   R;   R<   R?   RE   RH   R"   t   VarArgt   AnyRd   t	   SliceTypeRf   Rg   Rh   (    (    (    s4   lib/python2.7/site-packages/numba/targets/slicing.pyt   <module>   s    .	
	$	,					$)