
    Ǆgѭ              !          d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ  G d de      Z ee	j                         G d	 d
e             Z ee	j"                         ee	j$                         G d de                    Z G d de      Z G d de      Z ee	j,                         ee	j.                         G d de                    Z ee	j2                         ee	j4                         ee	j6                         ee	j8                         ee	j:                         ee	j<                         ee	j>                         ee	j@                         ee	jB                         ee	jD                         ee	jF                         ee	jH                         ee	jJ                         ee	jL                         ee	jN                         ee	jP                         ee	jR                         ee	jT                         ee	jV                         ee	jX                         ee	jZ                         ee	j\                         ee	j^                         ee	j`                         ee	jb                         ee	jd                         ee	jf                         ee	jh                         G d de                                                                                                                                                                                                          Z5 ee	jl                         G d de5             Z7 ee	jp                         ee	jr                         G d de                    Z: ee	jv                         G d de             Z< ee	jz                         G d de             Z> ee	j~                         G d de>             Z@ ee	j                         G d d e>             ZB ee	j                         G d! d"e             ZD ee	j                         ee	j                         ee	j                         G d# d$e                           ZH G d% d&e      ZI G d' d(eI      ZJ ee	j                         G d) d*eJ             ZL ee	j                         ee	j                         ee	j                         ee	j                         ee	j                         G d+ d,eJ                                         ZR ee	j                         G d- d.eJ             ZT ee	j                         G d/ d0eJ             ZV ee	j                         G d1 d2eJ             ZX ee	j                         G d3 d4eJ             ZZ ee	j                         G d5 d6eJ             Z\ ee	j                         G d7 d8eJ             Z^ ee	j                         G d9 d:eJ             Z` ee	j                         G d; d<eJ             Zb ee	j                         G d= d>eJ             Zd ee	j                         ee	j                         ee	j                         ee	j                         ee	j                         ee	j                         G d? d@eJ                                                Zk ee	j                         G dA dBeJ             Zm ee	j                         G dC dDek             Zo ee	j                         G dE dFeJ             Zq ee	j                         G dG dHeI             Zs ee	j                         G dI dJe             Zt ee	j                         G dK dLe             Zu G dM dNeJ      Zv G dO dPeJ      Zw ee	j                         G dQ dReJ             Zx ee	j                  j                         ee	j                         G dS dTeJ                    Z| ee	j                         ee	j                         G dU dVe                    Z ee	j                          G dW dXeJ             Z ee	j                         G dY dZeJ             Z ee	j                         G d[ d\eJ             Z ee	j                         G d] d^eJ             Z ee	j                         G d_ d`eI             Z ee	j                         G da dbeJ             Z ee	j                         G dc ddeJ             Z ee	j                         G de dfeJ             Z ee	j                        dg        Z ee	j                        dh        Z ee	j                         di        Z ee	j$                         G dj dkeJ             Z ee	j(                         G dl dmeI             Z ee	j,                         G dn doeJ             Z G dp dqeJ      Zyr)s    )partial)deque)ir)register_default)typescgutils)numpy_supportc                       e Zd ZdZd Zed        Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)	DataModela  
    DataModel describe how a FE type is represented in the LLVM IR at
    different contexts.

    Contexts are:

    - value: representation inside function body.  Maybe stored in stack.
    The representation here are flexible.

    - data: representation used when storing into containers (e.g. arrays).

    - argument: representation used for function argument.  All composite
    types are unflattened into multiple primitive types.

    - return: representation used for return argument.

    Throughput the compiler pipeline, a LLVM value is usually passed around
    in the "value" representation.  All "as_" prefix function converts from
    "value" representation.  All "from_" prefix function converts to the
    "value"  representation.

    c                      || _         || _        y N)_dmm_fe_type)selfdmmfe_types      c/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/numba/core/datamodel/models.py__init__zDataModel.__init__"   s    	    c                     | j                   S r   )r   r   s    r   r   zDataModel.fe_type&   s    }}r   c                     t        |       r   NotImplementedErrorr   s    r   get_value_typezDataModel.get_value_type*       !$''r   c                 "    | j                         S r   r   r   s    r   get_data_typezDataModel.get_data_type-       ""$$r   c                 "    | j                         S )z8Return a LLVM type or nested tuple of LLVM type
        r   r   s    r   get_argument_typezDataModel.get_argument_type0   s     ""$$r   c                 "    | j                         S r   r   r   s    r   get_return_typezDataModel.get_return_type5   r    r   c                     t        |       r   r   r   buildervalues      r   as_datazDataModel.as_data8   r   r   c                     t        |       )z`
        Takes one LLVM value
        Return a LLVM value or nested tuple of LLVM value
        r   r&   s      r   as_argumentzDataModel.as_argument;       
 "$''r   c                     t        |       r   r   r&   s      r   	as_returnzDataModel.as_returnB   r   r   c                     t        |       r   r   r&   s      r   	from_datazDataModel.from_dataE   r   r   c                     t        |       )za
        Takes a LLVM value or nested tuple of LLVM value
        Returns one LLVM value
        r   r&   s      r   from_argumentzDataModel.from_argumentH   r,   r   c                     t        |       r   r   r&   s      r   from_returnzDataModel.from_returnO   r   r   Nc                 H    | j                  ||j                  ||            S )z~
        Load value from a pointer to data.
        This is the default implementation, sufficient for most purposes.
        )align)r0   loadr   r'   ptrr6   s       r   load_from_data_pointerz DataModel.load_from_data_pointerR   s"    
 ~~gw||Cu|'EFFr   c                     g S )z
        Traverse contained members.
        Returns a iterable of contained (types, getters).
        Each getter is a one-argument function accepting a LLVM value.
         r   r'   s     r   traversezDataModel.traverseY   s	     	r   c                 b    | j                         D cg c]  }| j                  |    c}S c c}w )zE
        Recursively list all models involved in this model.
        )traverse_typesr   r   ts     r   traverse_modelszDataModel.traverse_modelsa   s)     '+&9&9&;<		!<<<s   ,c                 4   | j                   g}t        | g      }t        |      dkD  rp|j                         }|j	                         D ]>  }|j                   |vs|j                  |        |j
                  |j                          @ t        |      dkD  rp|S )zM
        Recursively list all frontend types involved in this model.
        r   )r   r   lenpopleftinner_modelsappend)r   r   queuedmi_dms        r   r@   zDataModel.traverse_typesg   s     tf%j1nB) 0==-LL& ELL/0 %j1n r   c                     g S )z*
        List all *inner* models.
        r<   r   s    r   rG   zDataModel.inner_modelsw   s	     	r   c                      y)z
        Returns the MemInfo object or None if it is not tracked.
        It is only defined for types.meminfo_pointer
        Nr<   r&   s      r   get_nrt_meminfozDataModel.get_nrt_meminfo}   s    
 r   c                      yNFr<   r   s    r   has_nrt_meminfozDataModel.has_nrt_meminfo   s    r   c                 B    t        d | j                         D              S )zQ
        Recursively check all contained types for need for NRT meminfo.
        c              3   <   K   | ]  }|j                           y wr   )rQ   ).0models     r   	<genexpr>z1DataModel.contains_nrt_meminfo.<locals>.<genexpr>   s     Ou5((*Os   )anyrC   r   s    r   contains_nrt_meminfozDataModel.contains_nrt_meminfo   s     O8L8L8NOOOr   c                 0    t        |       | j                  fS r   )typer   r   s    r   _compared_fieldszDataModel._compared_fields   s    T
DMM**r   c                 F    t        t        | j                                     S r   )hashtupler[   r   s    r   __hash__zDataModel.__hash__   s    E$//1233r   c                 r    t        |       t        |      u r!| j                         |j                         k(  S yrP   )rZ   r[   r   others     r   __eq__zDataModel.__eq__   s2    :e$((*e.D.D.FFFr   c                 &    | j                  |       S r   )rc   ra   s     r   __ne__zDataModel.__ne__   s    ;;u%%%r   r   )__name__
__module____qualname____doc__r   propertyr   r   r   r"   r$   r)   r+   r.   r0   r2   r4   r:   r>   rC   r@   rG   rN   rQ   rX   r[   r_   rc   re   r<   r   r   r   r      s    ,   (%%
%((((((G= P+4&r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)OmittedArgDataModelz
    A data model for omitted arguments.  Only the "argument" representation
    is defined, other representations raise a NotImplementedError.
    c                 ,    t        j                  g       S r   )r   LiteralStructTyper   s    r   r   z"OmittedArgDataModel.get_value_type   s    ##B''r   c                      yNr<   r<   r   s    r   r"   z%OmittedArgDataModel.get_argument_type       r   c                      yrp   r<   r   r'   vals      r   r+   zOmittedArgDataModel.as_argument   rq   r   c                     |dk(  sJ |       y rp   r<   rs   s      r   r2   z!OmittedArgDataModel.from_argument   s    by#yr   N)rf   rg   rh   ri   r   r"   r+   r2   r<   r   r   rl   rl      s    
(r   rl   c                       e Zd Z ej                  d      Z ej                  d      Zd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zy)BooleanModel      c                     | j                   S r   )	_bit_typer   s    r   r   zBooleanModel.get_value_type   s    ~~r   c                     | j                   S r   )
_byte_typer   s    r   r   zBooleanModel.get_data_type       r   c                 "    | j                         S r   r   r   s    r   r$   zBooleanModel.get_return_type       !!##r   c                 "    | j                         S r   r   r   s    r   r"   zBooleanModel.get_argument_type   r   r   c                 B    |j                  || j                               S r   )zextr   r&   s      r   r)   zBooleanModel.as_data   s    ||E4#5#5#788r   c                 &    | j                  ||      S r   r)   r&   s      r   r+   zBooleanModel.as_argument       ||GU++r   c                 &    | j                  ||      S r   r   r&   s      r   r.   zBooleanModel.as_return   r   r   c                    | j                         }t        j                  ||      }|j                  d||j	                  d            }|j                  |      5 \  }}|5  |j                   |d      |       d d d        |5  |j                   |d      |       d d d        d d d        |j                  |      S # 1 sw Y   ExY w# 1 sw Y   .xY w# 1 sw Y   2xY w)Nz==r   rx   )r   r   alloca_onceicmp_unsignedrZ   if_elsestorer7   )r   r'   r(   ty	resallocacondthen	otherwises           r   r0   zBooleanModel.from_data   s      "''4	$$T5%**Q-@__T" 	0&7tY 0beY/0 0beY/0	0
 ||I&&	0 00 0	0 	0s<   C B=9
CC	C=C	C	C	CCc                 &    | j                  ||      S r   r0   r&   s      r   r2   zBooleanModel.from_argument       ~~gu--r   c                 &    | j                  ||      S r   r   r&   s      r   r4   zBooleanModel.from_return   r   r   N)rf   rg   rh   r   IntTyper{   r}   r   r   r$   r"   r)   r+   r.   r0   r2   r4   r<   r   r   rw   rw      sT     

1IAJ$$9,,	'..r   rw   c                   L     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Z xZS )
PrimitiveModelzZA primitive type can be represented natively in the target in all
    usage contexts.
    c                 <    t         t        |   ||       || _        y r   )superr   r   be_typer   r   r   r   	__class__s       r   r   zPrimitiveModel.__init__   s    nd,S':r   c                     | j                   S r   )r   r   s    r   r   zPrimitiveModel.get_value_type       ||r   c                     |S r   r<   r&   s      r   r)   zPrimitiveModel.as_data       r   c                     |S r   r<   r&   s      r   r+   zPrimitiveModel.as_argument   r   r   c                     |S r   r<   r&   s      r   r.   zPrimitiveModel.as_return   r   r   c                     |S r   r<   r&   s      r   r0   zPrimitiveModel.from_data   r   r   c                     |S r   r<   r&   s      r   r2   zPrimitiveModel.from_argument   r   r   c                     |S r   r<   r&   s      r   r4   zPrimitiveModel.from_return   r   r   )rf   rg   rh   ri   r   r   r)   r+   r.   r0   r2   r4   __classcell__r   s   @r   r   r      s0    r   r   c                   L    e 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y)
ProxyModelzB
    Helper class for models which delegate to another model.
    c                 6    | j                   j                         S r   )_proxied_modelr   r   s    r   r   zProxyModel.get_value_type  s    ""1133r   c                 6    | j                   j                         S r   )r   r   r   s    r   r   zProxyModel.get_data_type  s    ""0022r   c                 6    | j                   j                         S r   )r   r$   r   s    r   r$   zProxyModel.get_return_type
  s    ""2244r   c                 6    | j                   j                         S r   )r   r"   r   s    r   r"   zProxyModel.get_argument_type  s    ""4466r   c                 :    | j                   j                  ||      S r   )r   r)   r&   s      r   r)   zProxyModel.as_data  s    ""**7E::r   c                 :    | j                   j                  ||      S r   )r   r+   r&   s      r   r+   zProxyModel.as_argument      ""..w>>r   c                 :    | j                   j                  ||      S r   )r   r.   r&   s      r   r.   zProxyModel.as_return      "",,We<<r   c                 :    | j                   j                  ||      S r   )r   r0   r&   s      r   r0   zProxyModel.from_data  r   r   c                 :    | j                   j                  ||      S r   )r   r2   r&   s      r   r2   zProxyModel.from_argument  s    ""00%@@r   c                 :    | j                   j                  ||      S r   )r   r4   r&   s      r   r4   zProxyModel.from_return  r   r   N)rf   rg   rh   ri   r   r   r$   r"   r)   r+   r.   r0   r2   r4   r<   r   r   r   r      s:    4357;?==A?r   r   c                   "     e Zd ZdZ fdZ xZS )	EnumModelzA
    Enum members are represented exactly like their values.
    c                 n    t         t        |   ||       |j                  |j                        | _        y r   )r   r   r   lookupdtyper   r   r   r   r   s      r   r   zEnumModel.__init__)  s)    i'W5!jj7r   rf   rg   rh   ri   r   r   r   s   @r   r   r   #  s    8 8r   r   c                   b     e Zd ZdZ ej
                  d      j                         Z fdZ xZ	S )OpaqueModelz#
    Passed as opaque pointers
    ry   c                 H    | j                   }t        t        |   |||       y r   )	_ptr_typer   r   r   r   s       r   r   zOpaqueModel.__init__P  s    ..k4)#w@r   )
rf   rg   rh   ri   r   r   
as_pointerr   r   r   r   s   @r   r   r   .  s.    : 

1((*IA Ar   r   c                       e Zd Zd Zd Zd Zy)MemInfoModelc                 b    | j                   j                  | j                  j                        gS r   )r   r   r   r   r   s    r   rG   zMemInfoModel.inner_modelsX  s$    		  !4!4566r   c                      y)NTr<   r   s    r   rQ   zMemInfoModel.has_nrt_meminfo[  s    r   c                     |S r   r<   r&   s      r   rN   zMemInfoModel.get_nrt_meminfo^  r   r   N)rf   rg   rh   rG   rQ   rN   r<   r   r   r   r   U  s    7r   r   c                        e Zd Z fdZ xZS )IntegerModelc                 n    t        j                  |j                        }t        t        |   |||       y r   )r   r   bitwidthr   r   r   r   s       r   r   zIntegerModel.__init__e  s*    **W--.lD*3Ar   rf   rg   rh   r   r   r   s   @r   r   r   b  s    B Br   r   c                        e Zd Z fdZ xZS )
FloatModelc                     |t         j                  k(  rt        j                         }n3|t         j                  k(  rt        j
                         }nt        |      t        t        | '  |||       y r   )
r   float32r   	FloatTypefloat64
DoubleTyper   r   r   r   r   s       r   r   zFloatModel.__init__l  sO    emm#llnG%mmoG%g..j$(gw?r   r   r   s   @r   r   r   j  s    @ @r   r   c                        e Zd Z fdZ xZS )PointerModelc                     |j                  |j                        | _        | j                  j                         | _        | j                  j                         }t        t        | #  |||       y r   )	r   r   _pointee_modelr   _pointee_be_typer   r   r   r   r   s       r   r   zPointerModel.__init__x  sV    !jj7 $ 3 3 A A C''224lD*3Ar   r   r   s   @r   r   r   v  s    B Br   r   c                   &    e Zd Zd Zd Zd ZddZy)EphemeralPointerModelc                     | j                   S r   )r   r   s    r   r   z#EphemeralPointerModel.get_data_type  s    $$$r   c                 \    |j                  |      }| j                  j                  ||      S r   )r7   r   r)   r&   s      r   r)   zEphemeralPointerModel.as_data  s)    U#""**7E::r   c                     t        d      Nz$use load_from_data_pointer() insteadr   r&   s      r   r0   zEphemeralPointerModel.from_data      !"HIIr   Nc                 B    |j                  || j                               S r   bitcastr   r8   s       r   r:   z,EphemeralPointerModel.load_from_data_pointer      sD$7$7$9::r   r   )rf   rg   rh   r   r)   r0   r:   r<   r   r   r   r     s    %;J;r   r   c                   8     e Zd Z fdZd Zd Zd ZddZ xZS )EphemeralArrayModelc                     t         t        |   ||       t        j                  | j
                  | j                  j                        | _        y r   )	r   r   r   r   	ArrayTyper   r   count
_data_typer   s      r   r   zEphemeralArrayModel.__init__  s:    !41#w?,,t'<'<'+}}':':<r   c                     | j                   S r   r   r   s    r   r   z!EphemeralArrayModel.get_data_type  r~   r   c           
          t        | j                  j                        D cg c](  }|j                  t	        j
                  |||            * }}t	        j                  ||      S c c}w r   )ranger   r   r7   r   gep_inbounds
pack_array)r   r'   r(   ivaluess        r   r)   zEphemeralArrayModel.as_data  s^     !4!457 ,,w33GUAFG 7 7!!'6227s   -A'c                     t        d      r   r   r&   s      r   r0   zEphemeralArrayModel.from_data  r   r   c                 B    |j                  || j                               S r   r   r8   s       r   r:   z*EphemeralArrayModel.load_from_data_pointer  r   r   r   )	rf   rg   rh   r   r   r)   r0   r:   r   r   s   @r   r   r     s    <
3
J;r   r   c                        e Zd Z fdZ xZS )ExternalFuncPointerModelc                 b   |j                   }|j                  |j                        j                         }|j                  D cg c]!  }|j                  |      j                         # }}t        j                  t        j                  ||            }t        t        | +  |||       y c c}w r   )sigr   return_typer   argsr   PointerTypeFunctionTyper   r   r   )	r   r   r   r   rettyrB   r   r   r   s	           r   r   z!ExternalFuncPointerModel.__init__  s    kk 

3??+::<8;A1

1,,.AA..!=>&6sGWM Bs   &B,r   r   s   @r   r   r     s    N Nr   r   c                   f     e Zd Z f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 xZS )UniTupleModelc                    t         t        |   ||       |j                  |j                        | _        t        |      | _        t        j                  | j
                  j                         | j                        | _        t        j                  | j
                  j                         | j                        | _        y r   )r   r   r   r   r   _elem_modelrE   _countr   r   r   _value_typer   r   r   s      r   r   zUniTupleModel.__init__  s    mT+C9::gmm4'l<<(8(8(G(G(I(,5,,t'7'7'E'E'G'+{{4r   c                     | j                   S r   )r  r   s    r   r   zUniTupleModel.get_value_type  s    r   c                     | j                   S r   r   r   s    r   r   zUniTupleModel.get_data_type  r~   r   c                 "    | j                         S r   r   r   s    r   r$   zUniTupleModel.get_return_type  r    r   c                 R    | j                   j                         f| j                  z  S r   )r  r"   r  r   s    r   r"   zUniTupleModel.get_argument_type  s#      2246DDr   c                     g }t        | j                        D ]B  }|j                  ||g      }| j                  j	                  ||      }|j                  |       D |S r   )r   r  extract_valuer  r+   rH   r   r'   r(   outr   vs         r   r+   zUniTupleModel.as_argument  s]    t{{# 	A%%eaS1A  ,,Wa8AJJqM	 
r   c                     t        j                  | j                         t         j                        }t	        |      D ]5  \  }}| j
                  j                  ||      }|j                  |||g      }7 |S r   )r   Constantr   	Undefined	enumerater  r2   insert_valuer  s         r   r2   zUniTupleModel.from_argument  sl    kk$--/>e$ 	4DAq  ..w:A&&sAs3C	4 
r   c                 $   t        j                  | j                         t         j                        }t	        | j
                        D ]E  }|j                  ||g      }| j                  j                  ||      }|j                  |||g      }G |S r   )
r   r  r   r  r   r  r
  r  r)   r  r   r'   r(   r  r   rt   dvals          r   r)   zUniTupleModel.as_data  s    kk$,,.=t{{# 	7A''s3C##++GS9D&&sD1#6C	7 
r   c                 $   t        j                  | j                         t         j                        }t	        | j
                        D ]E  }|j                  ||g      }| j                  j                  ||      }|j                  |||g      }G |S r   )
r   r  r   r  r   r  r
  r  r0   r  r  s          r   r0   zUniTupleModel.from_data  s    kk$--/>t{{# 	7A''s3C##--gs;D&&sD1#6C	7 
r   c                     |S r   r<   r&   s      r   r.   zUniTupleModel.as_return  r   r   c                     |S r   r<   r&   s      r   r4   zUniTupleModel.from_return  r   r   c                     fd}t        | j                        D cg c]$  }| j                  j                  t	        ||      f& c}S c c}w )Nc                 (    j                  ||       S r   r
  )r   r(   r'   s     r   getterz&UniTupleModel.traverse.<locals>.getter  s    ((22r   )r   r  r   r   r   )r   r'   r  r   s    `  r   r>   zUniTupleModel.traverse  sI    	3 t{{+- $$gfa&89 - 	- -s   )A
c                     | j                   gS r   )r  r   s    r   rG   zUniTupleModel.inner_models  s      !!r   )rf   rg   rh   r   r   r   r$   r"   r+   r2   r)   r0   r.   r4   r>   rG   r   r   s   @r   r   r     sE    4 %E-"r   r   c                       e Zd ZdZy)CompositeModelzWAny model that is composed of multiple other models should subclass from
    this.
    N)rf   rg   rh   ri   r<   r   r   r  r    s     	r   r  c                        e Zd ZdZdZ fdZd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd ZddZd Zd Zd Zd Zd Zd Zd Zed        Zd Zd Zd Zd Z xZS )StructModelNc                    t         t        |   ||       |rt        | \  | _        | _        ndx| _        | _        t        | j
                  D cg c]  }| j                  j                  |       c}      | _	        y c c}w rp   )
r   r!  r   zip_fields_membersr^   r   r   _models)r   r   r   membersrB   r   s        r   r   zStructModel.__init__  sd    k4)#w7*-w-'DL$-+--DL4=4==Iadii..q1IJIs   "A>c                 B    | j                  |      }| j                  |   S )zU
        StructModel-specific: get the Numba type of the field named *name*.
        )get_field_positionr%  )r   nameposs      r   get_member_fe_typezStructModel.get_member_fe_type  s#     %%d+}}S!!r   c                     | j                   @t        j                  | j                  D cg c]  }|j	                          c}      | _         | j                   S c c}w r   )r  r   rn   r&  r   rA   s     r   r   zStructModel.get_value_type  sY    #!33=A\\5K89 675E5E5G 5K  LD5K   Ac                     | j                   @t        j                  | j                  D cg c]  }|j	                          c}      | _         | j                   S c c}w r   )r   r   rn   r&  r   rA   s     r   r   zStructModel.get_data_type  sR    ??" 22=A\\4K89 56OO4E 4K LDO4Kr.  c                 n    t        | j                  D cg c]  }|j                          c}      S c c}w r   )r^   r&  r"   rA   s     r   r"   zStructModel.get_argument_type!  s(    T\\Ba))+BCCBs   2c                 "    | j                         S r   r   r   s    r   r$   zStructModel.get_return_type$  r   r   c                     g }t        | j                        D ]8  \  }}|j                   t        ||      || j	                  |||                   : t        |      S r   )r  r&  rH   getattrgetr^   )r   methnamer'   r(   	extractedr   rJ   s          r   _aszStructModel._as'  se    	t||, 	QEAr2WR273788GUA3NP Q	Q Yr   c                    t        j                  | j                         t         j                        }t	        t        | j                  |            D ]/  \  }\  }} t        ||      ||      }| j                  ||||      }1 |S r   )	r   r  r   r  r  r#  r&  r3  set)	r   r5  r'   r(   structr   rJ   rt   r  s	            r   _fromzStructModel._from.  sv    T002BLLA%c$,,&>? 	5LAyC%H%gs3AXXgvq!4F	5 r   c                     | j                  d||      }t        j                  | j                         t        j                        }t        |      D ]  \  }}|j                  |||g      } |S )a,  
        Converts the LLVM struct in `value` into a representation suited for
        storing into arrays.

        Note
        ----
        Current implementation rarely changes how types are represented for
        "value" and "data".  This is usually a pointless rebuild of the
        immutable LLVM struct value.  Luckily, LLVM optimization removes all
        redundancy.

        Sample usecase: Structures nested with pointers to other structures
        that can be serialized into  a flat representation when storing into
        array.
        r)   r7  r   r  r   r  r  r  r   r'   r(   elemsr:  r   els          r   r)   zStructModel.as_data7  sf      GU3T//12<<@u% 	;EAr))&"qc:F	;r   c                     t        t        | j                              D cg c]  }|j                  ||g       }}| j	                  d||      S c c}w )z
        Convert from "data" representation back into "value" representation.
        Usually invoked when loading from array.

        See notes in `as_data()`
        r0   r   rE   r%  r
  r;  r   r'   r(   r   valss        r   r0   zStructModel.from_dataM  sV     s4==124 %%eaS1 4 4zz+w554   Ac                 n   g }t        | j                        D ]A  \  }}t        j                  ||d|      }|j	                  |||      }|j                  |       C t        j                  | j                         t        j                        }	t        |      D ]  \  }}| j                  ||	||      }	 |	S Nr   )r  r&  r   r   r:   rH   r   r  r   r  r9  )
r   r'   r9   r6   r   r   rU   elem_ptrrt   r:  s
             r   r:   z"StructModel.load_from_data_pointerX  s    !$,,/ 	HAu++GS!Q?H..w%HCMM#	
 T002BLLA' 	7FAsXXgvsA6F	7r   c                 (    | j                  d||      S )Nr+   )r7  r&   s      r   r+   zStructModel.as_argumentd  s    xxw66r   c                 (    | j                  d||      S )Nr2   )r;  r&   s      r   r2   zStructModel.from_argumentg  s    zz/7E::r   c                     | j                  d||      }t        j                  | j                         t        j                        }t        |      D ]  \  }}|j                  |||g      } |S )Nr)   r=  r>  s          r   r.   zStructModel.as_returnj  sd    GU3T//12<<@u% 	;EAr))&"qc:F	;r   c                     t        t        | j                              D cg c]  }|j                  ||g       }}| j	                  d||      S c c}w )Nr0   rB  rC  s        r   r4   zStructModel.from_returnq  sT    s4==124 %%eaS1 4 4zz+w554rE  c                     t        |t              r| j                  |      }|j                  ||gd| j                  |   z         S )a'  Get a field at the given position or the fieldname

        Args
        ----
        builder:
            LLVM IRBuilder
        val:
            value to be inserted
        pos: int or str
            field index or field name

        Returns
        -------
        Extracted value
        z
extracted.r*  )
isinstancestrr)  r
  r$  )r   r'   rt   r+  s       r   r4  zStructModel.getv  sO      c3))#.C$$S3%*6c9J*J % L 	Lr   c                     t        |t              r| j                  |      }|j                  |||gd| j                  |   z         S )an  Set a field at the given position or the fieldname

        Args
        ----
        builder:
            LLVM IRBuilder
        stval:
            LLVM struct value
        val:
            value to be inserted
        pos: int or str
            field index or field name

        Returns
        -------
        A new LLVM struct with the value inserted
        z	inserted.rN  )rO  rP  r)  r  r$  )r   r'   stvalrt   r+  s        r   r9  zStructModel.set  sQ    $ c3))#.C##E3)4t||C7H)H $ J 	Jr   c                     	 | j                   j                  |      S # t        $ r% t        | j                  j
                  d|      w xY w)Nz does not have a field named )r$  index
ValueErrorKeyErrorr   rf   )r   fields     r   r)  zStructModel.get_field_position  sL    	?<<%%e,, 	?"nn55u> ? ?	?s	    .Ac                 ,    t        | j                        S r   )rE   r$  r   s    r   field_countzStructModel.field_count  s    4<<  r   c                 b    t        |t              r| j                  |      }| j                  |   S )zGet the frontend type (numba type) of a field given the position
         or the fieldname

        Args
        ----
        pos: int or str
            field index or field name
        )rO  rP  r)  r%  r   r+  s     r   get_typezStructModel.get_type  s-     c3))#.C}}S!!r   c                      | j                   |   S )z
        Get the datamodel of a field given the position or the fieldname.

        Args
        ----
        pos: int or str
            field index or field name
        r&  r[  s     r   	get_modelzStructModel.get_model  s     ||C  r   c                       fd} j                   D cg c]  } j                  |      t        ||      f! c}S c c}w )Nc                     |j                   j                         k7  r4j                         |j                   f}t         dj                  |       j	                  ||       S )Nzexpecting {0} but got {1})rZ   r   	TypeErrorformatr4  )kr(   r   r'   r   s      r   r  z$StructModel.traverse.<locals>.getter  s\    zzT0022**,ejj8 B ; B BD IJJ88GUA..r   )r$  r\  r   )r   r'   r  rd  s   ``  r   r>   zStructModel.traverse  s9    	/ AEM1q!761#56MMMs   $>c                     | j                   S r   r^  r   s    r   rG   zStructModel.inner_models  r   r   r   )rf   rg   rh   r  r   r   r,  r   r   r"   r$   r7  r;  r)   r0   r:   r+   r2   r.   r4   r4  r9  r)  rj   rY  r\  r_  r>   rG   r   r   s   @r   r!  r!    s    KJK" D$ ,	6
7;6
L*J.? ! !"	!Nr   r!  c                   "     e Zd ZeZ fdZ xZS )ComplexModelc                 h    d|j                   fd|j                   fg}t        t        |   |||       y )Nrealimag)underlying_floatr   rg  r   r   r   r   r'  r   s       r   r   zComplexModel.__init__  s;    W--.W--.
 	lD*3Ar   )rf   rg   rh   NotImplemented_element_typer   r   r   s   @r   rg  rg    s    "MB Br   rg  c                        e Zd Z fdZ xZS )
TupleModelc                     t        |      D cg c]  \  }}dt        |      z   |f }}}t        t        |   |||       y c c}}w )Nf)r  rP  r   rp  r   )r   r   r   r   rB   r'  r   s         r   r   zTupleModel.__init__  sE    1:71CDAC#a&L!$DDj$(gw? Es   Ar   r   s   @r   rp  rp    s    @ @r   rp  c                        e Zd Z fdZ xZS )
UnionModelc                     dt         j                  fdt         j                  j                  |j                         fg}t        t
        |   |||       y )Ntagpayload)r   uintpTuple
from_typesr   rt  r   rl  s       r   r   zUnionModel.__init__  sF    EKK ..w}}=>

 	j$(gw?r   r   r   s   @r   rt  rt    s    @ @r   rt  c                        e Zd Z fdZ xZS )	PairModelc                 h    d|j                   fd|j                  fg}t        t        |   |||       y )Nfirstsecond)
first_typesecond_typer   r|  r   rl  s       r   r   zPairModel.__init__  s9    W//0g1124i'Wg>r   r   r   s   @r   r|  r|    s    ? ?r   r|  c                        e Zd Z fdZ xZS )ListPayloadModelc                     dt         j                  fdt         j                  fdt         j                  fd|j                  j                  fg}t
        t        |   |||       y )Nsize	allocateddirtydata)r   intpboolean	containerr   r   r  r   rl  s       r   r   zListPayloadModel.__init__  sZ    
 UZZ %**%emm$W&&,,-
 	.sGWEr   r   r   s   @r   r  r    s    F Fr   r  c                        e Zd Z fdZ xZS )	ListModelc                     t        j                  |      }dt        j                  |      fdt         j                  fg}t        t
        |   |||       y Nmeminfoparent)r   ListPayloadMemInfoPointerpyobjectr   r  r   r   r   r   payload_typer'  r   s        r   r   zListModel.__init__  sP    ((1 ,,\:;u~~&	
 	i'Wg>r   r   r   s   @r   r  r    s    ? ?r   r  c                        e Zd Z fdZ xZS )ListIterModelc                     t        j                  |j                        }dt        j                  |      fdt        j                  t         j
                        fg}t        t        | #  |||       y Nr  rT  )	r   r  r  r  EphemeralPointerr  r   r  r   r  s        r   r   zListIterModel.__init__  sa    (():):; ,,\:;e,,UZZ89	 	mT+C'Br   r   r   s   @r   r  r    s    C Cr   r  c                        e Zd Z fdZ xZS )SetEntryModelc                     |j                   j                  }dt        j                  fd|fg}t        t
        |   |||       y )Nr]   key)set_typer   r   r  r   r  r   )r   r   r   r   r'  r   s        r   r   zSetEntryModel.__init__*  sE      && UZZ EN

 	mT+C'Br   r   r   s   @r   r  r  (  s    C Cr   r  c                        e Zd Z fdZ xZS )SetPayloadModelc                 "   t        j                  |j                        }dt         j                  fdt         j                  fdt         j                  fdt         j                  fdt         j                  fd|fg}t
        t        |   |||       y )Nfillusedmaskfingerr  entries)r   SetEntryr  r  r  r   r  r   )r   r   r   
entry_typer'  r   s        r   r   zSetPayloadModel.__init__6  sy    ^^G$5$56
 UZZ UZZ UZZ uzz"emm$
#
 	ot-c7GDr   r   r   s   @r   r  r  4  s    E Er   r  c                        e Zd Z fdZ xZS )SetModelc                     t        j                  |      }dt        j                  |      fdt         j                  fg}t        t
        |   |||       y r  )r   
SetPayloadr  r  r   r  r   r  s        r   r   zSetModel.__init__J  sP    ''0 ,,\:;u~~&	
 	h&sGW=r   r   r   s   @r   r  r  H  s    > >r   r  c                        e Zd Z fdZ xZS )SetIterModelc                     t        j                  |j                        }dt        j                  |      fdt        j                  t         j
                        fg}t        t        | #  |||       y r  )	r   r  r  r  r  r  r   r  r   r  s        r   r   zSetIterModel.__init__V  sa    ''(9(9: ,,\:;e,,UZZ89 	lD*3Ar   r   r   s   @r   r  r  T  s    	B 	Br   r  c                        e Zd Z fdZ xZS )
ArrayModelc                    |j                   }dt        j                  |j                        fdt        j                  fdt        j
                  fdt        j
                  fdt        j                  |j                        fdt        j                  t        j
                  |      fdt        j                  t        j
                  |      fg}t        t        | +  |||       y )Nr  r  nitemsitemsizer  shapestrides)ndimr   r  r   r  r  CPointerUniTupler   r  r   r   r   r   r  r'  r   s        r   r   zArrayModel.__init__i  s    ||,,W]];<u~~&uzz"$U^^GMM23ennUZZ67uzz489	
 	j$(gw?r   r   r   s   @r   r  r  b  s    @ @r   r  c                        e Zd Z fdZ xZS )ArrayFlagsModelc                 N    d|j                   fg}t        t        |   |||       y )Nr  )
array_typer   r  r   rl  s       r   r   zArrayFlagsModel.__init__z  s-    w))*
 	ot-c7GDr   r   r   s   @r   r  r  x  s    E Er   r  c                   $     e Zd Z fdZd Z xZS )NestedArrayModelc                     |j                  |j                        j                         | _        t        t
        |   ||       y r   )r   r   r   _be_typer   r  r   r   s      r   r   zNestedArrayModel.__init__  s2    

7==1??A.sG<r   c                 n    t        j                  | j                  | j                  j                        }|S )zXReturn the LLVM type representation for the storage of
        the nestedarray.
        )r   r   r  r   r  )r   rets     r   as_storage_typez NestedArrayModel.as_storage_type  s'     ll4==$--*>*>?
r   )rf   rg   rh   r   r  r   r   s   @r   r  r    s    =r   r  c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )OptionalModelc                     d|j                   fdt        j                  fg}|j                  |j                         | _        t
        t        |   |||       y )Nr  valid)rZ   r   r  r   _value_modelr   r  r   rl  s       r   r   zOptionalModel.__init__  sL    W\\"emm$
  JJw||4mT+C'Br   c                 6    | j                   j                         S r   )r  r$   r   s    r   r$   zOptionalModel.get_return_type  s      0022r   c                     t         r   r   r&   s      r   r.   zOptionalModel.as_return  s    !!r   c                 :    | j                   j                  ||      S r   )r  r4   r&   s      r   r4   zOptionalModel.from_return  s      ,,We<<r   c                 n      fd} fd j                  d      |f j                  d      fgS )Nc                      |       }j                  | d      }j                  ||t        j                  |j                  d             S )Nr  )r4  selectr   r  rZ   )r(   r  r  r'   	get_validr   s      r   get_dataz(OptionalModel.traverse.<locals>.get_data  sA    e$E88GUF3D>>%r{{499d/KLLr   c                 *    j                  | d      S )Nr  )r4  )r(   r'   r   s    r   r  z)OptionalModel.traverse.<locals>.get_valid  s    88GUG44r   r  r  )r\  )r   r'   r  r  s   `` @r   r>   zOptionalModel.traverse  s<    	M	5 v&1w'35 	5r   )	rf   rg   rh   r   r$   r.   r4   r>   r   r   s   @r   r  r    s    C3"=	5r   r  c                   b     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZddZ xZS )RecordModelc                 b   t         t        |   ||       |j                  D cg c]   \  }}| j                  j                  |      " c}}| _        t        j                  t        j                  d      |j                        | _        | j                  j                         | _        y c c}}w Nry   )r   r  r   r'  r   r   r&  r   r   r   r  r  r   _be_ptr_type)r   r   r   _rB   r   s        r   r   zRecordModel.__init__  sv    k4)#w78?H1		((+HRZZ]GLLA MM446 Is   %B+c                     | j                   S )z6Passed around as reference to underlying data
        r  r   s    r   r   zRecordModel.get_value_type  s        r   c                     | j                   S r   r  r   s    r   r"   zRecordModel.get_argument_type         r   c                     | j                   S r   r  r   s    r   r$   zRecordModel.get_return_type  r  r   c                     | j                   S r   r  r   s    r   r   zRecordModel.get_data_type      }}r   c                 $    |j                  |      S r   r7   r&   s      r   r)   zRecordModel.as_data      ||E""r   c                     t        d      r   r   r&   s      r   r0   zRecordModel.from_data  r   r   c                     |S r   r<   r&   s      r   r+   zRecordModel.as_argument  r   r   c                     |S r   r<   r&   s      r   r2   zRecordModel.from_argument  r   r   c                     |S r   r<   r&   s      r   r.   zRecordModel.as_return  r   r   c                     |S r   r<   r&   s      r   r4   zRecordModel.from_return  r   r   c                 B    |j                  || j                               S r   r   r8   s       r   r:   z"RecordModel.load_from_data_pointer  r   r   r   )rf   rg   rh   r   r   r"   r$   r   r)   r0   r+   r2   r.   r4   r:   r   r   s   @r   r  r    s@    7!
!!#J;r   r  c                   N     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Z xZS )
UnicodeCharSeqc                     t         t        |   ||       t        j                  t
        j                  dz        }t        j                  ||j                        | _	        y r  )
r   r  r   r   r   r	   sizeof_unicode_charr   r   r  r   r   r   chartyr   s       r   r   zUnicodeCharSeq.__init__  sC    nd,S':M==ABVW]];r   c                     | j                   S r   r  r   s    r   r   zUnicodeCharSeq.get_value_type  r  r   c                     | j                   S r   r  r   s    r   r   zUnicodeCharSeq.get_data_type  r  r   c                     |S r   r<   r&   s      r   r)   zUnicodeCharSeq.as_data  r   r   c                     |S r   r<   r&   s      r   r0   zUnicodeCharSeq.from_data  r   r   c                     |S r   r<   r&   s      r   r.   zUnicodeCharSeq.as_return  r   r   c                     |S r   r<   r&   s      r   r4   zUnicodeCharSeq.from_return  r   r   c                     |S r   r<   r&   s      r   r+   zUnicodeCharSeq.as_argument  r   r   c                     |S r   r<   r&   s      r   r2   zUnicodeCharSeq.from_argument  r   r   rf   rg   rh   r   r   r   r)   r0   r.   r4   r+   r2   r   r   s   @r   r  r    0    <
r   r  c                   N     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Z xZS )
CharSeqc                     t         t        |   ||       t        j                  d      }t        j
                  ||j                        | _        y r  )r   r  r   r   r   r   r   r  r  s       r   r   zCharSeq.__init__  s7    gt%c73AVW]];r   c                     | j                   S r   r  r   s    r   r   zCharSeq.get_value_type  r  r   c                     | j                   S r   r  r   s    r   r   zCharSeq.get_data_type  r  r   c                     |S r   r<   r&   s      r   r)   zCharSeq.as_data  r   r   c                     |S r   r<   r&   s      r   r0   zCharSeq.from_data
  r   r   c                     |S r   r<   r&   s      r   r.   zCharSeq.as_return  r   r   c                     |S r   r<   r&   s      r   r4   zCharSeq.from_return  r   r   c                     |S r   r<   r&   s      r   r+   zCharSeq.as_argument  r   r   c                     |S r   r<   r&   s      r   r2   zCharSeq.from_argument  r   r   r  r   s   @r   r  r    r  r   r  c                        e Zd Z fdZ xZS )CContiguousFlatIterc                    |j                   j                  dk(  sJ |j                   }|j                  }|j                  }d|fdt        j
                  fdt	        j                  t        j
                        fg}|r5|j                  dt	        j                  t        j
                  |      f       t        t        | /  |||       y )NCarraystriderT  indices)r  layoutr   r  r   r  r  rH   EphemeralArrayr   r	  r   )	r   r   r   need_indicesr  r   r  r'  r   s	           r   r   zCContiguousFlatIter.__init__  s    !!((C///''
  Z(ejj)U33EJJ?@ NNIu';';EJJ'MNO!41#wHr   r   r   s   @r   r	  r	    s    I Ir   r	  c                        e Zd Z fdZ xZS )FlatIterc                 h   |j                   }|j                  }|j                  }d|fdt        j                  t        j
                  |      |      fdt        j                  t        j                  |      fdt        j                  t        j                        fg}t        t        | /  |||       y )Nr  pointersr  	exhausted)r  r   r  r   r  r  r  r  r  r   r  r   )r   r   r   r  r   r  r'  r   s          r   r   zFlatIter.__init__+  s    ''
  Z( 4 4U^^E5JD QRu33EJJEF!7!7!FG

 	h&sGW=r   r   r   s   @r   r  r  *  s    	> 	>r   r  c                        e Zd Z fdZ xZS )UniTupleIterc                     dt        j                  t         j                        fd|j                  fg}t        t
        |   |||       y )NrT  r^   )r   r  r  r  r   r  r   rl  s       r   r   zUniTupleIter.__init__9  sB    U33EJJ?@W..02lD*3Ar   r   r   s   @r   r  r  7  s    B Br   r  c                        e Zd Z fdZ xZS )
SliceModelc                     dt         j                  fdt         j                  fdt         j                  fg}t        t        |   |||       y Nstartstopstep)r   r  r   r  r   rl  s       r   r   zSliceModel.__init__B  sC    UZZ(EJJ'EJJ' 	j$(gw?r   r   r   s   @r   r  r  ?  s    @ @r   r  c                        e Zd Z fdZ xZS )NPDatetimeModelc                 Z    t        j                  d      }t        t        |   |||       y )N@   )r   r   r   r"  r   r   s       r   r   zNPDatetimeModel.__init__M  s#    **R.ot-c7GDr   r   r   s   @r   r"  r"  J  s    E Er   r"  c                        e Zd Z fdZ xZS )ArrayIteratorc                     dt        j                  t         j                        fd|j                  fg}t        t
        |   |||       y )NrT  r  )r   r  rx  r  r   r&  r   rl  s       r   r   zArrayIterator.__init__T  sB    U33EKK@AW//02mT+C'Br   r   r   s   @r   r&  r&  R      C Cr   r&  c                        e Zd Z fdZ xZS )EnumerateTypec                     dt        j                  t         j                        fd|j                  fg}t        t
        |   |||       y )Nr   iter)r   r  r  source_typer   r*  r   rl  s       r   r   zEnumerateType.__init__]  sD    U33EJJ?@G//02 	mT+C'Br   r   r   s   @r   r*  r*  [  r(  r   r*  c                        e Zd Z fdZ xZS )ZipTypec                     t        |j                        D cg c]  \  }}d|z  |j                  f }}}t        t        |   |||       y c c}}w )Nziter%d)r  source_typesiterator_typer   r/  r   )r   r   r   r   r-  r'  r   s         r   r   zZipType.__init__f  sZ    )273G3G)HJ%q+ qL+";";< J Jgt%c7G<Js   Ar   r   s   @r   r/  r/  d  s    = =r   r/  c                        e Zd Z fdZ xZS )RangeIteratorTypec                     |j                   }dt        j                  |      fd|fd|fdt        j                  |      fg}t        t        |   |||       y )Nr,  r  r   r   )
yield_typer   r  r   r4  r   r   r   r   int_typer'  r   s        r   r   zRangeIteratorType.__init__n  sb    %%E228<=H%H%U33H=>@ 	/WgFr   r   r   s   @r   r4  r4  l  s    G Gr   r4  c                   Z     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Z xZS )GeneratorModelc                 t   t         t        |   ||       |j                  D cg c]7  }t	        |t
        j                        s| j                  j                  |      9 c}| _	        |j                  D cg c]  }| j                  j                  |       c}| _        t        j                  | j                  D cg c]  }|j                          c}      | _        t        j                  | j                  D cg c]  }|j                          c}      | _        t        j                  | j                  j                  t
        j"                        j%                         | j                  | j                   g      | _        | j&                  j)                         | _        y c c}w c c}w c c}w c c}w r   )r   r:  r   	arg_typesrO  r   Omittedr   r   _arg_modelsstate_types_state_modelsr   rn   r   _args_be_type_state_be_typeint32r   r  r   r  )r   r   r   rB   r   s       r   r   zGeneratorModel.__init__y  sH   nd,S':9@9J9J AA#-a#? !II,,Q/ A;B;N;NOadii..q1O11(,(8(891Q__9; 22(,(:(:;1Q__;= ,,YYekk*99;!4!467 !MM446AO :;s   <F&6"F+=F0=F5c                     | j                   S )zH
        The generator closure is passed around as a reference.
        r  r   s    r   r   zGeneratorModel.get_value_type  s        r   c                     | j                   S r   r  r   s    r   r"   z GeneratorModel.get_argument_type  r  r   c                     | j                   S r   r  r   s    r   r$   zGeneratorModel.get_return_type  r  r   c                     | j                   S r   r  r   s    r   r   zGeneratorModel.get_data_type  r  r   c                     |S r   r<   r&   s      r   r+   zGeneratorModel.as_argument  r   r   c                     |S r   r<   r&   s      r   r2   zGeneratorModel.from_argument  r   r   c                 &    | j                  ||      S r   r   r&   s      r   r.   zGeneratorModel.as_return  r   r   c                 &    | j                  ||      S r   r   r&   s      r   r4   zGeneratorModel.from_return  r   r   c                 $    |j                  |      S r   r  r&   s      r   r)   zGeneratorModel.as_data  r  r   c                 j    t        j                  ||j                        }|j                  ||       |S r   )r   r   rZ   r   )r   r'   r(   stacks       r   r0   zGeneratorModel.from_data  s+    ##GUZZ8eU#r   )rf   rg   rh   r   r   r"   r$   r   r+   r2   r.   r4   r)   r0   r   r   s   @r   r:  r:  w  s:    7"!!,.#r   r:  c                        e Zd Z fdZ xZS )ArrayCTypesModelc                     dt        j                  |j                        fdt        j                  |j                        fg}t        t
        |   |||       y )Nr  r  )r   r  r   r  r   rP  r   rl  s       r   r   zArrayCTypesModel.__init__  sK    ENN7==9:u33GMMBCE.sGWEr   r   r   s   @r   rP  rP    s    F Fr   rP  c                        e Zd Z fdZ xZS )
RangeModelc                 r    |j                   j                  }d|fd|fd|fg}t        t        |   |||       y r  )r2  r6  r   rS  r   r7  s        r   r   zRangeModel.__init__  sH    ((33X&H%H%' 	j$(gw?r   r   r   s   @r   rS  rS    s    @ @r   rS  c                        e Zd Z fdZ xZS )NdIndexModelc                 (   |j                   }dt        j                  t        j                  |      fdt        j                  t        j                  |      fdt        j
                  t        j                        fg}t        t        | '  |||       y )Nr  r  r  )
r  r   r  r  r  r  r  r   rV  r   r  s        r   r   zNdIndexModel.__init__  so    ||U^^EJJ=>u33EJJEF!7!7!FG 	lD*3Ar   r   r   s   @r   rV  rV    s    B Br   rV  c                 h    |j                   j                  dk(  rt        | |d      S t        | |      S )Nr  Fr  r  r  r	  r  r   r   s     r   handle_numpy_flat_typer\    s0    	}}s""3??R  r   c                 h    |j                   j                  dk(  rt        | |d      S t        | |      S )Nr  TrY  rZ  r[  s     r   handle_numpy_ndenumerate_typer^    s0    	}}s""3>>R  r   c                      | |j                      S r   )thisr[  s     r   handle_bound_functionra    s     rww<r   c                        e Zd Z fdZ xZS )NdIterc                 $   |j                   }|j                  }|j                  r|nd}dt        j                  t        j
                        fdt        j                  |      fdt        j                  t        j                  |      fdt        j                  t        j                  |      fg}t        |j                        D ]Q  \  }}|\  }	}
}}d|z  }|	dk(  r5|j                  |t        j                  t        j                        f       L|	dv rQJ  t        |j                         D ]K  \  }}t        |t        j                        r!d	|z  }|j                  |t        j                  |      f       M t        t         | G  |||       y )
Nrx   r  arraysr  r  zindex%dflat)scalarindexed0dzscalar%d)re  r  need_shaped_indexingr   r  r  ry  r  r  r  r  indexersrH   rO  Arrayr   rc  r   )r   r   r   array_typesr  	shape_lenr'  r   subkind	start_dimend_dimr  member_namer   r   s                  r   r   zNdIter.__init__  sZ   nn||#88Da	!7!7!FGekk+67U^^EJJ	BCu33EJJ	JK	   0 01 
	FAs*-'D)Wa#a-Kv~U-C-CEJJ-OPQ44q
	 w~~. 	JEArb%++.(1nU-C-CB-GHI	J
 	fd$S'7;r   r   r   s   @r   rc  rc    s    < <r   rc  c                        e Zd Z f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dZd Zd Zd Zed        Zd Z xZS )DeferredStructModelc                     t         t        |   ||       dj                  t	        |            | _        |j                         | _        y )Nzdeferred.{0})r   ru  r   rc  idtypenamer4  actual_fe_typer   s      r   r   zDeferredStructModel.__init__  s9    !41#w?&--bk:%kkmr   c                 Z    t         j                  j                  | j                  dz         S )Nz.valuer   global_contextget_identified_typerx  r   s    r   r   z"DeferredStructModel.get_value_type  s"      44T]]X5MNNr   c                 Z    t         j                  j                  | j                  dz         S )Nz.datar{  r   s    r   r   z!DeferredStructModel.get_data_type  s"      44T]]W5LMMr   c                 6    | j                   j                         S r   )_actual_modelr"   r   s    r   r"   z%DeferredStructModel.get_argument_type  s    !!3355r   c                 ^    | j                  ||      }| j                  j                  ||      S r   )r4  r  r+   )r   r'   r(   inners       r   r+   zDeferredStructModel.as_argument  s+    %(!!--gu==r   c                 |    | j                   j                  ||      }| j                  || j                         |      S r   )r  r2   r9  make_uninitialized)r   r'   r(   ress       r   r2   z!DeferredStructModel.from_argument  s6      ..w>xx!8!8!:C@@r   c                     | j                          | j                  ||      }| j                  j                  ||      }| j	                         }| j                  |||      S r   )_definer4  r  r0   r  r9  r   r'   r(   elemr  s        r   r0   zDeferredStructModel.from_data  sT    xx'"",,Wd;%%'xxe,,r   c                     | j                          | j                  ||      }| j                  j                  ||      }| j	                  d      }| j                  |||      S )Nr  )rp  )r  r4  r  r)   r  r9  r  s        r   r)   zDeferredStructModel.as_data$  sY    xx'""**7D9%%6%2xxe,,r   c                     |S r   r<   r&   s      r   r4   zDeferredStructModel.from_return+  r   r   c                     |S r   r<   r&   s      r   r.   zDeferredStructModel.as_return.  r   r   c                 (    |j                  |dg      S rG  r  r&   s      r   r4  zDeferredStructModel.get1  s    $$UQC00r   c                 *    |j                  ||dg      S rG  )r  )r   r'   r(   contents       r   r9  zDeferredStructModel.set4  s    ##E7QC88r   c                     | j                          |dk(  r| j                         }n| j                         }t        j                  |t        j
                        S )Nr(   )r  r   r   r   r  r  )r   rp  r   s      r   r  z&DeferredStructModel.make_uninitialized7  sC    7?$$&B##%B{{2r||,,r   c                     | j                         }| j                  |       | j                         }| j                  |       y r   )r   _define_value_typer   _define_data_type)r   valtydattys      r   r  zDeferredStructModel._define?  s:    ##%&""$u%r   c                 p    |j                   r*|j                  | j                  j                                y y r   )	is_opaqueset_bodyr  r   )r   
value_types     r   r  z&DeferredStructModel._define_value_typeE  s-     2 2 A A CD  r   c                 p    |j                   r*|j                  | j                  j                                y y r   )r  r  r  r   )r   	data_types     r   r  z%DeferredStructModel._define_data_typeI  s-    t11??AB r   c                 L    | j                   j                  | j                        S r   )r   r   ry  r   s    r   r  z!DeferredStructModel._actual_modelM  s    yy 3 344r   c                 (    | j                   fdfgS )Nc                 *    j                  | dg      S rG  r  )r(   r'   s    r   <lambda>z.DeferredStructModel.traverse.<locals>.<lambda>S  s    w44UQC@ r   )ry  r=   s    `r   r>   zDeferredStructModel.traverseQ  s!    $$@B C 	Cr   )r(   )rf   rg   rh   r   r   r   r"   r+   r2   r0   r)   r4   r.   r4  r9  r  r  r  r  rj   r  r>   r   r   s   @r   ru  ru    sr    ,
ON6>A--19-&EC 5 5Cr   ru  c                   "     e Zd ZdZ fdZ xZS )StructPayloadModelz.Model for the payload of a mutable struct
    c                 n    t        |j                  j                               }t        |   |||       y r   )r^   
field_dictitemsr   r   )r   r   fe_typr'  r   s       r   r   zStructPayloadModel.__init__Z  s-    ))//12fg.r   r   r   s   @r   r  r  V  s    / /r   r  c                   "     e Zd ZdZ fdZ xZS )StructRefModelz?Model for a mutable struct.
    A reference to the payload
    c                 x    |j                         }dt        j                  |      fg}t        |   |||       y )Nr  )r   r   r  r   r   )r   r   r  r   r'  r   s        r   r   zStructRefModel.__init__c  s>    $$&,,U34
 	fg.r   r   r   s   @r   r  r  _  s    / /r   r  N)	functoolsr   collectionsr   llvmliter   numba.core.datamodel.registryr   
numba.corer   r   numba.npr	   objectr   r=  rl   BooleanBooleanLiteralrw   r   r   
EnumMemberIntEnumMemberr   OpaquePyObject
RawPointerNoneTypeStringLiteralEllipsisTypeFunctionTypeObjectModulePhantomUndefVarContextManager
DispatcherObjModeDispatcherExceptionClassDummyExceptionInstanceExternalFunction	EnumClassIntEnumClassNumberClassTypeRefNamedTupleClassDTypeRecursiveCallMakeFunctionLiteralPoisonr   r  r   IntegerIntegerLiteralr   Floatr   r  r   r  r   r  r   ExternalFunctionPointerr   r  NamedUniTupleStarArgUniTupler   r  r!  Complexrg  LiteralListLiteralStrKeyDictry  
NamedTupleStarArgTuplerp  	UnionTypert  Pairr|  r  r  Listr  ListIterr  r  r  r  r  Setr  SetIterr  rl  Buffer	ByteArrayBytes
MemoryViewPyArrayr  
ArrayFlagsr  NestedArrayr  Optionalr  Recordr  r  r  r	  r  r  miscSliceLiteral	SliceTyper  
NPDatetimeNPTimedeltar"  r&  r*  r/  r4  	Generatorr:  ArrayCTypesrP  	RangeTyperS  NumpyNdIndexTyperV  NumpyFlatTyper\  NumpyNdEnumerateTyper^  BoundFunctionra  NumpyNdIterTyperc  DeferredTyperu  StructRefPayloadr  r  r<   r   r   <module>r     s
      : % "O& O&d %-- )  !* %-- %&&'(.9 (. ( !(.VY >!? !?H %""#%%%&8
 8 ' $8 %,,%..!%""#%..!%%%&%$$%%..!%**%,,%,,%-- %..!%&&'%""#%))*%&&'%++%))*%(()%//"%$$%%##$%-- %''(%++%%%&%++,%,,A. A   - '  ) ! % & # * +  ( + $ ( " !      " & ' " $ "  8A %&&'	; 	 (	 %-- %&&'B> B ( !B %++@ @ @ %..!B> B "B %(();L ; *;  %&&';, ; (;, %//0N~ N 1N %..!%%%&%''(B"I B" ) ' "B"J	Y 	M. M` %-- B; B !B %##$%))*%++%""#%$$%@ @ & $  + %
@ %//"@ @ #@ %**? ? ? %##$F{ F %F  %**	? 	? 	? %..!	CK 	C "	C %..!CK C "C %""#Ek E $E& %))	>{ 	> 	> %-- 
B; 
B !
B %++%,,%//"%++%""#%-- @ @ ! $  #   @  %""#Ek E $E %##$
z 
 %
 %..!5K 5 "5< %,,(;. (;  (;V %&&'Y  (> %-- i  !>I+ I 
>{ 
> %$$%B; B &B %**))*%//"@ @ # +@ %""#%##$En E % $E %%%&CK C 'C %%%&CK C 'C %-- =k = != %))*G G +G %//"3^ 3 #3l %##$F{ F %F %//"@ @ #@ %(()B; B *B %%%&! '! %,,-! .! %%%& '
 %''(<[ < )<D %$$%MC. MC &MC` %(()/ / */	/[ 	/r   