U
    hâËdÚA  ã                   @   sÐ  d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
 ddlmZmZmZ ddlmZmZmZ eeje ej¡ƒdd„ ƒZeejejejƒdd	„ ƒZd
d„ Zeejejejƒdd„ ƒZeejejejƒdd„ ƒZeejejejƒdd„ ƒZ eej!ejejƒdd„ ƒZ"eej#ejejƒdd„ ƒZ$eej%ejejƒdd„ ƒZ&eej'ƒdd„ ƒZ(eej)ƒeej*ƒdd„ ƒƒZ+eej,ƒeej-ƒdd„ ƒƒZ+edej)ƒedej*ƒdd„ ƒƒZ.ed ej/ƒee
j0ƒd!d"„ ƒƒZ1eej2ƒd#d$„ ƒZ3ed%ejejƒd&d'„ ƒZ4eej2ej)ej5ƒeej2ej)ej6ƒeej2ej*ej5ƒeej2ej*ej6ƒd(d)„ ƒƒƒƒZ7ed*ej8ej9ƒed*ej:ej;ƒed*ej:ej<ƒed*ejej;ƒed*ejej<ƒd+d,„ ƒƒƒƒƒZ=eejejƒd-d.„ ƒZ>eejd/ƒd0d1„ ƒZ?eej@ƒd2d3„ ƒZAdS )4z!
Implementation of tuple objects
é    N)Úlower_builtinÚlower_getattr_genericÚ
lower_castÚlower_constantÚiternext_implÚimpl_ret_borrowedÚimpl_ret_untrackedÚRefType)ÚtypingÚtypesÚcgutils)Úoverload_methodÚoverloadÚ	intrinsicc           	      C   s`   g }t |ƒD ].\}}|  |||j| |j| ¡}| |¡ q|  ||jt|ƒ¡}t| ||j|ƒS ©N)Ú	enumerateÚcastÚargsÚreturn_typeÚappendÚ
make_tupleÚtupler   )	ÚcontextÚbuilderÚsigr   ZnewargsÚiÚargÚcastedÚres© r   úO/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cpython/tupleobj.pyÚnamedtuple_constructor   s    r!   c                    s:   ‡ fdd„|D ƒ\}}|   ˆ |j|| ¡}t| ˆ |j|ƒS )Nc                    s   g | ]}t  ˆ |¡‘qS r   )r   Úunpack_tuple)Ú.0Úx©r   r   r    Ú
<listcomp>   s     ztuple_add.<locals>.<listcomp>)r   r   r   )r   r   r   r   ÚleftÚrightr   r   r%   r    Ú	tuple_add   s    r)   c              
   C   s  |j \}}|\}}t |tj¡}	| d¡}
tt|j|jƒƒD ]‚\}\}}| ||¡}| ||¡}|  	|t
j||f||f¡}| |¡�4 |  	||||f||f¡}| ||	¡ | |
¡ W 5 Q R X q<|t|jƒt|jƒƒ}|  tj|¡}| ||	¡ | |
¡ | |
¡ | |	¡S )NZcmp_end)r   r   Zalloca_once_valueÚtrue_bitÚappend_basic_blockr   Úzipr   Úextract_valueÚgeneric_compareÚoperatorÚneÚif_thenÚstoreÚbranchÚlenÚget_constantÚbooleanÚposition_at_endÚload)r   r   Úopr   r   ÚtuÚtvÚuÚvr   Úbbendr   ÚtaÚtbÚaÚbÚ	not_equalÚpredZlen_comparer   r   r    Útuple_cmp_ordered$   s$    



rE   c                 C   sÀ   |j \}}|\}}t|jƒt|jƒkrD|  tjd¡}t| ||j|ƒS |  tjd¡}tt|j|jƒƒD ]J\}	\}
}| 	||	¡}| 	||	¡}|  
|tj|
|f||f¡}| ||¡}qdt| ||j|ƒS )NFT)r   r4   r   r5   r6   r   r   r   r,   r-   r.   r/   ÚeqÚand_)r   r   r   r   r:   r;   r<   r=   r   r   r?   r@   rA   rB   rD   r   r   r    Útuple_eq:   s    
rH   c                 C   s$   |  t| |||ƒ¡}t| ||j|ƒS r   )Únot_rH   r   r   ©r   r   r   r   r   r   r   r    Útuple_neI   s    rK   c                 C   s"   t | |tj||ƒ}t| ||j|ƒS r   )rE   r/   Últr   r   rJ   r   r   r    Útuple_ltN   s    rM   c                 C   s"   t | |tj||ƒ}t| ||j|ƒS r   )rE   r/   Úler   r   rJ   r   r   r    Útuple_leS   s    rO   c                 C   s"   t | |tj||ƒ}t| ||j|ƒS r   )rE   r/   Úgtr   r   rJ   r   r   r    Útuple_gtX   s    rQ   c                 C   s"   t | |tj||ƒ}t| ||j|ƒS r   )rE   r/   Úger   r   rJ   r   r   r    Útuple_ge]   s    rS   c                 C   s*   |j  |¡}| ||¡}t| ||| |ƒS )z%
    Fetch a namedtuple's field.
    )ÚfieldsÚindexr-   r   )r   r   ÚtypÚvalueÚattrrU   r   r   r   r    Únamedtuple_getattrd   s    rY   c                    s,   ‡ ‡‡fdd„|D ƒ}t ˆˆ ˆt ˆ |¡ƒS )z.
    Create a homogeneous tuple constant.
    c                    s   g | ]}ˆ  ˆ ˆj|¡‘qS r   )Úget_constant_genericÚdtype)r#   r=   ©r   r   Útyr   r    r&   t   s   ÿú%unituple_constant.<locals>.<listcomp>)r   r   Z
pack_array©r   r   r]   ZpyvalZconstsr   r\   r    Úunituple_constantn   s    ÿ   
ÿr`   c                    s0   ‡ ‡‡fdd„t |ƒD ƒ}tˆˆ ˆt ˆ |¡ƒS )z0
    Create a heterogeneous tuple constant.
    c                    s$   g | ]\}}ˆ  ˆ ˆj| |¡‘qS r   )rZ   r   )r#   r   r=   r\   r   r    r&   €   s   ÿr^   )r   r   r   Zpack_structr_   r   r\   r    r`   z   s    ÿ   
ÿZgetiterc           
      C   sl   |j \}|\}|  |t |¡¡}|  tjd¡}t ||j¡}| 	||¡ ||_
||_| ¡ }	t| ||j|	ƒS )Nr   )r   Úmake_helperr   ÚUniTupleIterr5   Úintpr   Zalloca_onceÚtyper2   rU   r   Z	_getvaluer   r   )
r   r   r   r   ÚtuptyÚtupÚitervalZindex0Zindexptrr   r   r   r    Úgetiter_unitupleŠ   s    rh   Ziternextc              	   C   sè   |j \}|\}| j|||d�}|j}|j}	| |	¡}
|  tj|jj	¡}| 
d|
|¡}| |¡ | |¡�v t |jj|jtj¡}t| ||||
gƒ}| jr¬| j ||jj|¡ | |¡ | |
|  tjd¡¡}| ||j¡ W 5 Q R X d S )N)rW   ú<é   )r   ra   r   rU   r8   r5   r   rc   Ú	containerÚcountZicmp_signedZ	set_validr1   r
   Ú	signaturer[   Úgetitem_unitupleZ
enable_nrtZnrtZdecrefZyield_Úaddr2   )r   r   r   r   ÚresultZ	tupitertyZtupiterrg   rf   ZidxptrÚidxrl   Zis_validZgetitem_sigZgetitem_outZnidxr   r   r    Úiternext_unituple�   s,    


þÿ
rr   c                    s2   t | tjƒrt |tjƒsdS |j‰ ‡ fdd„}|S )z—
    Overloads BaseTuple getitem to cover cases where constant
    inference and RewriteConstGetitems cannot replace it
    with a static_getitem.
    Nc                    s   | ˆ  S r   r   )rf   rq   ©Úidx_valr   r    Úgetitem_literal_idx_implÈ   s    z5getitem_literal_idx.<locals>.getitem_literal_idx_impl)Ú
isinstancer   Ú	BaseTupleÚIntegerLiteralÚliteral_value)rf   rq   ru   r   rs   r    Úgetitem_literal_idx¼   s    
ÿrz   Ztyped_getitemc              
   C   s:  |j \}}|\}}d}t|ƒdkrf| tj¡� | j |t|¡ W 5 Q R X |  |j	¡}	t
| ||j	|	ƒS | d¡}
| d¡}| ||
¡}| |
¡� | j |t|¡ W 5 Q R X |  |j	¡}|  tj¡}| |¡� | |¡}W 5 Q R X t|jƒD �]}|  tj|¡}| d| ¡}| ||¡ |  tj|j | ¡}| ||¡ | |¡�² | ||¡}| j |j d | |j	¡|j	k}|�r¸|j|d| d�}|  |||j d | |j	¡}| ||¡ n |j|jd| d�}| ||¡ | | ||¡|¡ |  |¡ W 5 Q R X qî| !|¡ | || "¡ ¡}	| #|	¡}	t$| ||j	|	ƒS d S )N©ztuple index out of ranger   ztyped_switch.elseztyped_switch.endztyped_switch.%dzTYPED_VALUE_SLOT%s)Úname)%r   r4   r1   r   r*   Ú	call_convÚreturn_user_excÚ
IndexErrorÚget_constant_nullr   r   r+   ÚswitchÚ
goto_blockÚget_value_typer   ZvoidptrÚphiÚrangerl   r5   rc   Úadd_caser-   Ztyping_contextZunify_typesZallocar   r2   rd   Úadd_incomingZbitcastr3   r7   Z
as_pointerr8   r   )r   r   r   r   re   Ú_rf   rq   Ú
errmsg_oobr   Úbbelser>   r�   ÚlrttyZ	voidptrtyÚphinoder   ÚkiÚbbiÚkinrW   ZDOCASTZ
value_slotr   r   r   r    Úgetitem_typedÎ   sr    

ÿ ÿ


ÿÿÿÿÿÿÿ

r�   c              
   C   sž  |j \}}|\}}d}t|ƒdkrf| tj¡� | j |t|¡ W 5 Q R X |  |j	¡}	t
| ||j	|	ƒS | d¡}
| d¡}| ||
¡}| |
¡� | j |t|¡ W 5 Q R X |  |j¡}| |¡� | |¡}W 5 Q R X t|jƒD ]†}|  tj|¡}| d| ¡}| ||¡ |  tj|j | ¡}| ||¡ | |¡�( | ||¡}| |¡ | ||¡ W 5 Q R X qâ| |¡ |}	|j	|jk�sŠt‚t| ||j	|	ƒS d S )Nr{   r   zswitch.elsez
switch.endz	switch.%d)r   r4   r1   r   r*   r}   r~   r   r€   r   r   r+   r�   r‚   rƒ   r[   r„   r…   rl   r5   r   rc   r†   r-   r3   r‡   r7   ÚAssertionErrorr   )r   r   r   r   re   rˆ   rf   rq   r‰   r   rŠ   r>   r�   r‹   rŒ   r   r�   rŽ   r�   rW   r   r   r    rn   #  sJ    

ÿ ÿ


ÿ

rn   Zstatic_getitemc                 C   sæ   |j \}}|\}}t|tƒrh|dk r0|t|ƒ7 }d|  krHt|ƒk sZn td||f ƒ‚| ||¡}nnt|tƒr”t ||¡| }	|  	||j
|	¡}nBt|tjƒrÀ|j}
|j |
¡}| ||¡}ntd||j d f ƒ‚t| ||j
|ƒS )Nr   zcannot index at %d in %szunexpected index %r for %s)r   rv   Úintr4   r   r-   Úslicer   r"   r   r   r   ÚLiteralStrKeyDictry   rT   rU   ÚNotImplementedErrorr   )r   r   r   r   re   Zidxtyrf   rq   r   Úitemsrt   Z
idx_offsetr   r   r    Ústatic_getitem_tupleZ  s&    


ÿr—   c                    sl   t |tjƒst |tjƒrt‚t|ƒt|ƒkr0t‚t ˆ |t|ƒ¡}‡ ‡fdd„t|||ƒD ƒ}ˆ ˆ ||¡S )Nc                    s"   g | ]\}}}ˆ  ˆ |||¡‘qS r   )r   )r#   r=   ÚfÚt©r   r   r   r    r&   …  s   ÿz"tuple_to_tuple.<locals>.<listcomp>)	rv   r   ÚBaseNamedTupler•   r4   r   r"   r,   r   )r   r   ZfromtyZtotyÚvalZolditemsr–   r   rš   r    Útuple_to_tupley  s    
ÿ
ÿr�   rU   c                 C   s   dd„ }|S )Nc                 S   s2   t t| ƒƒD ]}| | |kr|  S qtdƒ‚d S )Nztuple.index(x): x not in tuple)r…   r4   Ú
ValueError)rf   rW   r   r   r   r    Útuple_index_impl�  s    
z%tuple_index.<locals>.tuple_index_implr   )rf   rW   rŸ   r   r   r    Útuple_index�  s    r    c                 C   s   t | tjƒr| jsdd„ S d S )Nc                 S   s   dS )NFr   ©r$   Úyr   r   r    Ú<lambda>œ  ó    z$in_seq_empty_tuple.<locals>.<lambda>)rv   r   ÚTupler¡   r   r   r    Úin_seq_empty_tuple™  s    r¦   )BÚ__doc__r/   Znumba.core.imputilsr   r   r   r   r   r   r   r	   Z
numba.corer
   r   r   Znumba.core.extendingr   r   r   ZNamedTupleClassZVarArgÚAnyr!   ro   rw   r)   rE   rF   rH   r0   rK   rL   rM   rN   rO   rP   rQ   rR   rS   r›   rY   ZUniTupleZNamedUniTupler`   r¥   Ú
NamedTuplerh   rb   ZBORROWEDrr   Úgetitemrz   r�   rc   Zuintprn   r”   ZStringLiteralZLiteralListrx   ZSliceLiteralr—   r�   r    Úcontainsr¦   r   r   r   r    Ú<module>   sp   (








	





T3


