o
    8ήc                     @   s  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 dd Zd	d
 Zdd ZddddZdHddZdd Zeedd Zeedd Zeejdd Zeedd Zeedd Zeedd  Zeejd!d" Zd#d$ Zee d% ee!d& ee"d' eej#d(d) eej$d*d+ eej%d)d( eej&d+d* eej'd,d, eej(d-d.d eej)d/d.d eej*d0d.d eej+d1d.d eej,d2d.d eej-d3 eej.d4 eej/d5d.d eej0d6d.d eej1d7d.d eej2d8d.d eej3d9d-d.d eej4d:d/d.d eej5d;d0d.d eej6d<d1d.d eej7d=d2d.d eej8d>d5d.d eej9d?d6d.d eej:d@d7d.d eej;dAd8d.d eej<dBd.d eej=dCd.d eej>dDd.d eej?dEdBd.d eej@dFdCd.d eejAdGdDd.d dS )Iz_
Overloads for ClassInstanceType for built-in functions that call dunder methods
on an object.
    )wrapsN)overload)ClassInstanceType)	PYVERSIONc                 C   s   | dv sJ t dd |  S )N)      xy)listn_args r   L/tmp/pip-target-vg8gfxp4/lib/python/numba/experimental/jitclass/overloads.py	_get_args   s   r   c                    s    fdd}|S )zr
    Decorator to add an overload for target that applies when the first argument
    is a ClassInstanceType.
    c                    sD   t   fdd}tt|j}|tt|ksJ t|S )Nc                     s    t | d ts	d S  | i |S )Nr   )
isinstancer   )argskwargsfuncr   r   wrapped   s   z;class_instance_overload.<locals>.decorator.<locals>.wrapped)r   r	   inspect	signature
parametersr   lenr   )r   r   paramstargetr   r   	decorator   s
   z*class_instance_overload.<locals>.decoratorr   )r   r   r   r   r   class_instance_overload   s   r   c                 C   s   i }t | | || S )zC
    Extract a code-generated function from a string template.
    )exec)templatename	namespacer   r   r   extract_template&   s   
r"   r   r
   c                   sB   t }dd| d}tt|d fdd}t| |S )zd
    Register an overload for func that checks for methods __attr__ for each
    attr in attrs.
    

def func(,z):
    pass
r   c                     s    fddD }t | S )Nc                    s$   g | ]}t  d  d| dqS )r   __try_call_method).0attr)r   r   r   r   
<listcomp>=   s    zCregister_simple_overload.<locals>.overload_func.<locals>.<listcomp>)
take_first)r   r   optionsattrsr   )r   r   overload_func;   s   z/register_simple_overload.<locals>.overload_func)r   joinr   r"   r   )r   r   r.   	arg_namesr   r/   r   r-   r   register_simple_overload/   s   r2   c                 C   sV   || j v r)t|}dd| d|d  d| dd|dd  d		}t|d
S dS )zo
    If method is defined for cls_type, return a callable that calls this method.
    If not, return None.
    r#   r$   z):
    return r   .(r   Nz)
r   )jit_methodsr   r0   r"   )cls_typemethodr   r1   r   r   r   r   r'   F   s   

r'   c                  G   s8   t dd | D sJ | | D ]
}|dur|  S qdS )z)
    Take the first non-None option.
    c                 s   s"    | ]}|d u pt |V  qd S N)r   
isfunction)r(   or   r   r   	<genexpr>X   s     ztake_first.<locals>.<genexpr>N)all)r,   r:   r   r   r   r+   T   s   r+   c                 C   s6   t | d}d| jv rdd }nd }dd }t|||S )N__bool____len__c                 S      t t| S r8   )boolr   xr   r   r   using_len_implc   s   z"class_bool.<locals>.using_len_implc                 S   s   dS )NTr   rA   r   r   r   <lambda>h   s    zclass_bool.<locals>.<lambda>r'   r5   r+   )rB   using_bool_implrC   always_true_implr   r   r   
class_bool^   s   


rH   c                 C      t t| ddd S )N__complex__c                 S   r?   r8   )complexfloatrA   r   r   r   rD   q       zclass_complex.<locals>.<lambda>r+   r'   rA   r   r   r   class_complexm      rO   c                 C   s   t | ddS )N__contains__r   r&   rB   yr   r   r   class_containsu   s   rT   c                 C   s4   t | dg}tdkrd| jv r|dd  t| S )N	__float__      	__index__c                 S   s   t |  S r8   )rL   rY   rA   r   r   r   rD      rM   zclass_float.<locals>.<lambda>)r'   r   r5   appendr+   rB   r,   r   r   r   class_float|   s   r\   c                 C   s,   t | dg}tdkr|t | d t| S )N__int__rV   rY   )r'   r   rZ   r+   r[   r   r   r   	class_int   s   r^   c                 C   rI   )N__str__c                 S   s   t | S r8   )reprrA   r   r   r   rD      s    zclass_str.<locals>.<lambda>rN   rA   r   r   r   	class_str   rP   ra   c                 C   s   t t| dddd S )N__ne__r   c                 S   s
   | |k S r8   r   rR   r   r   r   rD      s   
 zclass_ne.<locals>.<lambda>rN   rR   r   r   r   class_ne   s   
rc   c                    s    fdd}t | | d S )Nc                    s>   t | d  dd}d d|jv rdd }nd }t||S )Nr%   r   c                 S   s   || kS r8   r   rR   r   r   r   reflected_impl   s   zEregister_reflected_overload.<locals>.class_lt.<locals>.reflected_implrE   )rB   rS   normal_implrd   meth_forwardmeth_reflectedr   r   class_lt   s
   

z-register_reflected_overload.<locals>.class_lt)r   )r   rg   rh   ri   r   rf   r   register_reflected_overload   s   rj   absr   hashgelegtlteqaddr   floordivlshiftmulmodnegpospowrshiftsubtruediviadd	ifloordivilshiftimulimodipowirshiftisubitruedivandorxoriandiorixor)r   )B__doc__	functoolsr   r   operatornumba.core.extendingr   numba.core.typesr   numba.core.utilsr   r   r   r"   r2   r'   r+   r@   rH   rK   rO   containsrT   rL   r\   intr^   strra   nerc   rj   rk   r   rl   rm   ro   rn   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   and_or_r   r   r   r   r   r   r   r   <module>   s|    	






	





