U
    hâËd  ã                   @   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
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ejƒd
d„ ƒƒZeee ej¡ƒdd„ ƒZed	ejƒeejƒdd„ ƒƒZed	ejƒeejƒ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_refÚRefTypeZgetiterc                 C   s   |\}t | ||j|ƒS ©N)r   Úreturn_type)ÚcontextÚbuilderÚsigÚargsÚit© r   úP/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cpython/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ƒ}	|	 ¡ }
| |
¡ | |
¡�( |	 ¡ }| |  ||j||g¡¡ W 5 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_valueÚyield_Z
make_tupleÚ
yield_type)r   r   r   r   ÚresultZenumtyr&   r    ZncountÚsrcresr-   Zsrcvalr   r   r   Úiternext_enumerate.   s    
ÿr5   c           
      C   sp   |j }t|ƒt|jƒkst‚|  ||¡}tt||jƒƒD ]\}\}}t| |||ƒ||< q8| 	¡ }	t
| ||j |	ƒS r   )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_objectG   s    r=   c              
   C   s$  |j \}|\}| j|||d�}t|ƒdkr6| ¡  d S t ||  |j¡¡}tj|tj	d�}t
t||jƒƒD ]z\}	\}
}| |¡}| |¡�T t| |||
ƒ}| || ¡ ¡}| ||¡ | ¡ }t ||d|	¡}| ||¡ W 5 Q R X qj| |¡}| |¡ | |¡� | | |¡¡ W 5 Q R X d S )Nr)   r   )r   r   r   Úset_exhaustedr   r   Zget_value_typer2   Zalloca_once_valueZtrue_bitr7   r8   r6   r+   r/   r   Úand_r-   r   r0   Zgep_inboundsr.   r1   )r   r   r   r   r3   r9   r:   Z	p_ret_tupZ
p_is_validr;   r%   r#   r-   r4   ÚvalZptrr   r   r   Úiternext_zipU   s.    
ÿ


rA   c           
   	   C   sÈ   |j \}|\}|  |¡}|| |||ƒ\}}	|  t|ddƒ¡ t ||j¡� | d¡ | |	¡ W 5 Q R X t 	||j
¡� | ¡  W 5 Q R X t 	|| |j| |j
¡¡¡� | j ||¡ W 5 Q R X d S )NZlibsr   T)r   Zget_generator_implZadd_linking_libsÚgetattrr   Z	if_likelyZis_okr.   r1   Zif_unlikelyZis_stop_iterationr>   r?   Zis_errorÚnot_Z	call_convZreturn_status_propagate)
r   r   r   r   r3   ZgentyÚgenÚimplÚstatusÚretvalr   r   r   rA   {   s     


ÿÿN)Ú__doc__Z
numba.corer   r   Znumba.core.imputilsr   r   r   r   r   r	   r
   ZIteratorTyper   r7   ZIterableTypeÚIntegerr(   ZEnumerateTypeZNEWr5   r8   ZVarArgÚAnyr=   ZZipTyperA   Ú	GeneratorZBORROWEDr   r   r   r   Ú<module>   s$   $





$
