ó
\K]c           @   sD  d  Z  d d l m Z m Z d d l m Z m Z m Z m Z m	 Z	 m
 Z
 m Z e d e j  d    Z e e e j  e e e j e j  d     Z e d e j  e e j  d     Z e e e j e j   d	    Z e d e j  e e j  d
     Z e d e j  e e j  d     Z d S(   s8   
Implementation of various iterable and iterator types.
iĸĸĸĸ(   t   typest   cgutils(   t   lower_builtint   iternext_implt   call_iternextt   call_getitert   impl_ret_borrowedt   impl_ret_new_reft   RefTypet   getiterc         C   s   | \ } t  |  | | j |  S(   N(   R   t   return_type(   t   contextt   buildert   sigt   argst   it(    (    s6   lib/python2.7/site-packages/numba/targets/iterators.pyt   iterator_getiter   s    	c         C   s3  t  |  d k s* t  |  d k s* t  | j d } t  |  d k rk | d } |  j t j d  } nE t  |  d k r° | d } |  j | | d | j d t j  } n  t |  | | |  } |  j | | j	  } t
 j | | j  }	 | j | |	  |	 | _ | | _ | j   }
 t |  | | j	 |
  S(   Ni   i   i    (   t   lent   AssertionErrorR   t   get_constantR    t   intpt   castR   t   make_helperR
   R   t   alloca_oncet   typet   storet   countt   itert	   _getvalueR   (   R   R   R   R   t   srctyt   srct	   start_valt   iterobjt   enumt   countptrt   res(    (    s6   lib/python2.7/site-packages/numba/targets/iterators.pyt   make_enumerate_object   s     *

)		t   iternextc      
   C   s  | j  \ } | \ } |  j | | d | } | j | j  } | j | |  j t j d   } | j | | j  t	 |  | | j
 | j  }	 |	 j   }
 | j |
  | j |
  _ |	 j   } |  j rė |  j j | | j d |  n  | j |  j | | j | | g   Wd  QXd  S(   Nt   valuei   (   R   R   t   loadR   t   addR   R    R   R   R   t   source_typeR   t   is_validt	   set_validt   if_thent   yielded_valuet
   enable_nrtt   nrtt   decreft
   yield_typet   yield_t
   make_tuple(   R   R   R   R   t   resultt   enumtyR!   R   t   ncountt   srcresR*   t   srcval(    (    s6   lib/python2.7/site-packages/numba/targets/iterators.pyt   iternext_enumerate.   s    	!	 c   
      C   sĶ   | j  } t |  t | j  k s* t  |  j | |  } xE t t | | j   D]+ \ } \ } } t |  | | |  | | <qU W| j	   }	 t
 |  | | j  |	  S(   N(   R
   R   t   source_typesR   R   t	   enumeratet   zipR   R   R   R   (
   R   R   R   R   t   zip_typet   zipobjt   it   argR   R#   (    (    s6   lib/python2.7/site-packages/numba/targets/iterators.pyt   make_zip_objectK   s    	!+c      
   C   s  | j  \ } | \ } |  j | | d | } t |  d k rM | j   d  St j | |  j | j   } t j | d t j	 } xÂ t
 t | | j   D]Ļ \ }	 \ }
 } | j |  } | j |  v t |  | | |
  } | j | | j    } | j | |  | j   } t j | | d |	  } | j | |  Wd  QXq W| j |  } | j |  | j |   | j | j |   Wd  QXd  S(   NR&   i    (   R   R   R   t   set_exhaustedR   R   t   get_value_typeR1   t   alloca_once_valuet   true_bitR;   R<   R:   R'   R,   R   t   and_R*   R   R-   t   gep_inboundsR+   R2   (   R   R   R   R   R4   R=   R>   t	   p_ret_tupt
   p_is_validR?   R    R   R*   R7   t   valt   ptr(    (    s6   lib/python2.7/site-packages/numba/targets/iterators.pyt   iternext_zipY   s,    	
	+c   
   	   C   sĸ   | j  \ } | \ } |  j |  } | |  | | |  \ } }	 |  j t | d d   t j | | j   | j t  | j	 |	  Wd  QXt j
 | | j   | j   Wd  QXt j
 | | j | j | j | j     |  j j | |  Wd  QXd  S(   Nt   libs(    (   R   t   get_generator_implt   add_linking_libst   getattrR   t	   if_likelyt   is_okR+   t   TrueR2   t   if_unlikelyt   is_stop_iterationRB   RF   t   is_errort   not_t	   call_convt   return_status_propagate(
   R   R   R   R   R4   t   gentyt   gent   implt   statust   retval(    (    s6   lib/python2.7/site-packages/numba/targets/iterators.pyRL      s    		N(   t   __doc__t   numbaR    R   t   numba.targets.imputilsR   R   R   R   R   R   R   t   IteratorTypeR   R;   t   IterableTypet   IntegerR$   t   EnumerateTypet   BORROWEDR9   R<   t   VarArgt   AnyRA   t   ZipTypeRL   t	   Generator(    (    (    s6   lib/python2.7/site-packages/numba/targets/iterators.pyt   <module>   s   4$$%