U
    ¿|ec  ã                   @   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„ Z	dd	„ Z
d
d„ Zddœdd„ZdGd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(d/d-d� eej)d0d-d� eej*d1d-d� eej+d2ƒ eej,d3ƒ eej-d4d-d� eej.d5d-d� eej/d6d-d� eej0d7d-d� eej1d8d,d-d� eej2d9d.d-d� eej3d:d/d-d� eej4d;d0d-d� eej5d<d1d-d� eej6d=d4d-d� eej7d>d5d-d� eej8d?d6d-d� eej9d@d7d-d� eej:dAd-d� eej;dBd-d� eej<dCd-d� eej=dDdAd-d� eej>dEdBd-d� eej?dFdCd-d� dS )Hz_
Overloads for ClassInstanceType for built-in functions that call dunder methods
on an object.
é    )ÚwrapsN)Úoverload)ÚClassInstanceTypec                 C   s   | dkst ‚tdƒd | … S )N)é   é   Úxy)ÚAssertionErrorÚlist©Ún_args© r   úb/var/www/website-v5/atlas_env/lib/python3.8/site-packages/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s8t‚tˆƒ|ƒS )Nc                     s   t | d tƒsd S ˆ | |Ž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   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 krRt|ƒ}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"   )Zcls_typeÚmethodr   r1   r   r   r   r   r'   E   s    
ÿþþþr'   c                  G   s8   t dd„ | D ƒƒst| ƒ‚| D ]}|dk	r|  S qdS )z)
    Take the first non-None option.
    c                 s   s    | ]}|d kpt  |¡V  qd S ©N)r   Ú
isfunction)r(   Úor   r   r   Ú	<genexpr>W   s     ztake_first.<locals>.<genexpr>N)Úallr   )r,   r9   r   r   r   r+   S   s    r+   c                 C   s6   t | dƒ}d| jkrdd„ }nd }dd„ }t|||ƒS )NÚ__bool__Ú__len__c                 S   s   t t| ƒƒS r7   )Úboolr   ©Úxr   r   r   Úusing_len_implb   s    z"class_bool.<locals>.using_len_implc                 S   s   dS )NTr   r?   r   r   r   Ú<lambda>g   ó    zclass_bool.<locals>.<lambda>©r'   r5   r+   )r@   Zusing_bool_implrA   Zalways_true_implr   r   r   Ú
class_bool]   s    


rE   c                 C   s   t t| dƒdd„ ƒS )NÚ__complex__c                 S   s   t t| ƒƒS r7   )ÚcomplexÚfloatr?   r   r   r   rB   p   rC   zclass_complex.<locals>.<lambda>©r+   r'   r?   r   r   r   Úclass_complexl   s    þrJ   c                 C   s   t | ddƒS )NÚ__contains__r   r&   ©r@   Úyr   r   r   Úclass_containst   s    rN   c                 C   s,   t | dƒg}d| jkr$| dd„ ¡ t|Ž S )NÚ	__float__Ú	__index__c                 S   s   t |  ¡ ƒS r7   )rH   rP   r?   r   r   r   rB   ‚   rC   zclass_float.<locals>.<lambda>)r'   r5   Úappendr+   ©r@   r,   r   r   r   Úclass_float{   s
    ÿrS   c                 C   s$   t | dƒg}| t | dƒ¡ t|Ž S )NÚ__int__rP   )r'   rQ   r+   rR   r   r   r   Ú	class_int‡   s    rU   c                 C   s   t t| dƒdd„ ƒS )NÚ__str__c                 S   s   t | ƒS r7   )Úreprr?   r   r   r   rB   ”   rC   zclass_str.<locals>.<lambda>rI   r?   r   r   r   Ú	class_str�   s    þrX   c                 C   s   t t| ddƒdd„ ƒS )NÚ__ne__r   c                 S   s
   | |k S r7   r   rL   r   r   r   rB   Ÿ   rC   zclass_ne.<locals>.<lambda>rI   rL   r   r   r   Úclass_ne˜   s    
þrZ   c                    s   ‡ ‡fdd„}t | ƒ|ƒ d S )Nc                    s>   t | dˆ › d�dƒ}dˆ› d�|jkr0dd„ }nd }t||ƒS )Nr%   r   c                 S   s   || kS r7   r   rL   r   r   r   Úreflected_impl¨   s    zEregister_reflected_overload.<locals>.class_lt.<locals>.reflected_implrD   )r@   rM   Znormal_implr[   ©Úmeth_forwardÚmeth_reflectedr   r   Úclass_lt¤   s
    
z-register_reflected_overload.<locals>.class_lt)r   )r   r]   r^   r_   r   r\   r   Úregister_reflected_overload£   s    r`   Ú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   )@Ú__doc__Ú	functoolsr   r   ÚoperatorÚnumba.core.extendingr   Únumba.core.typesr   r   r   r"   r2   r'   r+   r>   rE   rG   rJ   ÚcontainsrN   rH   rS   ÚintrU   ÚstrrX   ÚnerZ   r`   ra   r   rb   rc   re   rd   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   Úand_Úor_r~   r   r€   r�   r   r   r   r   Ú<module>   sx   	












