o
    ez                  
   @   s  d dl mZ ddlmZmZ ddlmZ ddlmZmZm	Z	 ddlm
Z
 ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&e!e"e#e$e%e&d!Z'd"d#d$d%d&d'd!Z(d(Z)d)Z*d*Z+d+Z,d,Z-d-d. Z.	0dd1d2Z/	/dd3d4Z0d5d6 Z1d7d8 Z2d9d: Z3dd;d<Z4G d=d> d>ej5Z6d?d@ Z7dAdB Z8dCdD Z9dEdF Z:dGdH Z;ddIdJZ<G dKdL dLe=Z>G dMdN dNe>Z?G dOdP dPe>Z@dQdR ZAdSdT ZBdUdV ZCdWdX ZDdYdZ ZEd[d\ ZFd]d^d_d`dadbdcZGddde ZHdfdg ZIdhdi ZJdjdk ZKddmdnZLddodpZMdqdr ZNe,e
jOe-ejPjQdsdtZReMdueRg dvZSeMdweRZTeMdxeUeRe
jOdyeSeTgdvZVeMdzZWeLd{ejXgd|ZYeMd}eRZZeMd~eRZ[eMdeRg d|Z\eLdeRe] ej^ej_eVeZe[e\gdvZ`dZaeSjbce` e\jbce` dlS )    )absolute_import   )CompileErrorerror)	ExprNodes)IntNodeNameNodeAttributeNode)Options)UtilityCodeTempitaUtilityCode)CythonUtilityCode)Buffer)
PyrexTypes)
ModuleNodezStart must not be given.z3Axis specification only allowed in the 'step' slot.z.Step must be omitted, 1, or a valid specifier.z>Cannot specify an array that is both C and Fortran contiguous.zInvalid axis specification.z+Variable was not cimported from cython.viewz=no expressions allowed in axis spec, only names and literals.z<Invalid axis specification for a C/Fortran contiguous array.zdCannot check if memoryview %s is initialized without the GIL, consider using initializedcheck(False)ZPyBUF_FORMATz#(PyBUF_C_CONTIGUOUS | PyBUF_FORMAT)z#(PyBUF_F_CONTIGUOUS | PyBUF_FORMAT)z%(PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT)ZPyBUF_FULL_ROZPyBUF_RECORDS_ROZ__Pyx_MEMVIEW_DIRECTZ__Pyx_MEMVIEW_PTRZ__Pyx_MEMVIEW_FULLZ__Pyx_MEMVIEW_CONTIGZ__Pyx_MEMVIEW_STRIDEDZ__Pyx_MEMVIEW_FOLLOW)directptrfullcontigstridedfollowdpfcs_z{ 0, 0, { 0 }, { 0 }, { 0 } }
memoryviewZ__pyx_memoryview_typeZ__pyx_memoryview_objZ__Pyx_memviewslicec                 C   s    | d|   | d|   d S )Nz%s.data = NULL;z%s.memview = NULL;)putln)Zmv_cnamecode r    JD:\Projects\ConvertPro\env\Lib\site-packages\Cython/Compiler/MemoryView.pyput_init_entryC   s   r"   FTc           	   	   C   s   |j jsJ | p| }|r| }n|jj|dd}|d|||f  t	| ||||||d |s>|j
| dS dS )zEWe can avoid decreffing the lhs if we know it is the first assignmentFZ
manage_ref%s = %s;)have_gilfirst_assignmentN)typeZis_memoryviewsliceresult_in_tempZ	is_simpleresult	funcstateallocate_tempr   Z	result_asput_assign_to_memviewslicerelease_temp)		lhs_cnameZlhs_typeZlhs_posrhsr   r%   r&   Z
pretty_rhsZrhstmpr    r    r!   put_acquire_memoryviewsliceL   s   
r0   c                 C   sR   | |kr| d d S |s|j| ||d | s|| | d| |f  d S )Nz&/* memoryview self assignment no-op */r%   r$   )r   Zput_xdecrefr(   Zmake_owned_memoryviewslice)r.   r/   Z	rhs_cnameZmemviewslicetyper   r%   r&   r    r    r!   r,   a   s   

r,   c                 C   s@   t | \}}|r
tS |rtS t|  \}}d|v sd|v rtS tS )Nr   r   )is_cf_contigmemview_c_contiguousmemview_f_contiguouszipmemview_full_accessmemview_strided_accessspecsis_c_contigis_f_contigaccesspackingr    r    r!   get_buf_flagss   s   r>   c                 C   s$   dg| }| | j t| j|S )Nr   r   )extendaxesr   MemoryViewSliceTypedtype)ZmemoryviewtypenrA   r    r    r!   insert_newaxes   s   
rE   c                 C   s8   t | j|j }| j|jk rt| ||fS | t||fS N)absndimrE   )srcdstrD   r    r    r!   broadcast_types   s   rK   c                 C   s   | j r	| jjr	dS | tju rdS | jr)| jdkr)| jjD ]
}t	|j
s& dS qdS | jpK| jo:|dk o:t	| j|d pK| jpK| jpK| jpK| joKt	| jS )z
    Return whether type dtype can be used as the base type of a
    memoryview slice.

    We support structs, numeric types and objects
    FstructT   r   )Z
is_complexZ	real_typeZis_intr   Zc_bint_typeZ	is_structkindscopeZvar_entriesvalid_memslice_dtyper'   Zis_errorZis_arrayZ	base_typeZ
is_numericis_pyobjectZis_fusedZ
is_typedefZtypedef_base_type)rC   imemberr    r    r!   rP      s,   

rP   c                   @   sJ   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdddZ	dd Z
dS )MemoryViewSliceBufferEntryz
    May be used during code generation time to be queried for
    shape/strides/suboffsets attributes, or to perform indexing or slicing.
    c                 C   sD   || _ |j| _|j| _d| j | _| j jj}t|| _|   d S )Nz%s.data)	entryr'   cnamebuf_ptrrC   r   ZCPtrTypeZbuf_ptr_typeZinit_attributes)selfrU   rC   r    r    r!   __init__   s   
z#MemoryViewSliceBufferEntry.__init__c                 C   
   |  dS )N%s.suboffsets[%d]Z_for_all_ndimrX   r    r    r!   get_buf_suboffsetvars      
z0MemoryViewSliceBufferEntry.get_buf_suboffsetvarsc                 C   rZ   )N%s.strides[%d]r\   r]   r    r    r!   get_buf_stridevars   r_   z-MemoryViewSliceBufferEntry.get_buf_stridevarsc                 C   rZ   )N%s.shape[%d]r\   r]   r    r    r!   get_buf_shapevars   r_   z,MemoryViewSliceBufferEntry.get_buf_shapevarsc                    s&    fddt | jjD }| ||S )Nc                    s$   g | ]\}\}}| | ||fqS r    r    ).0dimr<   r=   index_cnamesr    r!   
<listcomp>   s    
zJMemoryViewSliceBufferEntry.generate_buffer_lookup_code.<locals>.<listcomp>)	enumerater'   rA   _generate_buffer_lookup_code)rX   r   rg   rA   r    rf   r!   generate_buffer_lookup_code   s   

z6MemoryViewSliceBufferEntry.generate_buffer_lookup_codeTc                 C   s  | j }| jj }|D ]r\}}}}	d| j|f }
d| j|f }d| j|f }t||	}|dv r>|jt d||||f }n9|dkrPd|||f }d||f }n'|d	kr\d
|||f }n|dkrhd|||f }n|dkspJ |d|||f }d||f }q|rd||f S |S )zl
        Generate a single expression that indexes the memory view slice
        in each dimension.
        rb   r`   r[   )genericgeneric_contiguousz-__pyx_memviewslice_index_full(%s, %s, %s, %s)indirectz(%s + %s * %s)z(*((char **) %s) + %s)indirect_contiguousz(*((char **) %s + %s) + %s)r   
contiguousz((char *) (((%s *) %s) + %s))z( /* dim=%d */ %s )z((%s *) %s))	rW   r'   rC   empty_declaration_coderV   get_memoryview_flagZglobalstateZuse_utility_codememviewslice_index_helpers)rX   r   rA   Zcast_resultZbufp	type_declre   indexr<   r=   shapeZstrideZ	suboffsetflagr    r    r!   rj      s2   

z7MemoryViewSliceBufferEntry._generate_buffer_lookup_codec              	      s  | j } dt    dt    j|||d tdd | jjD }	g  fdd}
d}d	}|D ]}|jrQd
D ]\}} d||||f  q<|d7 }q5|d7 }| jj| \}}|jrt	t }d
 D ]}t||}|j  }|d| < |r| nd||< qi|d s|d s|d s||d< d}n
d} |j|d< |d7 }n8| }|dk}|r|dk}|d	krt|jd  S t	t t|d t|d d}|d r݈ |j|d< d}tj|d|d\}} | q5r jd	  d S d S )!a  
        Slice a memoryviewslice.

        indices     - list of index nodes. If not a SliceNode, or NoneNode,
                      then it must be coercible to Py_ssize_t

        Simply call __pyx_memoryview_slice_memviewslice with the right
        arguments, unless the dimension is omitted or a bare ':', in which
        case we copy over the shape/strides/suboffsets attributes directly
        for that dimension.
        z%(dst)s.data = %(src)s.data;z"%(dst)s.memview = %(src)s.memview;r1   c                 s   s    | ]	\}}|d kV  qdS )r   Nr    )rd   r<   r=   r    r    r!   	<genexpr>  s    zHMemoryViewSliceBufferEntry.generate_buffer_slice_code.<locals>.<genexpr>c                     s6   s j jtjdd}  d|   |  d S )NFr#   z%s = -1;r   )r*   r+   r   Z
c_int_typer   append)Zsuboffset_dimr   Zsuboffset_dim_tempr    r!   get_suboffset_dim  s
   
zPMemoryViewSliceBufferEntry.generate_buffer_slice_code.<locals>.get_suboffset_dimr   ))rv   r   )stridesr   )
suboffsetsr|   z%s.%s[%d] = %d;r   zstart stop stepZhave_0Z
have_startZ	have_stopZ	have_stepr<   ZSimpleSliceZ
ToughSlice
error_gotor   r   z7All preceding dimensions must be indexed and not sliced
wraparoundboundscheck)r   r   Z
SliceIndexMemoryView_C.c)contextN)rV   r   localsZput_incref_memoryviewsliceallr'   rA   is_noneis_slicedictsplitgetattrr)   r   posr   intr   Zload_as_stringputr*   r-   )rX   r   indicesrJ   Zdst_typer%   have_slicesZ
directivesrI   Zall_dimensions_directr{   re   Znew_ndimru   Zattribvaluer<   r=   r   r   idxZhave_idxZ	util_namern   rl   r   implr    rz   r!   generate_buffer_slice_code   sd   




z5MemoryViewSliceBufferEntry.generate_buffer_slice_codeN)T)__name__
__module____qualname____doc__rY   r^   ra   rc   rk   rj   r   r    r    r    r!   rT      s    
.rT   c                 C   s   t | }t j| |||dS )N)startstopstep)r   ZNoneNodeZ	SliceNode)r   noner    r    r!   empty_sliceX  s   
r   c                 C   s   g }d}d}dd | D }t | t | }| D ]5}t|tjr?d}t|j}|r.|| q|| d }	||g|	  d}q|pF|jpF|j	}|| qt |t | }
|
|k rld}||
 }	|t| d jg|	  |||fS )NFc                 S   s   g | ]}|j r|qS r    )r   )rd   Znewaxisr    r    r!   rh   c  s    zunellipsify.<locals>.<listcomp>Tr   r|   )
len
isinstancer   ZEllipsisNoder   r   ry   r@   r   r   )r   rH   r)   Zseen_ellipsisr   ZnewaxesZ	n_indicesru   Z
full_sliceZnslicesZresult_lengthr    r    r!   unellipsify^  s,   

r   c                 C   s   | dkr
|dv r
dS | dkr|dkrdS | dkr|dv rdS | dkr(|dkr(dS | d	kr2|dv r2d
S | |fdks>J | |fdS )Nr   )r   r   rl   r   rm   r   rn   ro   r   r   r   r   rp   r    )r<   r=   r    r    r!   rr   ~  s   rr   c                 C   s   | dv sJ d| |f S )NCFz!__pyx_memviewslice_is_contig_%s%dr    )contig_typerH   r    r    r!   get_is_contig_func_name  s   r   c                 C   s.   | dv sJ t t|| d}td|tgd}|S )Nr   )rH   r   ZMemviewSliceCheckContigrequires)r   r   load_memview_c_utilityis_contig_utility)r   rH   r   Zutilityr    r    r!   get_is_contig_utility  s   r   c                 C   s,   | j s| jr|st| |||S t| |||S rF   )r:   r;   ContigSliceIterStridedSliceIter)
slice_typeslice_resultrH   r   Zforce_stridedr    r    r!   
slice_iter  s   r   c                   @   s   e Zd Zdd ZdS )	SliceIterc                 C   s   || _ || _|| _|| _d S rF   )r   r   r   rH   )rX   r   r   rH   r   r    r    r!   rY     s   
zSliceIter.__init__N)r   r   r   rY   r    r    r    r!   r     s    r   c                   @      e Zd Zdd Zdd ZdS )r   c                    st    j }|   jj }d fddt jD }|d|  |d |d|| j	f  |d dS )	Nz * c                 3   s    | ]
}d  j |f V  qdS )rb   N)r   )rd   rR   r]   r    r!   rx     s    z.ContigSliceIter.start_loops.<locals>.<genexpr>z"Py_ssize_t __pyx_temp_extent = %s;zPy_ssize_t __pyx_temp_idx;z(%s *__pyx_temp_pointer = (%s *) %s.data;zPfor (__pyx_temp_idx = 0; __pyx_temp_idx < __pyx_temp_extent; __pyx_temp_idx++) {Z__pyx_temp_pointer)
r   begin_blockr   rC   rq   joinrangerH   r   r   )rX   r   rt   
total_sizer    r]   r!   start_loops  s   

zContigSliceIter.start_loopsc                 C   s&   | j d | j d | j   d S )Nz__pyx_temp_pointer += 1;})r   r   	end_blockr]   r    r    r!   	end_loops  s   zContigSliceIter.end_loopsNr   r   r   r   r   r    r    r    r!   r     s    r   c                   @   r   )r   c                 C   s   | j }|  t| jD ]$}|| j|f}|d|  |d|  |d|  |d|  q|d| j  t| jD ]}|dkrO|d||d f  |d	||||f  q>d
| jd  S )Nz/Py_ssize_t __pyx_temp_extent_%d = %s.shape[%d];z1Py_ssize_t __pyx_temp_stride_%d = %s.strides[%d];zchar *__pyx_temp_pointer_%d;zPy_ssize_t __pyx_temp_idx_%d;z__pyx_temp_pointer_0 = %s.data;r   z.__pyx_temp_pointer_%d = __pyx_temp_pointer_%d;r   z\for (__pyx_temp_idx_%d = 0; __pyx_temp_idx_%d < __pyx_temp_extent_%d; __pyx_temp_idx_%d++) {z__pyx_temp_pointer_%d)r   r   r   rH   r   r   )rX   r   rR   tr    r    r!   r     s    
zStridedSliceIter.start_loopsc                 C   sF   | j }t| jd ddD ]}|d||f  |d q|  d S )Nr   r|   z.__pyx_temp_pointer_%d += __pyx_temp_stride_%d;r   )r   r   rH   r   r   )rX   r   rR   r    r    r!   r     s
   zStridedSliceIter.end_loopsNr   r    r    r    r!   r     s    r   c                 C   s    | j rd}nd}d|  |f S )Nr   r   z!__pyx_memoryview_copy_slice_%s_%s)r:   Zspecialization_suffix)ZmemviewZc_or_fr    r    r!   copy_c_or_fortran_cname  s   r   c                 C   s   |j |j kr|j jr|j j|j kst| d d S t|jt|jkr)t| d d S |js6|js6t| d d S |jD ]\}}|dkrIt| d  d S q9|jrRd}t}n	|jsWJ d}t	}t
dtt||j  ||jt|t|j jd	tgd
S )Nzdtypes must be the same!z!number of dimensions must be samez%to_memview must be c or f contiguous.r   z2cannot handle 'full' or 'ptr' access at this time.r   fortranZCopyContentsUtility)modeZ
dtype_declcontig_flagrH   Z
func_cnameZdtype_is_objectr   r   )rC   Zis_cv_qualifiedZcv_base_typer   r   rA   r:   r;   r3   r4   r   r   r   rq   rH   r   r   rQ   copy_contents_new_utility)r   Zfrom_memviewZ
to_memviewr<   r=   r   r   r    r    r!   get_copy_new_utility  sH   





r   c                    s  |   jj}|  |j t fdddD }t fdddD }d\}}d\}}|d}	}
g }t|D ]l\}}|jjsEt	|jj
t|jjsPt	|jj
t|jjr\|||f q6t|jtry|j| d	krqt	|jj
t||	d
f q6t|jttfrt| |j}|jtv r|t|j  q6t	|jj
tt	|jj
td}d}t|D ]\}\}}|d
kr|rt	|jj
t|}|df||< d}q|r[|t|d	 krd}nd}|r||d	  d dvrt	|| j
d|rd}tt|D ]\}\}}|dv rt|| d	 }q|d	 }t|| }t||| D ]-\}\}}|d	 | }|dkr7t	|| j
d|dkrDt	|| j
d||
f||< q|r[|d \}}|df|d< tdd |D ||| |S )z
    get_axes_specs(env, axes) -> list of (access, packing) specs for each axis.
    access is one of 'full', 'ptr' or 'direct'
    packing is one of 'contig', 'strided' or 'follow'
    c                       g | ]}  |qS r    lookuprd   name	viewscoper    r!   rh         z"get_axes_specs.<locals>.<listcomp>)r   r   r   c                    r   r    r   r   r   r    r!   rh      r   r   r   r   FFr?   r   r   Zcfcontigr   Fr   T)r   r   z>Fortran contiguous specifier must follow an indirect dimensionr|   r   r   r   z>Indirect dimension may not follow Fortran contiguous dimensionzDimension may not be contiguousc                 S   s   g | ]}|j jqS r    )r   r   rd   axisr    r    r!   rh   }  s    )global_scoper   cython_scopeload_cythonscoper   tupleri   r   r   r   r   	START_ERRr   STOP_ERRr   ry   r   r   Zcompile_time_valueSTEP_ERRr   r	   _get_resolved_specr   view_constant_to_access_packingINVALID_ERRBOTH_CF_ERRr   reversedvalidate_axes_specs)envrA   Zcythonscopeaccess_specspacking_specsr;   r:   Zdefault_accessZdefault_packingZ	cf_accessZ
cf_packingZ
axes_specsr   r   rU   Z
contig_dimZ	is_contigr<   r=   r   r   ar   r    r   r!   get_axes_specs  s   



	



r   c                 C   s    t |tjkrt| d dS dS )NzGMore dimensions than the maximum number of buffer dimensions were used.FT)r   r
   buffer_max_dimsr   )r   rA   r    r    r!   validate_axes  s   
r   c                 C   s   d }}t | dkr| dgkrd}||fS | d dkr.tdd | d d D r.d}||fS t | dkrI| d dkrItd	d | dd  D rId}||fS )
NFr   r   Tr|   c                 s       | ]}|d kV  qdS )r   r   Nr    r   r    r    r!   rx         zis_cf_contig.<locals>.<genexpr>r   c                 s   r   r   r    r   r    r    r!   rx     r   )r   r   )r9   r:   r;   r    r    r!   r2     s   r2   c                 C   s<   t | \}}|r
dS |rdS | D ]\}}|dv r dS qdS )Nr   r   r   r   r   )r2   r8   r    r    r!   get_mode  s   r   )r   r   r?   )r   r   )r   r   r   )r   r   )rl   r   rn   rm   rp   ro   c                 C   s:  d}d}d } } }}	d}
t |D ]\}\}}|dkr|}
qt t| |D ]t\}\}\}}||v r6||v s;t|d|dkrBd}nR|d	kr|rMt|d
|
d t|d f}||vr{|dkr{|
d t|d krnd| }nd|d  }t|d| |dk}n|dkr|rt|d|s|st|d|dv rd}q&d S )Nr   )r   r   r   Fr|   r   zInvalid axes specification.r   Tr   z1Only one direct contiguous axis may be specified.r   zdimensions %d and %dzdimension %dr   z$Only %s may be contiguous and directr   zAA memoryview cannot have both follow and strided axis specifiers.z$Invalid use of the follow specifier.r   )ri   r5   r   r   )Z	positionsr9   r:   r;   r   r   Z
has_contigZ
has_followZhas_stridedZhas_generic_contigZlast_indirect_dimensionr   r<   r=   r   Zvalid_contig_dimsdimsr    r    r!   r     sB   





r   c                 C   s4   t |tr
t| |S t |trt| |S t|jtrF   )r   r   _resolve_NameNoder	   _resolve_AttributeNoder   r   r   )r   specr    r    r!   r     s
   



r   c                 C   s^   z	|  |jj}W n ty   t|jtw |  jjj	}| |}|d u r-t|jt
|S rF   )r   r   AttributeErrorr   r   r   r   r   r   r   NOT_CIMPORTED_ERR)r   nodeZresolved_namer   rU   r    r    r!   r     s   
r   c                 C   s   g }t |tr|d|j |j}t |tst |tr#|d|j nt|jt	|d d }|s3J | }|D ]}|
|}|rC|jsKt|jd| |j}q7|
|d }|sbt|jd|d  |S )Nr   r|   zundeclared name not builtin: %szNo such attribute '%s')r   r	   insert	attributeobjr   r   r   r   EXPR_ERRr   Z	as_module)r   r   pathmodnamesrO   modnamemodrU   r    r    r!   r     s,   





r   Nc                 K   s   t j| dfd|i|S )NzMemoryView.pyxr   )r   loadZutil_code_namer   kwargsr    r    r!   load_memview_cy_utility  s
   r   c                 K   s4   |d u rt j| dfi |S tj| dfd|i|S )Nr   r   )r   r   r   r   r    r    r!   r      s   r   c                 C   s&   |   jj}|  d|jd_d S )NTarray_cwrapper)r   r   r   r   r   r   used)r   r   r    r    r!   use_cython_array_utility_code'  s   r   rM   )Zmemview_struct_nameZmax_dimsZmemviewslice_nameZmemslice_initZTHREAD_LOCKS_PREALLOCATEDZMemviewSliceStructr   ZAtomicsZMemviewSliceInit)ZBUF_MAX_NDIMSZMemviewSliceIndexZBufferFormatFromTypeInfor   ZMemviewSliceIsContigZOverlappingSlicesZMemviewSliceCopyTemplatezView.MemoryView)arrayr   r   rl   r   rn   rp   ro   )FTr   )r   )FrF   )d
__future__r   ZErrorsr   r    r   r   r   r	   r
   ZCoder   r   r   r   r   r   r   r   r   r   r   r   r   ZCF_ERRZERR_UNINITIALIZEDZformat_flagr3   r4   Zmemview_any_contiguousr6   r7   ZMEMVIEW_DIRECTZMEMVIEW_PTRZMEMVIEW_FULLZMEMVIEW_CONTIGZMEMVIEW_STRIDEDZMEMVIEW_FOLLOWZ_spec_to_constZ_spec_to_abbrevZmemslice_entry_initZmemview_nameZmemview_typeptr_cnameZmemview_objstruct_cnameZmemviewslice_cnamer"   r0   r,   r>   rE   rK   rP   ZBufferEntryrT   r   r   rr   r   r   r   objectr   r   r   r   r   r   r   r2   r   r   r   r   r   r   r   r   r   r   rB   default_valuer   Zmemviewslice_declare_codeZatomic_utilityr   Zmemviewslice_init_coders   Z_typeinfo_to_format_codeZtypeinfo_to_format_coder   Zoverlapping_utilityr   ZGetAndReleaseBufferUtilityCodeZbuffer_struct_declare_codeZbuffer_formats_declare_codeZview_utility_codeZview_utility_allowlistr   ry   r    r    r    r!   <module>   s   
	



! ' 
!
&r		.	




