B
     \                 @   s   d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
 edejdd Zeeejeeejejdd Zed	ejed
d Zeeeejdd Zed	ejedd Zed	ejedd ZdS )z8
Implementation of various iterable and iterator types.
    )typescgutils)lower_builtiniternext_implcall_iternextcall_getiterimpl_ret_borrowedimpl_ret_new_refZgetiterc             C   s   |\}t | ||j|S )N)r   return_type)contextbuildersigargsit r   6lib/python3.7/site-packages/numba/targets/iterators.pyiterator_getiter   s    r   c             C   s   t |dkst |dkst|jd }t |dkrJ|d }| tjd}n0t |dkrz|d }| ||d |jd tj}t| |||}| ||j	}t
||j}	|||	 |	|_||_| }
t| ||j	|
S )N      r   )lenAssertionErrorr   get_constantr   intpcastr   make_helperr
   r   alloca_oncetypestorecountiter	_getvaluer	   )r   r   r   r   srctysrcZ	start_valiterobjenumZcountptrresr   r   r   make_enumerate_object   s     
r&   Ziternextc          	   C   s   |j \}|\}| j|||d}||j}||| tjd}|||j t	| ||j
|j}	|	 }
||
 ||
D |	 }| jr| j||jd | || ||j||g W d Q R X d S )N)valuer   )r   r   loadr   addr   r   r   r   r   Zsource_typer   is_valid	set_validif_thenyielded_valueZ
enable_nrtZnrtZdecref
yield_typeyield_Z
make_tuple)r   r   r   r   resultZenumtyr$   r   Zncountsrcresr*   Zsrcvalr   r   r   iternext_enumerate.   s    
r2   c       
      C   st   |j }t|t|jkst| ||}x2tt||jD ]\}\}}t| |||||< q:W |	 }	t
| ||j |	S )N)r
   r   source_typesr   r   	enumeratezipr   r   r    r	   )
r   r   r   r   zip_typezipobjiargr!   r%   r   r   r   make_zip_objectK   s    r:   c          
   C   s(  |j \}|\}| j|||d}t|dkr6|  d S t|| |j}tj|tj	d}xt
t||jD ]z\}	\}
}||}||T t| |||
}||| }||| | }t||d|	}||| W d Q R X qlW ||}|| || ||| W d Q R X d S )N)r'   r   )r   r   r   set_exhaustedr   r   Zget_value_typer.   Zalloca_once_valueZtrue_bitr4   r5   r3   r(   r,   r   and_r*   r   r-   Zgep_inboundsr+   r/   )r   r   r   r   r0   r6   r7   Z	p_ret_tupZ
p_is_validr8   r#   r!   r*   r1   valZptrr   r   r   iternext_zipY   s,    


r>   c       
   	   C   s   |j \}|\}| |}|| |||\}}	| t|dd t||j |d ||	 W d Q R X t	||j
 |  W d Q R X t	|||j||j
 | j|| W d Q R X d S )NZlibsr   T)r   Zget_generator_implZadd_linking_libsgetattrr   Z	if_likelyZis_okr+   r/   Zif_unlikelyZis_stop_iterationr;   r<   Zis_errornot_Z	call_convZreturn_status_propagate)
r   r   r   r   r0   ZgentygenimplZstatusZretvalr   r   r   r>      s    

N)__doc__Znumbar   r   Znumba.targets.imputilsr   r   r   r   r   r	   ZIteratorTyper   r4   ZIterableTypeZIntegerr&   ZEnumerateTyper2   r5   ZVarArgZAnyr:   ZZipTyper>   	Generatorr   r   r   r   <module>   s    


%
