o
    i?                     @   s   d dl Z d dlZd dlm  m  mZ d dlm	Z	m
Z
 d dlmZ dd Zdd Zdd	 Zd
d Zd aa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S )"    N)import_dynamictemp_directory)
complex128c                  C   s<   ddl m}  d}|  }|| ddlm} |||jfS )zP
    Create an inline module, return the corresponding ffi and dll objects.
    r   FFIz
    double _numba_test_sin(double x);
    double _numba_test_cos(double x);
    double _numba_test_funcptr(double (*func)(double));
    bool _numba_test_boolean(void);
    )
_helperlib)cffir   cdefnumbar   dlopen__file__)r   defsffir    r   V/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/numba/tests/cffi_usecases.pyload_inline_module
   s   
r   c               	   C   s   ddl m}  d}d}|d }|| d }|  }|d| |j|dd	 td
}|j|d tj| zt	d}t
| t
|jdt |j|fW tj| S tj| w )z]
    Compile an out-of-line module, return the corresponding ffi and
    module objects.
    r   r   zh
    typedef struct _numba_complex {
        double real;
        double imag;
    } numba_complex;
    z
    #ifdef _MSC_VER
        #define false 0
        #define true 1
        #define bool int
    #else
        #include <stdbool.h>
    #endif
    aE  
    bool boolean(void);
    double sin(double x);
    double cos(double x);
    int foo(int a, int b, int c);
    void vsSin(int n, float* x, float* y);
    void vdSin(int n, double* x, double* y);
    void vector_real(numba_complex *c, double *real, int n);
    void vector_imag(numba_complex *c, double *imag, int n);
    a  
    static bool boolean(void)
    {
        return true;
    }

    static int foo(int a, int b, int c)
    {
        return a + b * c;
    }

    void vsSin(int n, float* x, float* y) {
        int i;
        for (i=0; i<n; i++)
            y[i] = sin(x[i]);
    }

    void vdSin(int n, double* x, double* y) {
        int i;
        for (i=0; i<n; i++)
            y[i] = sin(x[i]);
    }

    static void vector_real(numba_complex *c, double *real, int n) {
        int i;
        for (i = 0; i < n; i++)
            real[i] = c[i].real;
    }

    static void vector_imag(numba_complex *c, double *imag, int n) {
        int i;
        for (i = 0; i < n; i++)
            imag[i] = c[i].imag;
    }
    cffi_usecases_oolT)override	test_cffi)tmpdirzstruct _numba_complex)r   r   
set_sourcer	   r   compilesyspathappendr   cffi_supportregister_moduleregister_typer   typeofr   remove)r   numba_complexbool_definer   sourcer   r   modr   r   r   load_ool_module!   s&   
$

r$   c                  C   s.   t du rt \a } | ja| ja| ja~ dS dS )z
    Initialize module globals.  This can invoke external utilities, hence not
    being executed implicitly at module import.
    N)r   r   _numba_test_sincffi_sin_numba_test_coscffi_cos_numba_test_boolean	cffi_bool)dllr   r   r   initx   s   
r,   c                  C   s\   t du r,t \a } | jja| jja| jja| jj	a
| jja| jja| jja| jja~ dS dS )z&
    Same as init() for OOL mode.
    N)ffi_oolr$   libsincffi_sin_oolcoscffi_cos_oolfoocffi_foobooleancffi_bool_oolvsSinvdSinvector_realvector_imag)r#   r   r   r   init_ool   s   
r;   c                 C      t | d S N   )r&   xr   r   r   use_cffi_sin      rA   c                 C      t | t|  S N)r&   r(   r?   r   r   r   use_two_funcs      rE   c                 C   r<   r=   )r0   r?   r   r   r   use_cffi_sin_ool   rB   rG   c                   C   s   t  S rD   )r6   r   r   r   r   use_cffi_boolean_true   s   rH   c                 C   rC   rD   )r0   r2   r?   r   r   r   use_two_funcs_ool   rF   rI   c                 C   s   |dkr| |S ||S )Nr   r   )fafbr@   r   r   r   use_func_pointer   s   rL   c                   C   s   t dddS )N   r>      )r4   r   r   r   r   use_user_defined_symbols   rB   rO   c                 C       t t| t| t| d S rD   )r7   lenr   from_bufferr-   r@   yr   r   r   vector_sin_float32       rU   c                 C   rP   rD   )r8   rQ   r   rR   r-   rS   r   r   r   vector_sin_float64   rV   rW   c                 C       t t| t|t|  d S rD   )r9   r   rR   rQ   rS   r   r   r   vector_extract_real   rV   rY   c                 C   rX   rD   )r:   r   rR   rQ   rS   r   r   r   vector_extract_imag   rV   rZ   )r   numpynpnumba.core.typing.cffi_utilscoretyping
cffi_utilsr   numba.tests.supportr   r   numba.core.typesr   r   r$   r,   r;   r   r-   rA   rE   rG   rH   rI   rL   rO   rU   rW   rY   rZ   r   r   r   r   <module>   s*    W