U
    ,dA                     @   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   :/tmp/pip-unpacked-wheel-eu7e0c37/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st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rt||| }	| 	||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


