U
    iâËd™/  ã                   @   sb  d Z ddlZddlZddlmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZmZmZmZ ejG dd	„ d	e
jƒƒZed
e
jdd… fde
jfgd�Ze eej¡ G dd„ dejƒZejG dd„ de
jƒƒZe eed
dg¡ edd„ ƒZedd„ ƒZ edd„ ƒZ!edd„ ƒZ"edd„ ƒZ#edd„ ƒZ$edd„ ƒZ%edd „ ƒZ&G d!d"„ d"eeƒZ'eed#ƒd$d%„ ƒZ(eed&ƒd'd(„ ƒZ)G d)d*„ d*eeƒZ*d+d,„ Z+d-d.„ Z,G d/d0„ d0eeƒZ-ejG d1d2„ d2e
jƒƒZ.e.d3e
j/fd4e
j/ffd�Z0G d5d6„ d6ejƒZ1ed7d8„ ƒZ2ed9d:„ ƒZ3e e1e.d3d4g¡ ee.d;ƒd<d=„ ƒZ4ee.d&ƒd>d?„ ƒZ5G d@dA„ dAeeƒZ6dS )Bz%
Test mutable struct, aka, structref
é    N)ÚtypedÚnjitÚerrorsÚtypeof)Útypes)Ú	structref)Úoverload_methodÚoverload_attribute)ÚMemoryLeakMixinÚTestCaseÚtemp_directoryÚoverride_configc                   @   s   e Zd ZdZdS )ÚMySimplerStructTypezV
    Test associated with this type represent the lowest level uses of structref.
    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úT/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_struct_ref.pyr      s   r   ÚvaluesÚcounter)Úfieldsc                   @   sV   e Zd Zdd„ Zedd„ ƒZejdd„ ƒZedd„ ƒZdd	„ Zed
d„ ƒZ	dd„ Z
dS )ÚMyStructc                 C   s   t j | ||¡S ©N©r   ÚStructRefProxyÚ__new__)Úclsr   r   r   r   r   r   "   s    zMyStruct.__new__c                 C   s   t | ƒS r   )Ú
get_values©Úselfr   r   r   r   *   s    zMyStruct.valuesc                 C   s
   t | |ƒS r   )Ú
set_values)r!   Úvalr   r   r   r   .   s    c                 C   s   t | ƒS r   )Úget_counterr    r   r   r   r   2   s    zMyStruct.counterc                 C   s   | j | | j S r   ©r   r   ©r!   Úargr   r   r   Útestme6   s    zMyStruct.testmec                 C   s   | j | jfS r   r%   r    r   r   r   Úprop9   s    zMyStruct.propc                 C   s   t | ƒS r   )Úcompute_fieldsr    r   r   r   Ú__hash__=   s    zMyStruct.__hash__N)r   r   r   r   Úpropertyr   Úsetterr   r(   r)   r+   r   r   r   r   r       s   



r   c                   @   s   e Zd ZdZdS )ÚMyStructTypezTTest associated with this type represent the higher-level uses of
    structef.
    Nr   r   r   r   r   r.   A   s   r.   c                 C   s   t  t¡}t|| |ƒ |S r   )r   ÚnewÚmy_struct_tyÚmy_struct_init)r   r   Ústr   r   r   Ú	my_structS   s    
r3   c                 C   s   || _ || _d S r   r%   )r!   r   r   r   r   r   r1   Z   s    r1   c                 C   s.   t | |d�}| j|j7  _| j|9  _|S )N©r   )r3   r   r   )ÚvsÚctrr2   r   r   r   Úctor_by_intrinsic`   s    r7   c                 C   s   t | |d�S ©Nr%   ©r   )r5   r6   r   r   r   Úctor_by_classh   s    r:   c                 C   s   | j S r   ©r   ©r2   r   r   r   r   m   s    r   c                 C   s
   || _ d S r   r;   )r2   r#   r   r   r   r"   r   s    r"   c                 C   s   | j S r   r4   r<   r   r   r   r$   w   s    r$   c                 C   s   | j | j S r   r%   r<   r   r   r   r*   |   s    r*   c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestStructRefBasicc              	   C   sº   t  dt jfg¡}|  |jd t j¡ t  dt jfdt jfg¡}|  |jd t j¡ |  |jd t j¡ |  td¡� t  dt jfg¡ W 5 Q R X |  td¡� t  dg¡ W 5 Q R X d S )NÚaÚbzexpecting a str for field nameé   z%expecting a Numba Type for field type)r>   é{   )r   Ú	StructRefÚint64ÚassertEqualZ
field_dictÚfloat64ÚassertRaisesRegexÚ
ValueError)r!   Úsrr   r   r   Útest_structref_type‚   s    ÿÿz&TestStructRefBasic.test_structref_typec              	   C   sN   |   td¡� t tj¡ W 5 Q R X |   td¡� t tjt¡ W 5 Q R X d S )Nzcannot register)rF   rG   r   Úregisterr   rB   Údefine_boxingr   r    r   r   r   Útest_invalid_uses�   s    z$TestStructRefBasic.test_invalid_usesc                 C   sf   t jdt jd�}d}|| }t||ƒ}|  |t¡ |  |t|ƒ¡ |||  }t|ƒ}|  ||¡ d S )Né
   ©Zdtypeé   )	ÚnpÚarangeÚintpr7   ZassertNotIsInstancer   ÚassertPreciseEqualr   r*   )r!   r5   r6   Zfirst_expectedÚ	first_gotÚsecond_expectedÚ
second_gotr   r   r   Útest_MySimplerStructType–   s    
z+TestStructRefBasic.test_MySimplerStructTypec              	   C   sl   t jdt jd�}d}t||ƒ}|  |tj¡ |  td¡� |j	 W 5 Q R X |  td¡� |j
 W 5 Q R X d S )NrM   rN   rO   r   r   )rP   rQ   rR   r7   ÚassertIsInstancer   r   rF   ÚAttributeErrorr   r   )r!   r5   r6   Úwrapperr   r   r   Ú-test_MySimplerStructType_wrapper_has_no_attrs¥   s    
z@TestStructRefBasic.test_MySimplerStructType_wrapper_has_no_attrsc                 C   sn   t jdt jd�}d}| ¡ }t||ƒ}|  |t¡ |  ||j¡ || }t	|ƒ}|  ||¡ |  
|j|¡ d S ©NrM   rN   é   )rP   rQ   rE   Úcopyr:   rX   r   rS   r   r*   rD   r   )r!   r5   r6   Zfirst_expected_arrrT   rU   rV   r   r   r   Útest_MyStructType¯   s    
z$TestStructRefBasic.test_MyStructTypec                 C   sZ   t dd„ ƒ}|ddddƒ\}}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ d S )Nc                 S   s   t | |ƒt ||ƒfS r   r9   )ÚxÚyÚmÚnr   r   r   Ú
mixed_type¿   s    zDTestStructRefBasic.test_MyStructType_mixed_types.<locals>.mixed_typer@   çffffff@y        333333@)é   )r   rD   r   r   )r!   rd   r>   r?   r   r   r   Útest_MyStructType_mixed_types½   s    
z0TestStructRefBasic.test_MyStructType_mixed_typesc                 C   s´   t  ¡ }tddƒ|d< |  |d jd¡ |  |d jd¡ tddƒ|d< |  |d jd¡ |  |d jd¡ |d  jd7  _|  |d jd¡ |  |d jd¡ tdd	ƒ|d
< d S )Nr@   re   r>   é   gffffff
@rM   é   rf   gffffff@r?   )r   ÚDictr   rD   r   r   ©r!   Útdr   r   r   Útest_MyStructType_in_dictÉ   s    z,TestStructRefBasic.test_MyStructType_in_dictc              	   C   sn   |   ¡  t ¡ }tddƒ|d< |  |d jd¡ |  |d jd¡ |  tj	d¡� tddƒ|d< W 5 Q R X d S )Nr@   re   r>   zCannot cast numba.MyStructTyper?   )
Zdisable_leak_checkr   rj   r   rD   r   r   rF   r   ZTypingErrorrk   r   r   r   Ú*test_MyStructType_in_dict_mixed_type_errorÙ   s    ÿz=TestStructRefBasic.test_MyStructType_in_dict_mixed_type_errorc                 C   s&   t ddƒ}t|ƒ |  t|ƒd¡ d S )Nr@   rh   é   )r   r   rD   Úhash)r!   r2   r   r   r   Ú*test_MyStructType_hash_no_typeof_recursionè   s    
z=TestStructRefBasic.test_MyStructType_hash_no_typeof_recursionN)r   r   r   rI   rL   rW   r[   r_   rg   rm   rn   rq   r   r   r   r   r=   �   s   
r=   r(   c                 C   s   dd„ }|S )Nc                 S   s   | j | | j S r   r%   r&   r   r   r   Úimpló   s    z%_ol_mystructtype_testme.<locals>.implr   )r!   r'   rr   r   r   r   Ú_ol_mystructtype_testmeñ   s    rs   r)   c                 C   s   dd„ }|S )Nc                 S   s   | j | jfS r   r%   r    r   r   r   Úgetú   s    z"_ol_mystructtype_prop.<locals>.getr   ©r!   rt   r   r   r   Ú_ol_mystructtype_propø   s    rv   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestStructRefExtendingc                 C   s2   t dd„ ƒ}d}||ƒ}| |¡}|  ||¡ d S )Nc                 S   s(   t jdt jd�}d}t||ƒ}| | ¡S r\   )rP   rQ   rE   r   r(   )r`   r5   r6   Úobjr   r   r   Úcheck  s    
z:TestStructRefExtending.test_overload_method.<locals>.checkro   ©r   Zpy_funcrS   ©r!   ry   r`   ÚgotÚexpectr   r   r   Útest_overload_method   s    

z+TestStructRefExtending.test_overload_methodc                 C   s*   t dd„ ƒ}|ƒ }| ¡ }|  ||¡ d S )Nc                  S   s$   t jdt jd�} d}t| |ƒ}|jS r\   )rP   rQ   rE   r   r)   )r5   r6   rx   r   r   r   ry     s    
z=TestStructRefExtending.test_overload_attribute.<locals>.checkrz   ©r!   ry   r|   r}   r   r   r   Útest_overload_attribute  s
    
z.TestStructRefExtending.test_overload_attributeN)r   r   r   r~   r€   r   r   r   r   rw   ÿ   s   rw   c                 C   s   t | |d�}|S r8   r9   )r`   ra   Ústructr   r   r   Úcaching_test_make  s    r‚   c                 C   s
   |   |¡S r   )r(   )r�   Úzr   r   r   Úcaching_test_use  s    r„   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestStructRefCachingc                 C   s@   t tjƒ| _td| jƒ| _| j ¡  t d¡ tj	ddd� d S )NZ	CACHE_DIRÚerrorÚignoreZ	typeguard)ÚactionÚmodule)
r   r…   r   Z
_cache_dirr   Ú_cache_overrideÚ	__enter__ÚwarningsÚsimplefilterÚfilterwarningsr    r   r   r   ÚsetUp$  s
    

zTestStructRefCaching.setUpc                 C   s   | j  d d d ¡ t ¡  d S r   )rŠ   Ú__exit__rŒ   Úresetwarningsr    r   r   r   ÚtearDown+  s    zTestStructRefCaching.tearDownc                    s@   ‡fdd„‰ ‡fdd„‰‡ ‡‡fdd„}|dd� |d	d� d S )
Nc                    s(   ˆ   t| jƒd¡ ˆ   t| jƒd¡ d S )Nr@   r   ©rD   ÚlenZ
cache_hitsZcache_misses©Ústatsr    r   r   Úassert_cached0  s    zBTestStructRefCaching.test_structref_caching.<locals>.assert_cachedc                    s(   ˆ   t| jƒd¡ ˆ   t| jƒd¡ d S )Nr   r@   r“   r•   r    r   r   Úassert_not_cached4  s    zFTestStructRefCaching.test_structref_caching.<locals>.assert_not_cachedc           	         sŽ   t dd�tƒ}t dd�tƒ}tj d¡}d}d}|||ƒ}|||ƒ}|| | }ˆ ||¡ | rvˆ |jƒ ˆ |jƒ nˆ|jƒ ˆ|jƒ d S )NT)Úcachero   é   )r   r‚   r„   rP   ÚrandomrS   r–   )	ÚcachedZ
check_makeZ	check_user5   r6   Úfactorr2   r|   r}   ©r—   r˜   r!   r   r   ry   8  s    



z:TestStructRefCaching.test_structref_caching.<locals>.checkF)rœ   Tr   )r!   ry   r   rž   r   Útest_structref_caching/  s
    
z+TestStructRefCaching.test_structref_cachingN)r   r   r   r�   r’   rŸ   r   r   r   r   r…   #  s   r…   c                   @   s   e Zd Zdd„ ZdS )ÚPolygonStructTypec                 C   s6   dt | ƒ› �| _tdt tj¡fdt | ¡fgƒ}|S )Nznumba.PolygonStructType#ÚvalueÚparent)ÚidÚnameÚtupler   ÚOptionalrC   )r!   r   r   r   r   Úpreprocess_fieldsQ  s    þz#PolygonStructType.preprocess_fieldsN)r   r   r   r§   r   r   r   r   r    N  s   r    r¡   r¢   c                   @   s,   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdS )ÚPolygonStructc                 C   s   t j | ||¡S r   r   )r   r¡   r¢   r   r   r   r   c  s    zPolygonStruct.__new__c                 C   s   t | ƒS r   )ÚPolygonStruct_get_valuer    r   r   r   r¡   f  s    zPolygonStruct.valuec                 C   s   t | ƒS r   )ÚPolygonStruct_get_parentr    r   r   r   r¢   j  s    zPolygonStruct.parentN)r   r   r   r   r,   r¡   r¢   r   r   r   r   r¨   b  s
   
r¨   c                 C   s   | j S r   ©r¡   r    r   r   r   r©   o  s    r©   c                 C   s   | j S r   )r¢   r    r   r   r   rª   t  s    rª   Úflipc                 C   s   dd„ }|S )Nc                 S   s   | j d k	r| j  | _ d S r   r«   r    r   r   r   rr   ‚  s    
z%_ol_polygon_struct_flip.<locals>.implr   )r!   rr   r   r   r   Ú_ol_polygon_struct_flip€  s    r­   c                 C   s   dd„ }|S )Nc                 S   s   | j | jfS r   )r¡   r¢   r    r   r   r   rt   Š  s    z$_ol_polygon_struct_prop.<locals>.getr   ru   r   r   r   Ú_ol_polygon_struct_propˆ  s    r®   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestStructRefForwardTypingc                 C   s,   t dd„ ƒ}d}||ƒ}|}|  ||¡ d S )Nc                 S   s.   t d d ƒ}t d d ƒ}| |_||_| |_|jjS r   )r¨   r¡   r¢   ©r`   ZpolyZp_polyr   r   r   ry   ‘  s    

zCTestStructRefForwardTyping.test_same_type_assignment.<locals>.checkr]   ©r   rS   r{   r   r   r   Útest_same_type_assignment�  s    
z4TestStructRefForwardTyping.test_same_type_assignmentc                 C   s.   t dd„ ƒ}d}||ƒ}| }|  ||¡ d S )Nc                 S   s@   t d d ƒ}t d d ƒ}| |_||_| |_| ¡  |j ¡  |jjS r   )r¨   r¡   r¢   r¬   r°   r   r   r   ry      s    


z>TestStructRefForwardTyping.test_overload_method.<locals>.checkro   r±   r{   r   r   r   r~   Ÿ  s    

z/TestStructRefForwardTyping.test_overload_methodc                 C   s&   t dd„ ƒ}|ƒ }d}|  ||¡ d S )Nc                  S   s   t dd ƒ} | jd S )Né   r   )r¨   r)   )rx   r   r   r   ry   ±  s    
zATestStructRefForwardTyping.test_overload_attribute.<locals>.checkr³   r±   r   r   r   r   r€   °  s
    
z2TestStructRefForwardTyping.test_overload_attributeN)r   r   r   r²   r~   r€   r   r   r   r   r¯   �  s   r¯   )7r   rŒ   ÚnumpyrP   Znumbar   r   r   r   Z
numba.corer   Znumba.experimentalr   Znumba.extendingr   r	   Znumba.tests.supportr
   r   r   r   rJ   rB   r   rR   r0   rK   r   r   r.   Zdefine_proxyr3   r1   r7   r:   r   r"   r$   r*   r=   rs   rv   rw   r‚   r„   r…   r    ÚAnyZpolygon_struct_typer¨   r©   rª   r­   r®   r¯   r   r   r   r   Ú<module>   s†   ÿ!
ý







p

+þ

ý

