U
    “Ç-e?  ã                   @   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   ÚcdefZnumbar   ZdlopenÚ__file__)r   ÚdefsÚffir   © r   úZ/var/www/html/Darija-Ai-Train/env/lib/python3.8/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 |¡ z4t
dƒ}t |¡ t |j d¡t¡ |j|fW ¢S tj 	|¡ X dS )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;
    }
    Zcffi_usecases_oolT)ÚoverrideZ	test_cffi)Útmpdirzstruct _numba_complexN)r   r   Z
set_sourcer	   r   ÚcompileÚsysÚpathÚappendÚremover   Úcffi_supportZregister_moduleZregister_typer   Ztypeofr   )r   Znumba_complexZbool_definer   Úsourcer   r   Úmodr   r   r   Úload_ool_module!   s&    
$
ÿr   c                  C   s*   t dkr&tƒ \a } | ja| ja| ja~ dS )zƒ
    Initialize module globals.  This can invoke external utilities, hence not
    being executed implicitly at module import.
    N)r   r   Z_numba_test_sinÚcffi_sinZ_numba_test_cosÚcffi_cosZ_numba_test_booleanZ	cffi_bool)Zdllr   r   r   Úinitx   s    
r   c                  C   sX   t dkrTtƒ \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 )z&
    Same as init() for OOL mode.
    N)Úffi_oolr   ÚlibÚsinÚcffi_sin_oolÚcosÚcffi_cos_oolZfooÚcffi_fooÚbooleanÚcffi_bool_oolÚvsSinÚvdSinÚvector_realÚvector_imag)r   r   r   r   Úinit_ool†   s    
r+   c                 C   s   t | ƒd S ©Né   )r   ©Úxr   r   r   Úuse_cffi_sinœ   s    r0   c                 C   s   t | ƒt| ƒ S ©N)r   r   r.   r   r   r   Úuse_two_funcsŸ   s    r2   c                 C   s   t | ƒd S r,   )r!   r.   r   r   r   Úuse_cffi_sin_ool¢   s    r3   c                   C   s   t ƒ S r1   )r&   r   r   r   r   Úuse_cffi_boolean_true¥   s    r4   c                 C   s   t | ƒt| ƒ S r1   )r!   r#   r.   r   r   r   Úuse_two_funcs_ool¨   s    r5   c                 C   s   |dkr| |ƒS ||ƒS d S )Nr   r   )ÚfaZfbr/   r   r   r   Úuse_func_pointer«   s    r7   c                   C   s   t dddƒS )Né   r-   é   )r$   r   r   r   r   Úuse_user_defined_symbols±   s    r:   c                 C   s    t t| ƒt | ¡t |¡ƒ d S r1   )r'   Úlenr   Úfrom_bufferr   ©r/   Úyr   r   r   Úvector_sin_float32¸   s    r?   c                 C   s    t t| ƒt | ¡t |¡ƒ d S r1   )r(   r;   r   r<   r   r=   r   r   r   Úvector_sin_float64»   s    r@   c                 C   s    t t | ¡t |¡t| ƒƒ d S r1   )r)   r   r<   r;   r=   r   r   r   Úvector_extract_realÁ   s    rA   c                 C   s    t t | ¡t |¡t| ƒƒ d S r1   )r*   r   r<   r;   r=   r   r   r   Úvector_extract_imagÄ   s    rB   )r   ÚnumpyÚnpZnumba.core.typing.cffi_utilsÚcoreÚtypingZ
cffi_utilsr   Znumba.tests.supportr   r   Znumba.core.typesr   r   r   r   r+   r   r   r0   r2   r3   r4   r5   r7   r:   r?   r@   rA   rB   r   r   r   r   Ú<module>   s(   W