U
    ?h                     @   s$  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 deZee	jG d	d
 d
eZee	jee	jG dd deZG dd deZG dd deZee	jee	jG dd deZee	jee	jee	jee	jee	jee	jee	jee	j ee	j!ee	j"ee	j#ee	j$ee	j%ee	j&ee	j'ee	j(ee	j)ee	j*ee	j+ee	j,ee	j-ee	j.ee	j/ee	j0ee	j1ee	j2ee	j3G dd deZ4ee	j5G dd de4Z6ee	j7ee	j8G dd deZ9ee	j:G dd deZ;ee	j<G dd deZ=ee	j>G dd de=Z?ee	j@G dd  d e=ZAee	jBG d!d" d"eZCee	jDee	jEee	jFG d#d$ d$eZGG d%d& d&eZHG d'd( d(eHZIee	jJG d)d* d*eIZKee	jLee	jMee	jNee	jOee	jPG d+d, d,eIZQee	jRG d-d. d.eIZSee	jTG d/d0 d0eIZUee	jVG d1d2 d2eIZWee	jXG d3d4 d4eIZYee	jZG d5d6 d6eIZ[ee	j\G d7d8 d8eIZ]ee	j^G d9d: d:eIZ_ee	j`G d;d< d<eIZaee	jbG d=d> d>eIZcee	jdee	jeee	jfee	jgee	jhee	jiG d?d@ d@eIZjee	jkG dAdB dBeIZlee	jmG dCdD dDejZnee	joG dEdF dFeIZpee	jqG dGdH dHeHZree	jsG dIdJ dJeZsee	jtG dKdL dLeZtG dMdN dNeIZuG dOdP dPeIZvee	jwG dQdR dReIZwee	jxjyee	jzG dSdT dTeIZ{ee	j|ee	j}G dUdV dVeZ~ee	jG dWdX dXeIZee	jG dYdZ dZeIZee	jG d[d\ d\eIZee	jG d]d^ d^eIZee	jG d_d` d`eHZee	jG dadb dbeIZee	jG dcdd ddeIZee	jG dedf dfeIZee	jdgdh Zee	jdidj Zee	jdkdl Zee	jG dmdn dneIZee	jG dodp dpeHZee	jG dqdr dreIZG dsdt dteIZduS )v    )partial)deque)ir)register_default)typescgutils)numpy_supportc                   @   s   e Zd ZdZdd Ze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d3ddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 ZdS )4	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                 C   s   || _ || _d S N)_dmm_fe_typeselfdmmfe_type r   M/var/www/html/venv/lib/python3.8/site-packages/numba/core/datamodel/models.py__init__"   s    zDataModel.__init__c                 C   s   | j S r
   )r   r   r   r   r   r   &   s    zDataModel.fe_typec                 C   s   t | d S r
   NotImplementedErrorr   r   r   r   get_value_type*   s    zDataModel.get_value_typec                 C   s   |   S r
   r   r   r   r   r   get_data_type-   s    zDataModel.get_data_typec                 C   s   |   S )z8Return a LLVM type or nested tuple of LLVM type
        r   r   r   r   r   get_argument_type0   s    zDataModel.get_argument_typec                 C   s   |   S r
   r   r   r   r   r   get_return_type5   s    zDataModel.get_return_typec                 C   s   t | d S r
   r   r   buildervaluer   r   r   as_data8   s    zDataModel.as_datac                 C   s   t | dS )z`
        Takes one LLVM value
        Return a LLVM value or nested tuple of LLVM value
        Nr   r   r   r   r   as_argument;   s    zDataModel.as_argumentc                 C   s   t | d S r
   r   r   r   r   r   	as_returnB   s    zDataModel.as_returnc                 C   s   t | d S r
   r   r   r   r   r   	from_dataE   s    zDataModel.from_datac                 C   s   t | dS )za
        Takes a LLVM value or nested tuple of LLVM value
        Returns one LLVM value
        Nr   r   r   r   r   from_argumentH   s    zDataModel.from_argumentc                 C   s   t | d S r
   r   r   r   r   r   from_returnO   s    zDataModel.from_returnNc                 C   s   |  ||j||dS )z~
        Load value from a pointer to data.
        This is the default implementation, sufficient for most purposes.
        )align)r"   loadr   r   ptrr%   r   r   r   load_from_data_pointerR   s    z DataModel.load_from_data_pointerc                 C   s   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   r   r   r   r   traverseY   s    zDataModel.traversec                    s    fdd   D S )zE
        Recursively list all models involved in this model.
        c                    s   g | ]} j | qS r   )r   .0tr   r   r   
<listcomp>e   s     z-DataModel.traverse_models.<locals>.<listcomp>)traverse_typesr   r   r   r   traverse_modelsa   s    zDataModel.traverse_modelsc                 C   sZ   | j g}t| g}t|dkrV| }| D ]$}|j |kr.|| ||j  q.q|S )zM
        Recursively list all frontend types involved in this model.
        r   )r   r   lenpopleftinner_modelsappend)r   r   queuedmZi_dmr   r   r   r0   g   s    


zDataModel.traverse_typesc                 C   s   g S )z*
        List all *inner* models.
        r   r   r   r   r   r4   w   s    zDataModel.inner_modelsc                 C   s   dS )z
        Returns the MemInfo object or None if it is not tracked.
        It is only defined for types.meminfo_pointer
        Nr   r   r   r   r   get_nrt_meminfo}   s    zDataModel.get_nrt_meminfoc                 C   s   dS NFr   r   r   r   r   has_nrt_meminfo   s    zDataModel.has_nrt_meminfoc                 C   s   t dd |  D S )zQ
        Recursively check all contained types for need for NRT meminfo.
        c                 s   s   | ]}|  V  qd S r
   )r:   )r-   modelr   r   r   	<genexpr>   s     z1DataModel.contains_nrt_meminfo.<locals>.<genexpr>)anyr1   r   r   r   r   contains_nrt_meminfo   s    zDataModel.contains_nrt_meminfoc                 C   s   t | | jfS r
   )typer   r   r   r   r   _compared_fields   s    zDataModel._compared_fieldsc                 C   s   t t|  S r
   )hashtupler@   r   r   r   r   __hash__   s    zDataModel.__hash__c                 C   s(   t | t |kr |  | kS dS d S r9   )r?   r@   r   otherr   r   r   __eq__   s    zDataModel.__eq__c                 C   s   |  | S r
   )rF   rD   r   r   r   __ne__   s    zDataModel.__ne__)N)__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r   r    r!   r"   r#   r$   r)   r+   r1   r0   r4   r8   r:   r>   r@   rC   rF   rG   r   r   r   r   r	      s4   

r	   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )OmittedArgDataModelz
    A data model for omitted arguments.  Only the "argument" representation
    is defined, other representations raise a NotImplementedError.
    c                 C   s
   t g S r
   )r   LiteralStructTyper   r   r   r   r      s    z"OmittedArgDataModel.get_value_typec                 C   s   dS Nr   r   r   r   r   r   r      s    z%OmittedArgDataModel.get_argument_typec                 C   s   dS rO   r   r   r   valr   r   r   r       s    zOmittedArgDataModel.as_argumentc                 C   s   |dkst |d S rO   )AssertionErrorrP   r   r   r   r#      s    z!OmittedArgDataModel.from_argumentN)rH   rI   rJ   rK   r   r   r    r#   r   r   r   r   rM      s
   rM   c                   @   sp   e Zd ZedZe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 )BooleanModel      c                 C   s   | j S r
   )	_bit_typer   r   r   r   r      s    zBooleanModel.get_value_typec                 C   s   | j S r
   )
_byte_typer   r   r   r   r      s    zBooleanModel.get_data_typec                 C   s   |   S r
   r   r   r   r   r   r      s    zBooleanModel.get_return_typec                 C   s   |   S r
   rX   r   r   r   r   r      s    zBooleanModel.get_argument_typec                 C   s   | ||  S r
   )Zzextr   r   r   r   r   r      s    zBooleanModel.as_datac                 C   s   |  ||S r
   r   r   r   r   r   r       s    zBooleanModel.as_argumentc                 C   s   |  ||S r
   rY   r   r   r   r   r!      s    zBooleanModel.as_returnc              
   C   s   |   }t||}|d||d}||J\}}| ||d| W 5 Q R X | ||d| W 5 Q R X W 5 Q R X ||S )Nz==r   rT   )r   r   alloca_onceZicmp_unsignedr?   Zif_elsestorer&   )r   r   r   tyZ	resallocaZcondZthenZ	otherwiser   r   r   r"      s    $zBooleanModel.from_datac                 C   s   |  ||S r
   r"   r   r   r   r   r#      s    zBooleanModel.from_argumentc                 C   s   |  ||S r
   r]   r   r   r   r   r$      s    zBooleanModel.from_returnN)rH   rI   rJ   r   IntTyperV   rW   r   r   r   r   r   r    r!   r"   r#   r$   r   r   r   r   rS      s   

rS   c                       sX   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Z  ZS )PrimitiveModelzZA primitive type can be represented natively in the target in all
    usage contexts.
    c                    s   t t| || || _d S r
   )superr_   r   be_typer   r   r   ra   	__class__r   r   r      s    zPrimitiveModel.__init__c                 C   s   | j S r
   )ra   r   r   r   r   r      s    zPrimitiveModel.get_value_typec                 C   s   |S r
   r   r   r   r   r   r      s    zPrimitiveModel.as_datac                 C   s   |S r
   r   r   r   r   r   r       s    zPrimitiveModel.as_argumentc                 C   s   |S r
   r   r   r   r   r   r!      s    zPrimitiveModel.as_returnc                 C   s   |S r
   r   r   r   r   r   r"      s    zPrimitiveModel.from_datac                 C   s   |S r
   r   r   r   r   r   r#      s    zPrimitiveModel.from_argumentc                 C   s   |S r
   r   r   r   r   r   r$      s    zPrimitiveModel.from_return)rH   rI   rJ   rK   r   r   r   r    r!   r"   r#   r$   __classcell__r   r   rc   r   r_      s   r_   c                   @   s`   e Zd Z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 )
ProxyModelzB
    Helper class for models which delegate to another model.
    c                 C   s
   | j  S r
   )_proxied_modelr   r   r   r   r   r     s    zProxyModel.get_value_typec                 C   s
   | j  S r
   )rg   r   r   r   r   r   r     s    zProxyModel.get_data_typec                 C   s
   | j  S r
   )rg   r   r   r   r   r   r   
  s    zProxyModel.get_return_typec                 C   s
   | j  S r
   )rg   r   r   r   r   r   r     s    zProxyModel.get_argument_typec                 C   s   | j ||S r
   )rg   r   r   r   r   r   r     s    zProxyModel.as_datac                 C   s   | j ||S r
   )rg   r    r   r   r   r   r      s    zProxyModel.as_argumentc                 C   s   | j ||S r
   )rg   r!   r   r   r   r   r!     s    zProxyModel.as_returnc                 C   s   | j ||S r
   )rg   r"   r   r   r   r   r"     s    zProxyModel.from_datac                 C   s   | j ||S r
   )rg   r#   r   r   r   r   r#     s    zProxyModel.from_argumentc                 C   s   | j ||S r
   )rg   r$   r   r   r   r   r$     s    zProxyModel.from_returnN)rH   rI   rJ   rK   r   r   r   r   r   r    r!   r"   r#   r$   r   r   r   r   rf      s   rf   c                       s    e Zd ZdZ fddZ  ZS )	EnumModelzA
    Enum members are represented exactly like their values.
    c                    s$   t t| || ||j| _d S r
   )r`   rh   r   lookupdtyperg   r   rc   r   r   r   )  s    zEnumModel.__init__rH   rI   rJ   rK   r   re   r   r   rc   r   rh   #  s   rh   c                       s.   e Zd ZdZed Z fddZ  Z	S )OpaqueModelz#
    Passed as opaque pointers
    rU   c                    s   | j }tt| ||| d S r
   )	_ptr_typer`   rl   r   rb   rc   r   r   r   O  s    zOpaqueModel.__init__)
rH   rI   rJ   rK   r   r^   
as_pointerrm   r   re   r   r   rc   r   rl   .  s   rl   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )MemInfoModelc                 C   s   | j | jjgS r
   )r   ri   r   rj   r   r   r   r   r4   W  s    zMemInfoModel.inner_modelsc                 C   s   dS )NTr   r   r   r   r   r:   Z  s    zMemInfoModel.has_nrt_meminfoc                 C   s   |S r
   r   r   r   r   r   r8   ]  s    zMemInfoModel.get_nrt_meminfoN)rH   rI   rJ   r4   r:   r8   r   r   r   r   ro   T  s   ro   c                       s   e Zd Z fddZ  ZS )IntegerModelc                    s$   t |j}tt| ||| d S r
   )r   r^   Zbitwidthr`   rp   r   rb   rc   r   r   r   d  s    zIntegerModel.__init__rH   rI   rJ   r   re   r   r   rc   r   rp   a  s   rp   c                       s   e Zd Z fddZ  ZS )
FloatModelc                    sH   |t jkrt }n|t jkr(t }nt|tt| 	||| d S r
   )
r   Zfloat32r   Z	FloatTypeZfloat64Z
DoubleTyper   r`   rr   r   rb   rc   r   r   r   k  s    



zFloatModel.__init__rq   r   r   rc   r   rr   i  s   rr   c                       s   e Zd Z fddZ  ZS )PointerModelc                    s<   | |j| _| j | _| j }tt| ||| d S r
   )	ri   rj   _pointee_modelr   _pointee_be_typern   r`   rs   r   rb   rc   r   r   r   w  s    
zPointerModel.__init__rq   r   r   rc   r   rs   u  s   rs   c                   @   s.   e Zd Zdd Zdd Zdd Zd
dd	ZdS )EphemeralPointerModelc                 C   s   | j S r
   )ru   r   r   r   r   r     s    z#EphemeralPointerModel.get_data_typec                 C   s   | |}| j||S r
   )r&   rt   r   r   r   r   r   r     s    
zEphemeralPointerModel.as_datac                 C   s   t dd S Nz$use load_from_data_pointer() insteadr   r   r   r   r   r"     s    zEphemeralPointerModel.from_dataNc                 C   s   | ||  S r
   Zbitcastr   r'   r   r   r   r)     s    z,EphemeralPointerModel.load_from_data_pointer)N)rH   rI   rJ   r   r   r"   r)   r   r   r   r   rv   ~  s   rv   c                       s>   e Zd Z fddZdd Zdd Zdd Zdd
dZ  ZS )EphemeralArrayModelc                    s*   t t| || t| j| jj| _d S r
   )	r`   ry   r   r   	ArrayTyperu   r   count
_data_typer   rc   r   r   r     s    zEphemeralArrayModel.__init__c                 C   s   | j S r
   r|   r   r   r   r   r     s    z!EphemeralArrayModel.get_data_typec                    s(    fddt | jjD }t |S )Nc              	      s    g | ]}  t |qS r   )r&   r   gep_inboundsr-   ir   r   r   r   r/     s   z/EphemeralArrayModel.as_data.<locals>.<listcomp>)ranger   r{   r   Z
pack_array)r   r   r   valuesr   r   r   r     s    
zEphemeralArrayModel.as_datac                 C   s   t dd S rw   r   r   r   r   r   r"     s    zEphemeralArrayModel.from_dataNc                 C   s   | ||  S r
   rx   r'   r   r   r   r)     s    z*EphemeralArrayModel.load_from_data_pointer)N)	rH   rI   rJ   r   r   r   r"   r)   re   r   r   rc   r   ry     s
   ry   c                       s   e Zd Z fddZ  ZS )ExternalFuncPointerModelc                    sT   |j } |j } fdd|jD }tt||}tt	| 
 || d S )Nc                    s   g | ]}  | qS r   )ri   r   r,   r   r   r   r/     s     z5ExternalFuncPointerModel.__init__.<locals>.<listcomp>)sigri   return_typer   argsr   ZPointerTypeFunctionTyper`   r   r   )r   r   r   r   Zrettyr   ra   rc   r   r   r     s
    z!ExternalFuncPointerModel.__init__rq   r   r   rc   r   r     s   r   c                       s|   e Zd Z f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d Zdd Z  ZS )UniTupleModelc                    sZ   t t| || ||j| _t|| _t	| j
 | j| _t	| j | j| _d S r
   )r`   r   r   ri   rj   _elem_modelr2   _countr   rz   r   _value_typer   r|   r   rc   r   r   r     s    
zUniTupleModel.__init__c                 C   s   | j S r
   )r   r   r   r   r   r     s    zUniTupleModel.get_value_typec                 C   s   | j S r
   r}   r   r   r   r   r     s    zUniTupleModel.get_data_typec                 C   s   |   S r
   r   r   r   r   r   r     s    zUniTupleModel.get_return_typec                 C   s   | j  f| j S r
   )r   r   r   r   r   r   r   r     s    zUniTupleModel.get_argument_typec                 C   s>   g }t | jD ]*}|||g}| j||}|| q|S r
   )r   r   extract_valuer   r    r5   r   r   r   outr   vr   r   r   r      s    zUniTupleModel.as_argumentc                 C   sF   t |  t j}t|D ]&\}}| j||}||||g}q|S r
   )r   Constantr   	Undefined	enumerater   r#   insert_valuer   r   r   r   r#     s
    zUniTupleModel.from_argumentc                 C   sR   t |  t j}t| jD ]0}|||g}| j||}|	|||g}q|S r
   )
r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rQ   dvalr   r   r   r     s    zUniTupleModel.as_datac                 C   sR   t |  t j}t| jD ]0}|||g}| j||}|	|||g}q|S r
   )
r   r   r   r   r   r   r   r   r"   r   r   r   r   r   r"     s    zUniTupleModel.from_datac                 C   s   |S r
   r   r   r   r   r   r!     s    zUniTupleModel.as_returnc                 C   s   |S r
   r   r   r   r   r   r$     s    zUniTupleModel.from_returnc                    s&    fddfddt jD S )Nc                    s     || S r
   r   )r   r   r   r   r   getter  s    z&UniTupleModel.traverse.<locals>.getterc                    s   g | ]}j jt |fqS r   )r   rj   r   r   r   r   r   r   r/     s   z*UniTupleModel.traverse.<locals>.<listcomp>)r   r   r*   r   r   r   r   r   r+     s    zUniTupleModel.traversec                 C   s   | j gS r
   )r   r   r   r   r   r4     s    zUniTupleModel.inner_models)rH   rI   rJ   r   r   r   r   r   r    r#   r   r"   r!   r$   r+   r4   re   r   r   rc   r   r     s   	r   c                   @   s   e Zd ZdZdS )CompositeModelzWAny model that is composed of multiple other models should subclass from
    this.
    N)rH   rI   rJ   rK   r   r   r   r   r     s   r   c                       s   e Zd ZdZdZ f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d0ddZdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zed&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Z  ZS )1StructModelNc                    sR   t t || |r(t| \ _ _nd  _ _t fdd jD  _d S )Nr   c                    s   g | ]} j |qS r   r   ri   r,   r   r   r   r/     s     z(StructModel.__init__.<locals>.<listcomp>)r`   r   r   zip_fields_membersrB   _modelsr   r   r   membersrc   r   r   r     s
    zStructModel.__init__c                 C   s   |  |}| j| S )zU
        StructModel-specific: get the Numba type of the field named *name*.
        )get_field_positionr   )r   nameposr   r   r   get_member_fe_type  s    
zStructModel.get_member_fe_typec                 C   s(   | j d kr"tdd | jD | _ | j S )Nc                 S   s   g | ]}|  qS r   r   r,   r   r   r   r/     s   z.StructModel.get_value_type.<locals>.<listcomp>)r   r   rN   r   r   r   r   r   r     s
    


zStructModel.get_value_typec                 C   s(   | j d kr"tdd | jD | _ | j S )Nc                 S   s   g | ]}|  qS r   rX   r,   r   r   r   r/     s   z-StructModel.get_data_type.<locals>.<listcomp>)r|   r   rN   r   r   r   r   r   r     s
    


zStructModel.get_data_typec                 C   s   t dd | jD S )Nc                 S   s   g | ]}|  qS r   )r   r,   r   r   r   r/   !  s     z1StructModel.get_argument_type.<locals>.<listcomp>)rB   r   r   r   r   r   r      s    zStructModel.get_argument_typec                 C   s   |   S r
   rX   r   r   r   r   r   #  s    zStructModel.get_return_typec              
   C   s@   g }t | jD ](\}}|t|||| ||| qt|S r
   )r   r   r5   getattrgetrB   )r   methnamer   r   Z	extractedr   r7   r   r   r   _as&  s    zStructModel._asc           	      C   sT   t |  t j}tt| j|D ],\}\}}t||||}| ||||}q"|S r
   )	r   r   r   r   r   r   r   r   set)	r   r   r   r   structr   r7   rQ   r   r   r   r   _from-  s
    zStructModel._fromc                 C   sF   |  d||}t|  tj}t|D ]\}}||||g}q(|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   r   r   r   r   r   r   r   r   r   r   Zelemsr   r   elr   r   r   r   6  s
    zStructModel.as_datac                    s,    fddt t| jD }| d |S )z
        Convert from "data" representation back into "value" representation.
        Usually invoked when loading from array.

        See notes in `as_data()`
        c                    s   g | ]}  |gqS r   r   r   r   r   r   r/   S  s   z)StructModel.from_data.<locals>.<listcomp>r"   r   r2   r   r   r   r   r   valsr   r   r   r"   L  s    zStructModel.from_datac           
      C   sx   g }t | jD ]0\}}t||d|}||||}|| qt|  tj	}	t |D ]\}}| 
||	||}	qZ|	S Nr   )r   r   r   r~   r)   r5   r   r   r   r   r   )
r   r   r(   r%   r   r   r;   Zelem_ptrrQ   r   r   r   r   r)   W  s    z"StructModel.load_from_data_pointerc                 C   s   |  d||S )Nr    )r   r   r   r   r   r    c  s    zStructModel.as_argumentc                 C   s   |  d||S )Nr#   )r   r   r   r   r   r#   f  s    zStructModel.from_argumentc                 C   sF   |  d||}t|  tj}t|D ]\}}||||g}q(|S )Nr   r   r   r   r   r   r!   i  s
    zStructModel.as_returnc                    s,    fddt t| jD }| d |S )Nc                    s   g | ]}  |gqS r   r   r   r   r   r   r/   q  s   z+StructModel.from_return.<locals>.<listcomp>r"   r   r   r   r   r   r$   p  s    zStructModel.from_returnc                 C   s0   t |tr| |}|j||gd| j|  d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   rQ   r   r   r   r   r   u  s
    


zStructModel.getc                 C   s2   t |tr| |}|j|||gd| j|  d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.r   )r   r   r   r   r   )r   r   ZstvalrQ   r   r   r   r   r     s
    

zStructModel.setc                 C   s<   z| j |W S  tk
r6   td| jj|f Y nX d S )Nz!%s does not have a field named %r)r   index
ValueErrorKeyErrorrd   rH   )r   fieldr   r   r   r     s    
zStructModel.get_field_positionc                 C   s
   t | jS r
   )r2   r   r   r   r   r   field_count  s    zStructModel.field_countc                 C   s   t |tr| |}| 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
        )r   r   r   r   r   r   r   r   r   get_type  s    	

zStructModel.get_typec                 C   s
   | 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   r   r   r   	get_model  s    	zStructModel.get_modelc                    s$    fddfddj D S )Nc                    s8   |j  kr* |j f}tdj|  || S )Nzexpecting {0} but got {1})r?   r   	TypeErrorformatr   )kr   r   r   r   r   r   r     s    z$StructModel.traverse.<locals>.getterc                    s    g | ]} |t |fqS r   )r   r   )r-   r   r   r   r   r/     s     z(StructModel.traverse.<locals>.<listcomp>)r   r*   r   r   r   r+     s    zStructModel.traversec                 C   s   | j S r
   r   r   r   r   r   r4     s    zStructModel.inner_models)N)rH   rI   rJ   r   r|   r   r   r   r   r   r   r   r   r   r"   r)   r    r#   r!   r$   r   r   r   rL   r   r   r   r+   r4   re   r   r   rc   r   r     s4   	

	r   c                       s    e Zd ZeZ fddZ  ZS )ComplexModelc                    s,   d|j fd|j fg}tt| ||| d S )Nrealimag)Zunderlying_floatr`   r   r   r   rc   r   r   r     s    zComplexModel.__init__)rH   rI   rJ   NotImplementedZ_element_typer   re   r   r   rc   r   r     s   r   c                       s   e Zd Z fddZ  ZS )
TupleModelc                    s*   dd t |D }tt| ||| d S )Nc                 S   s    g | ]\}}d t | |fqS )f)r   )r-   r   r.   r   r   r   r/     s     z'TupleModel.__init__.<locals>.<listcomp>)r   r`   r   r   r   rc   r   r   r     s    zTupleModel.__init__rq   r   r   rc   r   r     s   r   c                       s   e Zd Z fddZ  ZS )
UnionModelc                    s4   dt jfdt j|j fg}tt| ||| d S )Ntagpayload)r   uintpTupleZ
from_typesr`   r   r   r   rc   r   r   r     s    zUnionModel.__init__rq   r   r   rc   r   r     s   r   c                       s   e Zd Z fddZ  ZS )	PairModelc                    s,   d|j fd|jfg}tt| ||| d S )Nfirstsecond)Z
first_typeZsecond_typer`   r   r   r   rc   r   r   r     s    zPairModel.__init__rq   r   r   rc   r   r     s   r   c                       s   e Zd Z fddZ  ZS )ListPayloadModelc                    s>   dt jfdt jfdt jfd|jjfg}tt| ||| d S )NsizeZ	allocateddirtydata)r   intpboolean	containerrj   r`   r   r   r   rc   r   r   r     s    
zListPayloadModel.__init__rq   r   r   rc   r   r     s   r   c                       s   e Zd Z fddZ  ZS )	ListModelc                    s:   t |}dt |fdt jfg}tt| ||| d S Nmeminfoparent)r   ListPayloadMemInfoPointerpyobjectr`   r   r   r   r   r   Zpayload_typer   rc   r   r   r     s
    
zListModel.__init__rq   r   r   rc   r   r     s   r   c                       s   e Zd Z fddZ  ZS )ListIterModelc                    sB   t |j}dt |fdt t jfg}tt| ||| d S Nr   r   )	r   r   r   r   EphemeralPointerr   r`   r   r   r   rc   r   r   r     s
    zListIterModel.__init__rq   r   r   rc   r   r     s   r   c                       s   e Zd Z fddZ  ZS )SetEntryModelc                    s2   |j j}dtjfd|fg}tt| ||| d S )NrA   key)set_typerj   r   r   r`   r   r   )r   r   r   rj   r   rc   r   r   r   )  s
    zSetEntryModel.__init__rq   r   r   rc   r   r   '  s   r   c                       s   e Zd Z fddZ  ZS )SetPayloadModelc                    sV   t |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| ||| d S )NfillusedmaskZfingerr   entries)r   SetEntryr   r   r   r`   r   r   )r   r   r   Z
entry_typer   rc   r   r   r   5  s    zSetPayloadModel.__init__rq   r   r   rc   r   r   3  s   r   c                       s   e Zd Z fddZ  ZS )SetModelc                    s:   t |}dt |fdt jfg}tt| ||| d S r   )r   
SetPayloadr   r   r`   r   r   r   rc   r   r   r   I  s
    
zSetModel.__init__rq   r   r   rc   r   r   G  s   r   c                       s   e Zd Z fddZ  ZS )SetIterModelc                    sB   t |j}dt |fdt t jfg}tt| ||| d S r   )	r   r   r   r   r   r   r`   r   r   r   rc   r   r   r   U  s
    zSetIterModel.__init__rq   r   r   rc   r   r   S  s   r   c                       s   e Zd Z fddZ  ZS )
ArrayModelc                    sv   |j }dt|jfdtjfdtjfdtjfdt|jfdttj|fdttj|fg}tt	| 
||| d S )Nr   r   nitemsitemsizer   shapestrides)ndimr   r   rj   r   r   CPointerUniTupler`   r   r   r   r   r   r   r   rc   r   r   r   h  s    
zArrayModel.__init__rq   r   r   rc   r   r   a  s   r   c                       s   e Zd Z fddZ  ZS )ArrayFlagsModelc                    s$   d|j fg}tt| ||| d S )Nr   )
array_typer`   r   r   r   rc   r   r   r   y  s    zArrayFlagsModel.__init__rq   r   r   rc   r   r   w  s   r   c                       s$   e Zd Z fddZdd Z  ZS )NestedArrayModelc                    s(   | |j | _tt| || d S r
   )ri   rj   r   _be_typer`   r   r   r   rc   r   r   r     s    zNestedArrayModel.__init__c                 C   s   t | j| jj}|S )zXReturn the LLVM type representation for the storage of
        the nestedarray.
        )r   rz   r   r   r   )r   retr   r   r   as_storage_type  s    z NestedArrayModel.as_storage_type)rH   rI   rJ   r   r  re   r   r   rc   r   r     s   r   c                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )OptionalModelc                    s:   d|j fdtjfg}||j | _tt| ||| d S )Nr   valid)r?   r   r   ri   _value_modelr`   r  r   r   rc   r   r   r     s
    zOptionalModel.__init__c                 C   s
   | j  S r
   )r  r   r   r   r   r   r     s    zOptionalModel.get_return_typec                 C   s   t d S r
   r   r   r   r   r   r!     s    zOptionalModel.as_returnc                 C   s   | j ||S r
   )r  r$   r   r   r   r   r$     s    zOptionalModel.from_returnc                    s:    fdd} fdd d|f dfgS )Nc                    s.   | }  | d} ||t|jd S )Nr   )r   selectr   r   r?   )r   r  r   r   	get_validr   r   r   get_data  s    z(OptionalModel.traverse.<locals>.get_datac                    s     | dS )Nr  )r   r   r   r   r   r    s    z)OptionalModel.traverse.<locals>.get_validr   r  )r   )r   r   r	  r   r  r   r+     s
    zOptionalModel.traverse)	rH   rI   rJ   r   r   r!   r$   r+   re   r   r   rc   r   r    s
   r  c                       sv   e Zd Z f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ddZ  ZS )RecordModelc                    sN   t t ||  fdd|jD  _ttd|j _	 j	
  _d S )Nc                    s   g | ]\}} j |qS r   r   )r-   _r.   r   r   r   r/     s     z(RecordModel.__init__.<locals>.<listcomp>rU   )r`   r  r   r   r   r   rz   r^   r   r   rn   _be_ptr_typer   rc   r   r   r     s    zRecordModel.__init__c                 C   s   | j S )z6Passed around as reference to underlying data
        r  r   r   r   r   r     s    zRecordModel.get_value_typec                 C   s   | j S r
   r  r   r   r   r   r     s    zRecordModel.get_argument_typec                 C   s   | j S r
   r  r   r   r   r   r     s    zRecordModel.get_return_typec                 C   s   | j S r
   r   r   r   r   r   r     s    zRecordModel.get_data_typec                 C   s
   | |S r
   r&   r   r   r   r   r     s    zRecordModel.as_datac                 C   s   t dd S rw   r   r   r   r   r   r"     s    zRecordModel.from_datac                 C   s   |S r
   r   r   r   r   r   r      s    zRecordModel.as_argumentc                 C   s   |S r
   r   r   r   r   r   r#     s    zRecordModel.from_argumentc                 C   s   |S r
   r   r   r   r   r   r!     s    zRecordModel.as_returnc                 C   s   |S r
   r   r   r   r   r   r$     s    zRecordModel.from_returnNc                 C   s   | ||  S r
   rx   r'   r   r   r   r)     s    z"RecordModel.load_from_data_pointer)N)rH   rI   rJ   r   r   r   r   r   r   r"   r    r#   r!   r$   r)   re   r   r   rc   r   r    s   r  c                       s\   e Zd Z f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  ZS )UnicodeCharSeqc                    s6   t t| || ttjd }t||j| _	d S NrU   )
r`   r  r   r   r^   r   Zsizeof_unicode_charrz   r{   r   r   r   r   Zchartyrc   r   r   r     s    zUnicodeCharSeq.__init__c                 C   s   | j S r
   r  r   r   r   r   r     s    zUnicodeCharSeq.get_value_typec                 C   s   | j S r
   r  r   r   r   r   r     s    zUnicodeCharSeq.get_data_typec                 C   s   |S r
   r   r   r   r   r   r     s    zUnicodeCharSeq.as_datac                 C   s   |S r
   r   r   r   r   r   r"     s    zUnicodeCharSeq.from_datac                 C   s   |S r
   r   r   r   r   r   r!     s    zUnicodeCharSeq.as_returnc                 C   s   |S r
   r   r   r   r   r   r$     s    zUnicodeCharSeq.from_returnc                 C   s   |S r
   r   r   r   r   r   r      s    zUnicodeCharSeq.as_argumentc                 C   s   |S r
   r   r   r   r   r   r#     s    zUnicodeCharSeq.from_argumentrH   rI   rJ   r   r   r   r   r"   r!   r$   r    r#   re   r   r   rc   r   r    s   r  c                       s\   e Zd Z f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  ZS )CharSeqc                    s0   t t| || td}t||j| _d S r  )r`   r  r   r   r^   rz   r{   r   r  rc   r   r   r     s    
zCharSeq.__init__c                 C   s   | j S r
   r  r   r   r   r   r      s    zCharSeq.get_value_typec                 C   s   | j S r
   r  r   r   r   r   r     s    zCharSeq.get_data_typec                 C   s   |S r
   r   r   r   r   r   r     s    zCharSeq.as_datac                 C   s   |S r
   r   r   r   r   r   r"   	  s    zCharSeq.from_datac                 C   s   |S r
   r   r   r   r   r   r!     s    zCharSeq.as_returnc                 C   s   |S r
   r   r   r   r   r   r$     s    zCharSeq.from_returnc                 C   s   |S r
   r   r   r   r   r   r      s    zCharSeq.as_argumentc                 C   s   |S r
   r   r   r   r   r   r#     s    zCharSeq.from_argumentr  r   r   rc   r   r    s   r  c                       s   e Zd Z fddZ  ZS )CContiguousFlatIterc                    sv   |j jdkst|j }|j}|j}d|fdtjfdttjfg}|r^|dt	tj|f t
t| ||| d S )NCarrayZstrider   indices)r   layoutrR   rj   r   r   r   r   r5   EphemeralArrayr`   r  r   )r   r   r   need_indicesr   rj   r   r   rc   r   r   r     s    zCContiguousFlatIter.__init__rq   r   r   rc   r   r    s   r  c                       s   e Zd Z fddZ  ZS )FlatIterc                    sf   |j }|j}|j}d|fdtt||fdttj|fdttjfg}t	t
| ||| d S )Nr  Zpointersr  	exhausted)r   rj   r   r   r  r   r   r   r   r`   r  r   )r   r   r   r   rj   r   r   rc   r   r   r   *  s    zFlatIter.__init__rq   r   r   rc   r   r  )  s   r  c                       s   e Zd Z fddZ  ZS )UniTupleIterc                    s2   dt t jfd|jfg}tt| ||| d S )Nr   rB   )r   r   r   r   r`   r  r   r   rc   r   r   r   8  s    zUniTupleIter.__init__rq   r   r   rc   r   r  6  s   r  c                       s   e Zd Z fddZ  ZS )
SliceModelc                    s4   dt jfdt jfdt jfg}tt| ||| d S Nstartstopstep)r   r   r`   r   r   r   rc   r   r   r   A  s
    zSliceModel.__init__rq   r   r   rc   r   r   >  s   r   c                       s   e Zd Z fddZ  ZS )NPDatetimeModelc                    s"   t d}tt| ||| d S )N@   )r   r^   r`   r%  r   rb   rc   r   r   r   L  s    
zNPDatetimeModel.__init__rq   r   r   rc   r   r%  I  s   r%  c                       s   e Zd Z fddZ  ZS )ArrayIteratorc                    s2   dt t jfd|jfg}tt| ||| d S )Nr   r  )r   r   r   r   r`   r'  r   r   rc   r   r   r   S  s    zArrayIterator.__init__rq   r   r   rc   r   r'  Q  s   r'  c                       s   e Zd Z fddZ  ZS )EnumerateTypec                    s2   dt t jfd|jfg}tt| ||| d S )Nr{   iter)r   r   r   source_typer`   r(  r   r   rc   r   r   r   \  s    zEnumerateType.__init__rq   r   r   rc   r   r(  Z  s   r(  c                       s   e Zd Z fddZ  ZS )ZipTypec                    s,   dd t |jD }tt| ||| d S )Nc                 S   s   g | ]\}}d | |j fqS )ziter%d)iterator_type)r-   r   r*  r   r   r   r/   f  s   z$ZipType.__init__.<locals>.<listcomp>)r   Zsource_typesr`   r+  r   r   rc   r   r   r   e  s    zZipType.__init__rq   r   r   rc   r   r+  c  s   r+  c                       s   e Zd Z fddZ  ZS )RangeIteratorTypec                    sF   |j }dt|fd|fd|fdt|fg}tt| ||| d S )Nr)  r#  r$  r{   )
yield_typer   r   r`   r-  r   r   r   r   Zint_typer   rc   r   r   r   m  s    zRangeIteratorType.__init__rq   r   r   rc   r   r-  k  s   r-  c                       sl   e Zd Z f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  ZS )GeneratorModelc                    s   t t ||  fdd|jD  _ fdd|jD  _tdd  jD  _	tdd  jD  _
t jtj  j	 j
g _ j  _d S )Nc                    s$   g | ]}t |tjs j|qS r   )r   r   Omittedr   ri   r,   r   r   r   r/   {  s    z+GeneratorModel.__init__.<locals>.<listcomp>c                    s   g | ]} j |qS r   r   r,   r   r   r   r/   }  s     c                 S   s   g | ]}|  qS r   rX   r,   r   r   r   r/     s     c                 S   s   g | ]}|  qS r   rX   r,   r   r   r   r/     s     )r`   r0  r   Z	arg_typesZ_arg_modelsZstate_typesZ_state_modelsr   rN   Z_args_be_typeZ_state_be_typer   ri   r   Zint32r   r   rn   r  r   rc   r   r   r   x  s      zGeneratorModel.__init__c                 C   s   | j S )zH
        The generator closure is passed around as a reference.
        r  r   r   r   r   r     s    zGeneratorModel.get_value_typec                 C   s   | j S r
   r  r   r   r   r   r     s    z GeneratorModel.get_argument_typec                 C   s   | j S r
   r  r   r   r   r   r     s    zGeneratorModel.get_return_typec                 C   s   | j S r
   r  r   r   r   r   r     s    zGeneratorModel.get_data_typec                 C   s   |S r
   r   r   r   r   r   r      s    zGeneratorModel.as_argumentc                 C   s   |S r
   r   r   r   r   r   r#     s    zGeneratorModel.from_argumentc                 C   s   |  ||S r
   rY   r   r   r   r   r!     s    zGeneratorModel.as_returnc                 C   s   |  ||S r
   r]   r   r   r   r   r$     s    zGeneratorModel.from_returnc                 C   s
   | |S r
   r  r   r   r   r   r     s    zGeneratorModel.as_datac                 C   s   t ||j}||| |S r
   )r   rZ   r?   r[   )r   r   r   stackr   r   r   r"     s    zGeneratorModel.from_data)rH   rI   rJ   r   r   r   r   r   r    r#   r!   r$   r   r"   re   r   r   rc   r   r0  v  s   r0  c                       s   e Zd Z fddZ  ZS )ArrayCTypesModelc                    s8   dt |jfdt |jfg}tt| ||| d S )Nr   r   )r   r   rj   r   r`   r3  r   r   rc   r   r   r     s    zArrayCTypesModel.__init__rq   r   r   rc   r   r3    s   r3  c                       s   e Zd Z fddZ  ZS )
RangeModelc                    s6   |j j}d|fd|fd|fg}tt| ||| d S r!  )r,  r.  r`   r4  r   r/  rc   r   r   r     s    zRangeModel.__init__rq   r   r   rc   r   r4    s   r4  c                       s   e Zd Z fddZ  ZS )NdIndexModelc                    sP   |j }dttj|fdttj|fdttjfg}tt| 	||| d S )Nr   r  r  )
r   r   r   r   r  r   r   r`   r5  r   r   rc   r   r   r     s    zNdIndexModel.__init__rq   r   r   rc   r   r5    s   r5  c                 C   s(   |j jdkrt| |ddS t| |S d S )Nr  Fr  r   r  r  r  r   r\   r   r   r   handle_numpy_flat_type  s    r9  c                 C   s(   |j jdkrt| |ddS t| |S d S )Nr  Tr6  r7  r8  r   r   r   handle_numpy_ndenumerate_type  s    r:  c                 C   s
   | |j  S r
   )thisr8  r   r   r   handle_bound_function  s    r<  c                       s   e Zd Z fddZ  ZS )NdIterc                    s  |j }|j}|jr|nd}dttjfdt|fdttj|fdt	tj|fg}t
|jD ]N\}}|\}	}
}}d| }|	dkr||ttjf qb|	dkrqbd	sbtqbt
|j D ]0\}}t|tjsd
| }||t|f qtt| ||| d S )NrT   r  arraysr   r  zindex%dZflat)ZscalarZindexedZ0dr   zscalar%d)r>  r   Zneed_shaped_indexingr   r   r   r   r   r   r  r   Zindexersr5   rR   r   Arrayr`   r=  r   )r   r   r   Zarray_typesr   Z	shape_lenr   r   subkindZ	start_dimZend_dimr  member_namer\   rc   r   r   r     s*    
zNdIter.__init__rq   r   r   rc   r   r=    s   r=  c                       s   e Zd Z f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d Zd&ddZdd Zdd Zd d! Zed"d# Zd$d% Z  ZS )'DeferredStructModelc                    s0   t t| || dt|| _| | _d S )Nzdeferred.{0})r`   rC  r   r   idtypenamer   actual_fe_typer   rc   r   r   r     s    zDeferredStructModel.__init__c                 C   s   t j| jd S )Nz.valuer   Zglobal_contextZget_identified_typerE  r   r   r   r   r     s    z"DeferredStructModel.get_value_typec                 C   s   t j| jd S )Nz.datarG  r   r   r   r   r     s    z!DeferredStructModel.get_data_typec                 C   s
   | j  S r
   )_actual_modelr   r   r   r   r   r     s    z%DeferredStructModel.get_argument_typec                 C   s   |  ||}| j||S r
   )r   rH  r    )r   r   r   innerr   r   r   r      s    zDeferredStructModel.as_argumentc                 C   s    | j ||}| ||  |S r
   )rH  r#   r   make_uninitialized)r   r   r   resr   r   r   r#     s    z!DeferredStructModel.from_argumentc                 C   s8   |    | ||}| j||}|  }| |||S r
   )_definer   rH  r"   rJ  r   r   r   r   elemr   r   r   r   r"     s
    zDeferredStructModel.from_datac                 C   s<   |    | ||}| j||}| jdd}| |||S )Nr   )rA  )rL  r   rH  r   rJ  r   rM  r   r   r   r   #  s
    zDeferredStructModel.as_datac                 C   s   |S r
   r   r   r   r   r   r$   *  s    zDeferredStructModel.from_returnc                 C   s   |S r
   r   r   r   r   r   r!   -  s    zDeferredStructModel.as_returnc                 C   s   | |dgS r   r   r   r   r   r   r   0  s    zDeferredStructModel.getc                 C   s   | ||dgS r   )r   )r   r   r   contentr   r   r   r   3  s    zDeferredStructModel.setr   c                 C   s0   |    |dkr|  }n|  }t|tjS )Nr   )rL  r   r   r   r   r   )r   rA  r\   r   r   r   rJ  6  s
    
z&DeferredStructModel.make_uninitializedc                 C   s(   |   }| | |  }| | d S r
   )r   _define_value_typer   _define_data_type)r   ZvaltyZdattyr   r   r   rL  >  s    
zDeferredStructModel._definec                 C   s   |j r|| j  d S r
   )	is_opaqueset_bodyrH  r   )r   Z
value_typer   r   r   rP  D  s    z&DeferredStructModel._define_value_typec                 C   s   |j r|| j  d S r
   )rR  rS  rH  r   )r   Z	data_typer   r   r   rQ  H  s    z%DeferredStructModel._define_data_typec                 C   s   | j | jS r
   )r   ri   rF  r   r   r   r   rH  L  s    z!DeferredStructModel._actual_modelc                    s   | j  fddfgS )Nc                    s     | dgS r   r   r
  r   r   r   <lambda>R      z.DeferredStructModel.traverse.<locals>.<lambda>)rF  r*   r   r   r   r+   P  s    
zDeferredStructModel.traverse)r   )rH   rI   rJ   r   r   r   r   r    r#   r"   r   r$   r!   r   r   rJ  rL  rP  rQ  rL   rH  r+   re   r   r   rc   r   rC    s&   

rC  c                       s    e Zd ZdZ fddZ  ZS )StructPayloadModelz.Model for the payload of a mutable struct
    c                    s"   t |j }t ||| d S r
   )rB   Z
field_dictitemsr`   r   )r   r   fe_typr   rc   r   r   r   Y  s    zStructPayloadModel.__init__rk   r   r   rc   r   rV  U  s   rV  c                       s    e Zd ZdZ fddZ  ZS )StructRefModelz?Model for a mutable struct.
    A reference to the payload
    c                    s,   |  }dt|fg}t ||| d S )Nr   )r   r   r   r`   r   )r   r   rX  rj   r   rc   r   r   r   b  s    zStructRefModel.__init__rk   r   r   rc   r   rY  ^  s   rY  N)	functoolsr   collectionsr   Zllvmliter   Znumba.core.datamodel.registryr   Z
numba.corer   r   Znumba.npr   objectr	   r1  rM   BooleanZBooleanLiteralrS   r_   rf   Z
EnumMemberZIntEnumMemberrh   ZOpaqueZPyObjectZ
RawPointerZNoneTypeZStringLiteralZEllipsisTypeFunctionTypeZObjectModuleZPhantomContextManagerZ
DispatcherZObjModeDispatcherZExceptionClassDummyZExceptionInstanceZExternalFunctionZ	EnumClassZIntEnumClassZNumberClassZTypeRefZNamedTupleClassZDTypeZRecursiveCallZMakeFunctionLiteralZPoisonrl   r   ro   IntegerZIntegerLiteralrp   Floatrr   r   rs   r   rv   r  ry   ZExternalFunctionPointerr   r   ZNamedUniTupleZStarArgUniTupler   r   r   Complexr   ZLiteralListZLiteralStrKeyDictr   
NamedTupleZStarArgTupler   	UnionTyper   ZPairr   r   r   Listr   ZListIterr   r   r   r   r   Setr   ZSetIterr   r?  BufferZ	ByteArrayBytesZ
MemoryViewZPyArrayr   Z
ArrayFlagsr   ZNestedArrayr   Optionalr  ZRecordr  r  r  r  r  r  miscZSliceLiteralZ	SliceTyper   Z
NPDatetimeZNPTimedeltar%  r'  r(  r+  r-  	Generatorr0  ZArrayCTypesr3  Z	RangeTyper4  ZNumpyNdIndexTyper5  ZNumpyFlatTyper9  ZNumpyNdEnumerateTyper:  ZBoundFunctionr<  ZNumpyNdIterTyper=  ZDeferredTyperC  ZStructRefPayloadrV  rY  r   r   r   r   <module>   s.   +$	FE Q+
	
6



"P