U
    f7V                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ ddl	m
Z
 dadd Zdd Zd	d
 ZG dd dZe ZddddddddddddddgZddgiZed dg ed< ed dg ed< dged< dged< ed ddg ed< ed ddg ed< ed ddg ed< ed ddg ed< ed dg ed< ed dg ed< ed dg ed< ed dg ed< ed ddg ed< ed dddg ed< ed dg ed< e jjdkse jjdkrFejdkrFe e fdkrFedd d!g ed ddddg ed< ed dd d!g ed!< ed dd g ed < G d"d# d#ZG d$d% d%ZG d&d' d'ZG d(d) d)ZdS )*    N)typeinfo   )utilc                  C   sb   t  std tdkr^d} tjt}t 	ddddt 	ddt 	dd	g}t 
|| d
adS )z6
    Build the required testing extension module

    zNo C compiler availableNz
        config.add_extension('test_array_from_pyobj_ext',
                             sources=['wrapmodule.c', 'fortranobject.c'],
                             define_macros=[])
        testssrcZarray_from_pyobjzwrapmodule.czfortranobject.czfortranobject.hZtest_array_from_pyobj_ext)r   Zhas_c_compilerpytestskipwrapospathdirname__file__ZgetpathZbuild_module_distutils)Zconfig_codedr    r   M/tmp/pip-target-lpfmz8o1/lib/python/numpy/f2py/tests/test_array_from_pyobj.pysetup_module   s    


r   c                 C   s   t | d }t|S )N   )r	   array_attrsflags2names)arrflagsr   r   r   
flags_info*   s    r   c                 C   s0   g }dD ]"}t | tt|d@ r|| q|S )N)
CONTIGUOUSFORTRANOWNDATAZ
ENSURECOPYZENSUREARRAYZALIGNEDZ
NOTSWAPPED	WRITEABLEZWRITEBACKIFCOPYZBEHAVEDZ
BEHAVED_ROZCARRAYZFARRAYr   )absgetattrr	   append)r   infoZflagnamer   r   r   r   /   s
    r   c                   @   s@   e Zd Zg fddZdd Zdd Zdd Zd	d
 Zdd ZdS )Intentc                 C   sP   |d d  | _ d}|D ].}|dkr.|tjO }q|ttd|  O }q|| _d S )Nr   optionalZF2PY_INTENT_)intent_listr	   ZF2PY_OPTIONALr   upperr   )selfr"   r   ir   r   r   __init__F   s    zIntent.__init__c                 C   s&   |  }|dkrd}| | j|g S )Nin_in)lower	__class__r"   )r$   namer   r   r   __getattr__P   s    zIntent.__getattr__c                 C   s   dd | j S )Nz
intent(%s),)joinr"   r$   r   r   r   __str__V   s    zIntent.__str__c                 C   s
   d| j  S )Nz
Intent(%r)r"   r/   r   r   r   __repr__Y   s    zIntent.__repr__c                 G   s   |D ]}|| j kr dS qdS )NFTr1   )r$   namesr+   r   r   r   	is_intent\   s    
zIntent.is_intentc                 G   s   t | jt |ko| j| S N)lenr"   r4   )r$   r3   r   r   r   is_intent_exactb   s    zIntent.is_intent_exactN)	__name__
__module____qualname__r&   r,   r0   r2   r4   r7   r   r   r   r   r    E   s   
r    ZBOOLZBYTEZUBYTEZSHORTZUSHORTINTZUINTLONGZULONGZLONGLONGZ	ULONGLONGFLOATDOUBLEZCFLOAT      win32)DarwinarmZ
LONGDOUBLEZCDOUBLEZCLONGDOUBLEc                   @   sH   e Zd Zi Zdd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )Typec                 C   s   t |tjrD|}d }t D ]&\}}t |ts|j|jkr|} qDq| j| d }|d k	rb|S t	
| }|| || j| < |S r5   )
isinstancenpdtyper   itemstype_type_cachegetr#   object__new___init)clsr+   Zdtype0nr%   objr   r   r   rM      s    

zType.__new__c                 C   sd   |  | _t| j }ttd| j | _| j|jks6tt	|j
| _	|j
| _
|jd | _|j| _d S )NZNPY_r@   )r#   NAMEr   r   r	   type_numnumAssertionErrorrF   rG   rI   bitselsizechar	dtypechar)r$   r+   r   r   r   r   rN      s    

z
Type._initc                    s    fddt  j D S )Nc                    s   g | ]}  |qS r   r*   .0_mr/   r   r   
<listcomp>   s     z#Type.cast_types.<locals>.<listcomp>)
_cast_dictrR   r/   r   r/   r   
cast_types   s    zType.cast_typesc                    s    fddt D S )Nc                    s   g | ]}  |qS r   rZ   r[   r/   r   r   r^      s     z"Type.all_types.<locals>.<listcomp>)_type_namesr/   r   r/   r   	all_types   s    zType.all_typesc                 C   s:   t | j j}g }tD ] }t | j|k r|t| q|S r5   r   rR   	alignmentra   r   rD   r$   rV   typesr+   r   r   r   smaller_types   s    zType.smaller_typesc                 C   sF   t | j j}g }tD ],}|| jkr$qt | j|kr|t| q|S r5   rc   re   r   r   r   equal_types   s    
zType.equal_typesc                 C   s:   t | j j}g }tD ] }t | j|kr|t| q|S r5   rc   re   r   r   r   larger_types   s    zType.larger_typesN)r8   r9   r:   rJ   rM   rN   r`   rb   rg   rh   ri   r   r   r   r   rD      s   

rD   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Arrayc                 C   s(  || _ || _|| _t|| _|| _t|j	||j
|| _t| jtjsLtt| j| _t|dkr| jdr|j
tj@ st| jj
d rt| jj
d st| jd tj@ rtnD|j
tj@ rt| jj
d st| jj
d rt| jd tj@ st|d krd | _d | _d S |drXt|tjs@ttt |t|j|  | _nHtjtj||jdj| | jdrdpd	d
| _| jj|kst| jj| jj
d d | jj
d st||ft| j| _t|dkrp| jdr6| jj
d rt| jj
d st| jd tj@ rptn:| jj
d sHt| jj
d rZt| jd tj@ spt| jd | jd kst| jd | jd kst| jd dkr| jd | jd kstt| jd | jd | j | j f| jd dd  | jd dd  ks t| jd | jd ksztt| jd | jd td| jd  | jd  t| jd |f|dr| jd d | j j kstn2| jd d | j j kst| !| j| jstt| jtjr$|j t"|jj kr$|ds$| jd dkr$| # s$td S )Nr   cr   r   r   cacherG   CF)orderr   writer            r   copy)$rI   dimsintentrw   deepcopyZobj_copyrQ   r	   callrS   r   r   rE   rF   ndarrayrU   r   arr_attrr6   r4   ZF2PY_INTENT_Cr   ZpyarrZ
pyarr_attrreprarrayZreshaperY   rG   setflagstobytesr   rW   	arr_equalrD   has_shared_memory)r$   typrx   ry   rQ   r   r   r   r&      s    
*zArray.__init__c                 C   s   |j |j krdS ||k S )NF)shapeall)r$   Zarr1Zarr2r   r   r   r   8  s    zArray.arr_equalc                 C   s
   t | jS r5   )strr   r/   r   r   r   r0   =  s    zArray.__str__c                 C   s@   | j | jkrdS t| j tjs"dS t| j }|d | jd kS )z6Check that created array shares data with input array.TFr   )rQ   r   rE   rF   r|   r	   r   r}   )r$   Zobj_attrr   r   r   r   @  s    zArray.has_shared_memoryN)r8   r9   r:   r&   r   r0   r   r   r   r   r   rj      s   Srj   c                   @   s   e Zd Zdd ZdS )
TestIntentc                 C   st   t tjjdksttjjds&ttjjdr8ttjjddsLttjjdds`ttjdrptd S )Nzintent(in,out)rk   r(   )r   ry   r'   outrU   rk   r4   r7   r/   r   r   r   test_in_outK  s    zTestIntent.test_in_outN)r8   r9   r:   r   r   r   r   r   r   J  s   r   c                   @   s&  e Zd ZddgZdddgdddggZejdded	d
d Zdd Z	dd Z
ejdddgejdddgejdddg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+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ Z dAS )BTestSharedMemoryr   rs   rt   r?   ru   r   Tclass)Zautousescopeparamsc                    s"   t  j j_ fdd j_d S )Nc                    s   t t j|||S r5   )rj   rD   param)r$   rx   ry   rQ   requestr   r   <lambda>[  s
      z-TestSharedMemory.setup_type.<locals>.<lambda>)rD   r   rO   rI   r   )r$   r   r   r   r   
setup_typeX  s    zTestSharedMemory.setup_typec                 C   s$   |  dgtj| j}| r td S )Nrs   )r   ry   r'   num2seqr   rU   r$   ar   r   r   test_in_from_2seq^  s    z"TestSharedMemory.test_in_from_2seqc                 C   sx   | j  D ]h}tj| j|jd}| t| jgtj|}|j	| j j	krf|
 srtt| j j|jfq
|
 r
tq
d S Nrm   )rI   r`   rF   r   r   rG   r6   ry   r'   rW   r   rU   r~   r$   trQ   r   r   r   r   test_in_from_2casttypeb  s     z'TestSharedMemory.test_in_from_2casttyperr   wrorp   rn   ro   inpZ2seqZ23seqc                 C   sd   t | d| }tj|| jj|d}|j|dkd | |j|dkrJtjj	pNtj|}|
 s`tdS )z5Test if intent(in) array can be passed without copiesrT   rG   rp   r   rq   rn   N)r   rF   r   rI   rG   r   r   ry   r'   rk   r   rU   )r$   rr   rp   r   seqrQ   r   r   r   r   test_in_nocopyk  s     zTestSharedMemory.test_in_nocopyc              
   C   s   t j| j| jjd}| t| jgtj|}| s8t	z| dgtj
j| j}W n2 tk
r } zt|dst W 5 d }~X Y n
X tdd S )Nrm   rs   z6failed to initialize intent(inout|inplace|cache) arrayz,intent(inout) should have failed on sequence)rF   r   r   rI   rG   r6   ry   inoutr   rU   r'   	TypeErrorr   
startswithSystemError)r$   rQ   r   msgr   r   r   test_inout_2seqw  s    z TestSharedMemory.test_inout_2seqc              
   C   s   t j| j| jjdd}t| jt| jd f}| |tjj|}|	 sLt
t j| j| jjdd}t| jt| jd f}z| |tjj|}W n2 tk
r } zt|ds W 5 d }~X Y n
X tdd S )Nro   r   r   rn   z(failed to initialize intent(inout) arrayz2intent(inout) should have failed on improper array)rF   r   num23seqrI   rG   r6   ry   r'   r   r   rU   
ValueErrorr   r   r   )r$   rQ   r   r   r   r   r   r   test_f_inout_23seq  s     z#TestSharedMemory.test_f_inout_23seqc                 C   sP   t j| j| jjd}t| jt| jd f}| |tjjj	|}|
 sLtd S Nrm   r   )rF   r   r   rI   rG   r6   ry   r'   rk   r   r   rU   r$   rQ   r   r   r   r   r   test_c_inout_23seq  s    z#TestSharedMemory.test_c_inout_23seqc                 C   sL   | j  D ]<}tj| j|jd}| t| jgtjj	|}|
 r
tq
d S r   )rI   r`   rF   r   r   rG   r6   ry   r'   rw   r   rU   r   r   r   r   test_in_copy_from_2casttype  s    z,TestSharedMemory.test_in_copy_from_2casttypec                 C   s6   |  t| jt| jd gtj| j}| r2td S Nr   )r   r6   r   ry   r'   r   rU   r   r   r   r   test_c_in_from_23seq  s     z%TestSharedMemory.test_c_in_from_23seqc                 C   sV   | j  D ]F}tj| j|jd}| t| jt| jd gtj|}|	 r
t
q
d S r   )rI   r`   rF   r   r   rG   r6   ry   r'   r   rU   r   r   r   r   test_in_from_23casttype  s      z(TestSharedMemory.test_in_from_23casttypec                 C   st   | j  D ]d}tj| j|jdd}| t| jt| jd gtj|}|j	| j j	krb|
 sntq
|
 r
tq
d S Nro   r   r   )rI   r`   rF   r   r   rG   r6   ry   r'   rW   r   rU   r   r   r   r   test_f_in_from_23casttype  s      z*TestSharedMemory.test_f_in_from_23casttypec                 C   st   | j  D ]d}tj| j|jd}| t| jt| jd gtjj	|}|j
| j j
krb| sntq
| r
tq
d S r   )rI   r`   rF   r   r   rG   r6   ry   r'   rk   rW   r   rU   r   r   r   r   test_c_in_from_23casttype  s      z*TestSharedMemory.test_c_in_from_23casttypec                 C   sZ   | j  D ]J}tj| j|jdd}| t| jt| jd gtjj	|}|
 r
tq
d S r   )rI   r`   rF   r   r   rG   r6   ry   r'   rw   r   rU   r   r   r   r   test_f_copy_in_from_23casttype  s     z/TestSharedMemory.test_f_copy_in_from_23casttypec                 C   sZ   | j  D ]J}tj| j|jd}| t| jt| jd gtjj	j
|}| r
tq
d S r   )rI   r`   rF   r   r   rG   r6   ry   r'   rk   rw   r   rU   r   r   r   r   test_c_copy_in_from_23casttype  s     z/TestSharedMemory.test_c_copy_in_from_23casttypec                 C   s>  | j  D ],}|j| j jkr q
tj| j|jd}t| jf}| |tj	j
j|}| s^t| |tj	j|}| s|ttj| j|jdd}| |tj	j
j|}| st| |tj	j|}| stt|jz | |tj	j|d d d }W n6 tk
r. } zt|ds W 5 d }~X Y q
X tdq
d S )Nrm   ro   r   (failed to initialize intent(cache) arrayz8intent(cache) should have failed on multisegmented array)rI   rb   rW   rF   r   r   rG   r6   ry   r'   rk   rl   r   rU   r~   r   r   r   r   )r$   r   rQ   r   r   r   r   r   r   test_in_cache_from_2casttype  s0     z-TestSharedMemory.test_in_cache_from_2casttypec                 C   s   | j  D ]}|j| j jkrq
tj| j|jd}t| jf}z| |tj	j
| W n2 tk
r } zt|dst W 5 d }~X Y q
X tdq
d S )Nrm   r   z1intent(cache) should have failed on smaller array)rI   rb   rW   rF   r   r   rG   r6   ry   r'   rl   r   r   r   r   )r$   r   rQ   r   r   r   r   r   $test_in_cache_from_2casttype_failure  s    z5TestSharedMemory.test_in_cache_from_2casttype_failurec              
   C   s   d}|  |tjjd }|jj|ks&td}|  |tjjd }|jj|ksLtd}z|  |tjjd }W n2 tk
r } zt|	ds W 5 d }~X Y n
X t
dd S )Nrs   rs   rt   r   rt   2failed to create intent(cache|hide)|optional arrayz8intent(cache) should have failed on undefined dimensions)r   ry   rl   hider   r   rU   r   r   r   r   r$   r   r   r   r   r   r   test_cache_hidden  s"    z"TestSharedMemory.test_cache_hiddenc              
   C   sf  d}|  |tjd }|jj|ks$t||jtj|| j	j
dsDtd}|  |tjd }|jj|ksht||jtj|| j	j
dst|jjd r|jjd rtd}|  |tjjd }|jj|kst||jtj|| j	j
dst|jjd s|jjd s
td}z|  |tjd }W n6 tk
rX } zt|dsH W 5 d }~X Y n
X tdd S )	Nr   rm   r   r   r   r   r   z7intent(hide) should have failed on undefined dimensions)r   ry   r   r   r   rU   r   rF   zerosrI   rG   r   rk   r   r   r   r   r   r   r   r   test_hidden  s2        zTestSharedMemory.test_hiddenc                 C   s  d}|  |tjd }|jj|ks$t||jtj|| j	j
dsDtd}|  |tjd }|jj|ksht||jtj|| j	j
dst|jjd r|jjd rtd}|  |tjjd }|jj|kst||jtj|| j	j
dst|jjd s|jjd s
td S )Nr   rm   r   r   r   )r   ry   r!   r   r   rU   r   rF   r   rI   rG   r   rk   )r$   r   r   r   r   r   test_optional_none2  s       z#TestSharedMemory.test_optional_nonec                 C   s@   | j }t|f}| |tj|}|jj|ks0t| r<td S r5   )	r   r6   r   ry   r!   r   r   rU   r   r   r   r   r   test_optional_from_2seqD  s
    
z(TestSharedMemory.test_optional_from_2seqc                 C   sx   | j }t|t|d f}| |tj|}|jj|ks:t| rFt| |tjj	|}|jj|ksht| rttd S r   )
r   r6   r   ry   r!   r   r   rU   r   rk   r   r   r   r   test_optional_from_23seqK  s    z)TestSharedMemory.test_optional_from_23seqc                 C   s   t j| j| jjd}|jd s(|jd s,t|j}| |tj	|}|d d |j
d d ksntt||j
fd|j
d d< |d d |j
d d   krt jd| jjdksn t|j
|kst|jd st|jd rtd S Nrm   r   r   r   rs   6   )rF   r   r   rI   rG   r   rU   r   ry   inplacer   r~   r   r   r   r   test_inplaceV  s    ,:zTestSharedMemory.test_inplacec                 C   s@  | j  D ].}|| j krq
tj| j|jd}|jj |j ks@t|jj | j j k	sTt|jd sh|jd slt|j}| |t	j
|}|d d |jd d kstt||jfd|jd d< |d d |jd d   krtjd| j jdksn t|j|kst|jd st|jd r&t|jj | j j ks
tq
d S r   )rI   r`   rF   r   r   rG   rU   r   r   ry   r   r   r~   )r$   r   rQ   r   r   r   r   r   test_inplace_from_casttypeb  s$    
,$z+TestSharedMemory.test_inplace_from_casttypeN)!r8   r9   r:   r   r   r   Zfixturera   r   r   r   markZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   T  s:   
		

r   )r
   sysrw   platformr   numpyrF   Znumpy.core.multiarrayr    r   r	   r   r   r   r    ry   ra   r_   ZintprG   itemsizeZclongdoublerd   system	processorextendrD   rj   r   r   r   r   r   r   <module>   s   !


$

>f
