B
     \*                 @   sp  d Z ddlmZ ddlm  mZ ddlZddl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 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j0dd Z.e	d ej,e	d ej-d!d" Z1e	d#ej2ed$d% Z3e	ej4ej,ej5e	ej4ej,ej6e	ej4ej-ej5e	ej4ej-ej6d&d' Z7e	d(ejej8e	d(ejej9d)d* Z:eejejd+d, Z;eejd-d.d/ Z<dS )0z!
Implementation of tuple objects
    )irN   )lower_builtinlower_getattr_generic
lower_castlower_constantiternext_implimpl_ret_borrowedimpl_ret_untracked   )typingtypescgutils)overload_methodc             C   s    |  ||j|}t| ||j|S )N)
make_tuplereturn_typer	   )contextbuildersigargsres r   5lib/python3.7/site-packages/numba/targets/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}
xtt|j|jD ]\}\}}|||}|||}| 	|t
j||f||f}||4 | 	||||f||f}|||	 ||
 W d Q R X q>W |t|jt|j}| tj|}|||	 ||
 ||
 ||	S )NZcmp_end)r   r   Zalloca_once_valuetrue_bitappend_basic_block	enumerate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   bbenditatbabZ	not_equalpredZlen_comparer   r   r   tuple_cmp_ordered   s$    

 

r=   c             C   s   |j \}}|\}}t|jt|jkrD| tjd}t| ||j|S | tjd}x`tt|j|jD ]J\}	\}
}|	||	}|	||	}| 
|tj|
|f||f}|||}qfW t| ||j|S )NFT)r   r,   r   r-   r.   r
   r   r#   r$   r%   r&   r'   eqand_)r   r   r   r   r2   r3   r4   r5   r   r7   r8   r9   r:   r;   r<   r   r   r   tuple_eq3   s    
 r@   c             C   s$   | t| |||}t| ||j|S )N)not_r@   r
   r   )r   r   r   r   r   r   r   r   tuple_neB   s    rB   c             C   s"   t | |tj||}t| ||j|S )N)r=   r'   ltr
   r   )r   r   r   r   r   r   r   r   tuple_ltG   s    rD   c             C   s"   t | |tj||}t| ||j|S )N)r=   r'   ler
   r   )r   r   r   r   r   r   r   r   tuple_leL   s    rF   c             C   s"   t | |tj||}t| ||j|S )N)r=   r'   gtr
   r   )r   r   r   r   r   r   r   r   tuple_gtQ   s    rH   c             C   s"   t | |tj||}t| ||j|S )N)r=   r'   ger
   r   )r   r   r   r   r   r   r   r   tuple_geV   s    rJ   c             C   s*   |j |}|||}t| ||| |S )z%
    Fetch a namedtuple's field.
    )Zfieldsindexr%   r	   )r   r   typvalueattrrK   r   r   r   r   namedtuple_getattr]   s    rO   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   r5   )r   r   tyr   r   r   m   s   z%unituple_constant.<locals>.<listcomp>)r	   r   Z
pack_array)r   r   rR   pyvalconstsr   )r   r   rR   r   unituple_constantg   s    rU   c                s0    fddt |D }t t |S )z0
    Create a heterogeneous tuple constant.
    c                s$   g | ]\}}  j| |qS r   )rP   r   )r   r7   r5   )r   r   rR   r   r   r   y   s   z%unituple_constant.<locals>.<listcomp>)r#   r	   r   Zpack_struct)r   r   rR   rS   rT   r   )r   r   rR   r   rU   s   s    Zgetiterc       
      C   sl   |j \}|\}| |t|}| tjd}t||j}|	|| ||_
||_| }	t| ||j|	S )Nr   )r   make_helperr   UniTupleIterr-   intpr   Zalloca_oncetyper*   rK   tupleZ	_getvaluer	   r   )
r   r   r   r   tuptytupitervalZindex0Zindexptrr   r   r   r   getiter_unituple   s    r^   Ziternextc          	   C   s   |j \}|\}| j|||d}|j}|j}	||	}
| tj|jj	}|
tj|
|}|| ||v t|jj|jtj}t| ||||
g}| jr| j||jj| || ||
| tjd}|||j W d Q R X d S )N)rM   r   )r   rV   rZ   rK   r0   r-   r   rX   Z	containercountZicmplcZICMP_SLTZ	set_validr)   r   Z	signaturerQ   getitem_unitupleZ
enable_nrtZnrtZdecrefZyield_addr*   )r   r   r   r   resultZ	tupitertyZtupiterr]   r\   Zidxptridxr_   Zis_validZgetitem_sigZgetitem_outZnidxr   r   r   iternext_unituple   s(    




re   c          
   C   s  |j \}}|\}}d}t|dkrf|tj | j|t| W d Q R X | |j	}	t
| ||j	|	S |d}
|d}|||
}||
 | j|t| W d Q R X | |j}|| ||}W d Q R X xt|jD ]}| tj|}|d| }||| | tj|j | }||| ||( |||}|| ||| W d Q R X qW || |}	|j	|jkstt| ||j	|	S d S )N)ztuple index out of ranger   zswitch.elsez
switch.endz	switch.%d)r   r,   r)   r   r!   Z	call_convZreturn_user_exc
IndexErrorZget_constant_nullr   r
   r"   switchZ
goto_blockZget_value_typerQ   Zphiranger_   r-   r   rX   Zadd_caser%   r+   Zadd_incomingr/   AssertionErrorr	   )r   r   r   r   r[   _r\   rd   Z
errmsg_oobr   Zbbelser6   rg   ZlrttyZphinoder7   ZkiZbbiZkinrM   r   r   r   ra      sB    







ra   Zstatic_getitemc       
      C   s   |j \}}|\}}t|trh|dk r0|t|7 }d|  krHt|k sZn td||f |||}nBt|trt||| }	| 	||j
|	}ntd||j d f t| ||j
|S )Nr   zcannot index at %d in %szunexpected index %r for %s)r   
isinstanceintr,   rf   r%   slicer   r   r   r   NotImplementedErrorr	   )
r   r   r   r   r[   rj   r\   rd   r   itemsr   r   r   static_getitem_tuple   s    


rp   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   )cast)r   r5   ft)r   r   r   r   r     s   z"tuple_to_tuple.<locals>.<listcomp>)	rk   r   BaseNamedTuplern   r,   r   r   r$   r   )r   r   ZfromtyZtotyvalZolditemsro   r   )r   r   r   tuple_to_tuple  s    rv   rK   c             C   s   dd }|S )Nc             S   s2   x$t t| D ]}| | |kr|S qW tdd S )Nztuple.index(x): x not in tuple)rh   r,   
ValueError)r\   rM   r7   r   r   r   tuple_index_impl  s    z%tuple_index.<locals>.tuple_index_implr   )r\   rM   rx   r   r   r   tuple_index  s    ry   )=__doc__Zllvmliter   Zllvmlite.llvmpy.coreZllvmpyZcorer`   r'   Zimputilsr   r   r   r   r   r	   r
    r   r   r   Z	extendingr   ZNamedTupleClassZVarArgZAnyr   rb   Z	BaseTupler    r=   r>   r@   r(   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rt   rO   ZUniTupleZNamedUniTuplerU   ZTupleZ
NamedTupler^   rW   re   getitemrX   Zuintpra   ZIntegerLiteralZSliceLiteralrp   rv   ry   r   r   r   r   <module>   s@   $


 4