B
     \}                 @   s  d dl mZmZ d dlmZ d dlmZ d dlmZ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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	j/ee	j0ee	j1G dd deZ2ee	j3G dd de2Z4ee	j5ee	j6G dd deZ7e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ee	jCG d#d$ d$eZDG d%d& d&eZEG d'd( d(eEZFee	jGG d)d* d*eFZHee	jIee	jJG d+d, d,eFZKee	jLG d-d. d.eFZMee	jNG d/d0 d0eFZOee	jPG d1d2 d2eFZQee	jRG d3d4 d4eFZSee	jTG d5d6 d6eFZUee	jVG d7d8 d8eFZWee	jXG d9d: d:eFZYee	jZG d;d< d<eFZ[ee	j\ee	j]ee	j^ee	j_ee	j`ee	jaG d=d> d>eFZbee	jcG d?d@ d@eFZdee	jeG dAdB dBeFZfee	jgG dCdD dDebZhee	jiG dEdF dFeFZjee	jkG dGdH dHeEZlee	jmG dIdJ dJeZmee	jnG dKdL dLeZnG dMdN dNeFZoG dOdP dPeFZpee	jqG dQdR dReFZqee	jrG dSdT dTeFZsee	jtee	juG dUdV dVeZvee	jwG dWdX dXeFZwee	jxG dYdZ dZeFZxee	jyG d[d\ d\eFZyee	jzG d]d^ d^eFZzee	j{G d_d` d`eEZ|ee	j}G dadb dbeFZ~ee	jG dcdd ddeFZee	jG dedf dfeFZee	jdgdh Zee	jdidj Zee	jdkdl Zee	jG dmdn dneFZee	jG dodp dpeEZdqS )r    )print_functionabsolute_import)partial)ir)cgutilstypesnumpy_support   )register_defaultc               @   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   5lib/python3.7/site-packages/numba/datamodel/models.py__init__"   s    zDataModel.__init__c             C   s   | j S )N)r   )r   r   r   r   r   &   s    zDataModel.fe_typec             C   s   t d S )N)NotImplementedError)r   r   r   r   get_value_type*   s    zDataModel.get_value_typec             C   s   |   S )N)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 )N)r   )r   r   r   r   get_return_type5   s    zDataModel.get_return_typec             C   s   t d S )N)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
        N)r   )r   r   r   r   r   r   as_argument;   s    zDataModel.as_argumentc             C   s   t | d S )N)r   )r   r   r   r   r   r   	as_returnB   s    zDataModel.as_returnc             C   s   t | d S )N)r   )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
        N)r   )r   r   r   r   r   r   from_argumentH   s    zDataModel.from_argumentc             C   s   t d S )N)r   )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t)r   r   r   
<listcomp>e   s    z-DataModel.traverse_models.<locals>.<listcomp>)traverse_types)r   r   )r   r   traverse_modelsa   s    zDataModel.traverse_modelsc             C   s   | j g|   S )zM
        Recursively list all frontend types involved in this model.
        )r   inner_types)r   r   r   r   r)   g   s    zDataModel.traverse_typesc             C   s   g S )z2
        List all *inner* frontend types.
        r   )r   r   r   r   r+   m   s    zDataModel.inner_typesc             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   r   r   get_nrt_meminfos   s    zDataModel.get_nrt_meminfoc             C   s   dS )NFr   )r   r   r   r   has_nrt_meminfoz   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 )N)r-   )r&   modelr   r   r   	<genexpr>   s    z1DataModel.contains_nrt_meminfo.<locals>.<genexpr>)anyr*   )r   r   r   r   contains_nrt_meminfo}   s    zDataModel.contains_nrt_meminfoc             C   s   t | | jfS )N)typer   )r   r   r   r   _compared_fields   s    zDataModel._compared_fieldsc             C   s   t t|  S )N)hashtupler3   )r   r   r   r   __hash__   s    zDataModel.__hash__c             C   s(   t | t |kr |  | kS dS d S )NF)r2   r3   )r   otherr   r   r   __eq__   s    zDataModel.__eq__c             C   s   |  | S )N)r8   )r   r7   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%   r*   r)   r+   r,   r-   r1   r3   r6   r8   r9   r   r   r   r   r      s2   
r   c               @   s(   e Zd Z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   dS )Nr   r   )r   r   r   r   r      s    z%OmittedArgDataModel.get_argument_typec             C   s   dS )Nr   r   )r   r   valr   r   r   r      s    zOmittedArgDataModel.as_argumentc             C   s   |dkst |d S )Nr   )AssertionError)r   r   r@   r   r   r   r      s    z!OmittedArgDataModel.from_argumentN)r:   r;   r<   r=   r   r   r   r   r   r   r   r?      s   r?   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 )BooleanModelr	      c             C   s   | j S )N)	_bit_type)r   r   r   r   r      s    zBooleanModel.get_value_typec             C   s   | j S )N)
_byte_type)r   r   r   r   r      s    zBooleanModel.get_data_typec             C   s   |   S )N)r   )r   r   r   r   r      s    zBooleanModel.get_return_typec             C   s   |   S )N)r   )r   r   r   r   r      s    zBooleanModel.get_argument_typec             C   s   | ||  S )N)Zzextr   )r   r   r   r   r   r   r      s    zBooleanModel.as_datac             C   s   |  ||S )N)r   )r   r   r   r   r   r   r      s    zBooleanModel.as_argumentc             C   s   |  ||S )N)r   )r   r   r   r   r   r   r      s    zBooleanModel.as_returnc             C   s   | ||  S )N)Ztruncr   )r   r   r   r   r   r   r      s    zBooleanModel.from_datac             C   s   |  ||S )N)r   )r   r   r   r   r   r   r      s    zBooleanModel.from_argumentc             C   s   |  ||S )N)r   )r   r   r   r   r   r   r       s    zBooleanModel.from_returnN)r:   r;   r<   r   IntTyperD   rE   r   r   r   r   r   r   r   r   r   r    r   r   r   r   rB      s   

rB   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 )N)superrG   r   be_type)r   r   r   rI   )	__class__r   r   r      s    zPrimitiveModel.__init__c             C   s   | j S )N)rI   )r   r   r   r   r      s    zPrimitiveModel.get_value_typec             C   s   |S )Nr   )r   r   r   r   r   r   r      s    zPrimitiveModel.as_datac             C   s   |S )Nr   )r   r   r   r   r   r   r      s    zPrimitiveModel.as_argumentc             C   s   |S )Nr   )r   r   r   r   r   r   r      s    zPrimitiveModel.as_returnc             C   s   |S )Nr   )r   r   r   r   r   r   r      s    zPrimitiveModel.from_datac             C   s   |S )Nr   )r   r   r   r   r   r   r      s    zPrimitiveModel.from_argumentc             C   s   |S )Nr   )r   r   r   r   r   r   r       s    zPrimitiveModel.from_return)r:   r;   r<   r=   r   r   r   r   r   r   r   r    __classcell__r   r   )rJ   r   rG      s   rG   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 )N)_proxied_modelr   )r   r   r   r   r      s    zProxyModel.get_value_typec             C   s
   | j  S )N)rM   r   )r   r   r   r   r      s    zProxyModel.get_data_typec             C   s
   | j  S )N)rM   r   )r   r   r   r   r      s    zProxyModel.get_return_typec             C   s
   | j  S )N)rM   r   )r   r   r   r   r      s    zProxyModel.get_argument_typec             C   s   | j ||S )N)rM   r   )r   r   r   r   r   r   r      s    zProxyModel.as_datac             C   s   | j ||S )N)rM   r   )r   r   r   r   r   r   r      s    zProxyModel.as_argumentc             C   s   | j ||S )N)rM   r   )r   r   r   r   r   r   r      s    zProxyModel.as_returnc             C   s   | j ||S )N)rM   r   )r   r   r   r   r   r   r     s    zProxyModel.from_datac             C   s   | j ||S )N)rM   r   )r   r   r   r   r   r   r     s    zProxyModel.from_argumentc             C   s   | j ||S )N)rM   r    )r   r   r   r   r   r   r    	  s    zProxyModel.from_returnN)r:   r;   r<   r=   r   r   r   r   r   r   r   r   r   r    r   r   r   r   rL      s   rL   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 )N)rH   rN   r   lookupdtyperM   )r   r   r   )rJ   r   r   r     s    zEnumModel.__init__)r:   r;   r<   r=   r   rK   r   r   )rJ   r   rN     s   rN   c                   s.   e Zd ZdZed Z fddZ  Z	S )OpaqueModelz#
    Passed as opaque pointers
    rC   c                s   | j }tt| ||| d S )N)	_ptr_typerH   rQ   r   )r   r   r   rI   )rJ   r   r   r   8  s    zOpaqueModel.__init__)
r:   r;   r<   r=   r   rF   
as_pointerrR   r   rK   r   r   )rJ   r   rQ     s   rQ   c               @   s$   e Zd Zdd Zdd Zdd ZdS )MemInfoModelc             C   s   | j | jj S )N)r   rO   r   rP   r)   )r   r   r   r   r+   @  s    zMemInfoModel.inner_typesc             C   s   dS )NTr   )r   r   r   r   r-   C  s    zMemInfoModel.has_nrt_meminfoc             C   s   |S )Nr   )r   r   r   r   r   r   r,   F  s    zMemInfoModel.get_nrt_meminfoN)r:   r;   r<   r+   r-   r,   r   r   r   r   rT   =  s   rT   c                   s   e Zd Z fddZ  ZS )IntegerModelc                s$   t |j}tt| ||| d S )N)r   rF   ZbitwidthrH   rU   r   )r   r   r   rI   )rJ   r   r   r   M  s    zIntegerModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   rU   J  s   rU   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 )N)
r   Zfloat32r   Z	FloatTypeZfloat64Z
DoubleTyper   rH   rV   r   )r   r   r   rI   )rJ   r   r   r   T  s    



zFloatModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   rV   R  s   rV   c                   s   e Zd Z fddZ  ZS )PointerModelc                s<   | |j| _| j | _| j }tt| ||| d S )N)	rO   rP   _pointee_modelr   _pointee_be_typerS   rH   rW   r   )r   r   r   rI   )rJ   r   r   r   `  s    
zPointerModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   rW   ^  s   rW   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 )N)rY   )r   r   r   r   r   j  s    z#EphemeralPointerModel.get_data_typec             C   s   | |}| j||S )N)r"   rX   r   )r   r   r   r   r   r   r   m  s    
zEphemeralPointerModel.as_datac             C   s   t dd S )Nz$use load_from_data_pointer() instead)r   )r   r   r   r   r   r   r   q  s    zEphemeralPointerModel.from_dataNc             C   s   | ||  S )N)bitcastr   )r   r   r#   r!   r   r   r   r$   t  s    z,EphemeralPointerModel.load_from_data_pointer)N)r:   r;   r<   r   r   r   r$   r   r   r   r   rZ   g  s   rZ   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 )N)	rH   r\   r   r   	ArrayTyperY   r   count
_data_type)r   r   r   )rJ   r   r   r   {  s    zEphemeralArrayModel.__init__c             C   s   | j S )N)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   r     s    zEphemeralArrayModel.as_datac             C   s   t dd S )Nz$use load_from_data_pointer() instead)r   )r   r   r   r   r   r   r     s    zEphemeralArrayModel.from_dataNc             C   s   | ||  S )N)r[   r   )r   r   r#   r!   r   r   r   r$     s    z*EphemeralArrayModel.load_from_data_pointer)N)	r:   r;   r<   r   r   r   r   r$   rK   r   r   )rJ   r   r\   x  s
   r\   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   )rO   r   )r&   r'   )r   r   r   r(     s    z5ExternalFuncPointerModel.__init__.<locals>.<listcomp>)sigrO   Zreturn_typer   argsr   ZPointerTypeFunctionTyperH   rd   r   )r   r   r   re   Zrettyrf   rI   )rJ   )r   r   r     s
    z!ExternalFuncPointerModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   rd     s   rd   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 )N)rH   rh   r   rO   rP   _elem_modellen_countr   r]   r   _value_typer   r_   )r   r   r   )rJ   r   r   r     s    

zUniTupleModel.__init__c             C   s   | j S )N)rl   )r   r   r   r   r     s    zUniTupleModel.get_value_typec             C   s   | j S )N)r_   )r   r   r   r   r     s    zUniTupleModel.get_data_typec             C   s   |   S )N)r   )r   r   r   r   r     s    zUniTupleModel.get_return_typec             C   s   | j  f| j S )N)ri   r   rk   )r   r   r   r   r     s    zUniTupleModel.get_argument_typec             C   sB   g }x8t | jD ]*}|||g}| j||}|| qW |S )N)rb   rk   extract_valueri   r   append)r   r   r   outra   vr   r   r   r     s    zUniTupleModel.as_argumentc             C   sJ   t |  t j}x2t|D ]&\}}| j||}||||g}qW |S )N)r   Constantr   	Undefined	enumerateri   r   insert_value)r   r   r   ro   ra   rp   r   r   r   r     s
    zUniTupleModel.from_argumentc             C   sV   t |  t j}x>t| jD ]0}|||g}| j||}|	|||g}qW |S )N)
r   rq   r   rr   rb   rk   rm   ri   r   rt   )r   r   r   ro   ra   r@   dvalr   r   r   r     s    zUniTupleModel.as_datac             C   sV   t |  t j}x>t| jD ]0}|||g}| j||}|	|||g}qW |S )N)
r   rq   r   rr   rb   rk   rm   ri   r   rt   )r   r   r   ro   ra   r@   ru   r   r   r   r     s    zUniTupleModel.from_datac             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zUniTupleModel.as_returnc             C   s   |S )Nr   )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 )N)rm   )ra   r   )r   r   r   getter  s    z&UniTupleModel.traverse.<locals>.getterc                s   g | ]}j jt |fqS r   )r   rP   r   )r&   ra   )rv   r   r   r   r(     s   z*UniTupleModel.traverse.<locals>.<listcomp>)rb   rk   )r   r   r   )r   rv   r   r   r%     s    zUniTupleModel.traversec             C   s
   | j  S )N)ri   r)   )r   r   r   r   r+     s    zUniTupleModel.inner_types)r:   r;   r<   r   r   r   r   r   r   r   r   r   r   r    r%   r+   rK   r   r   )rJ   r   rh     s   	rh   c               @   s   e Zd ZdZdS )CompositeModelzWAny model that is composed of multiple other models should subclass from
    this.
    N)r:   r;   r<   r=   r   r   r   r   rw     s   rw   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   rO   )r&   r'   )r   r   r   r(     s    z(StructModel.__init__.<locals>.<listcomp>)rH   rx   r   zip_fields_membersr5   _models)r   r   r   members)rJ   )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   r(     s   z.StructModel.get_value_type.<locals>.<listcomp>)rl   r   LiteralStructTyper|   )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   )r   )r&   r'   r   r   r   r(     s   z-StructModel.get_data_type.<locals>.<listcomp>)r_   r   r   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   r(   	  s    z1StructModel.get_argument_type.<locals>.<listcomp>)r5   r|   )r   r   r   r   r     s    zStructModel.get_argument_typec             C   s   |   S )N)r   )r   r   r   r   r     s    zStructModel.get_return_typec          
   C   sD   g }x6t | jD ](\}}|t|||| ||| qW t|S )N)rs   r|   rn   getattrgetr5   )r   methnamer   r   Z	extractedra   dmr   r   r   _as  s
    zStructModel._asc       	      C   sX   t |  t j}x@tt| j|D ],\}\}}t||||}| ||||}q$W |S )N)	r   rq   r   rr   rs   ry   r|   r   set)	r   r   r   r   structra   r   r@   rp   r   r   r   _from  s
    zStructModel._fromc             C   sJ   |  d||}t|  tj}x$t|D ]\}}||||g}q*W |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   rq   r   rr   rs   rt   )r   r   r   elemsr   ra   elr   r   r   r     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   )rm   )r&   ra   )r   r   r   r   r(   ;  s   z)StructModel.from_data.<locals>.<listcomp>r   )rb   rj   r{   r   )r   r   r   valsr   )r   r   r   r   4  s    zStructModel.from_datac       
      C   s   g }x>t | jD ]0\}}t||d|}||||}|| qW t|  tj	}	x$t |D ]\}}| 
||	||}	q`W |	S )Nr   )rs   r|   r   r`   r$   rn   r   rq   r   rr   r   )
r   r   r#   r!   rc   ra   r.   Zelem_ptrr@   r   r   r   r   r$   ?  s    z"StructModel.load_from_data_pointerc             C   s   |  d||S )Nr   )r   )r   r   r   r   r   r   r   K  s    zStructModel.as_argumentc             C   s   |  d||S )Nr   )r   )r   r   r   r   r   r   r   N  s    zStructModel.from_argumentc             C   sJ   |  d||}t|  tj}x$t|D ]\}}||||g}q*W |S )Nr   )r   r   rq   r   rr   rs   rt   )r   r   r   r   r   ra   r   r   r   r   r   Q  s
    zStructModel.as_returnc                s,    fddt t| jD }| d |S )Nc                s   g | ]}  |gqS r   )rm   )r&   ra   )r   r   r   r   r(   Y  s   z+StructModel.from_return.<locals>.<listcomp>r   )rb   rj   r{   r   )r   r   r   r   r   )r   r   r   r    X  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~   rm   rz   )r   r   r@   r   r   r   r   r   ]  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~   rt   rz   )r   r   Zstvalr@   r   r   r   r   r   r  s    

zStructModel.setc             C   s:   y| j |S  tk
r4   td| jj|f Y nX d S )Nz!%s does not have a field named %r)rz   index
ValueErrorKeyErrorrJ   r:   )r   Zfieldr   r   r   r~     s
    zStructModel.get_field_positionc             C   s
   t | jS )N)rj   rz   )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   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})r2   r   	TypeErrorformatr   )kr   rf   )r   r   r   r   rv     s    z$StructModel.traverse.<locals>.getterc                s    g | ]} |t |fqS r   )r   r   )r&   r   )rv   r   r   r   r(     s    z(StructModel.traverse.<locals>.<listcomp>)rz   )r   r   r   )r   rv   r   r   r%     s    zStructModel.traversec             C   s$   g }x| j D ]}|| 7 }qW |S )N)r|   r)   )r   r   r   r   r   r   r+     s    zStructModel.inner_types)N)r:   r;   r<   rl   r_   r   r   r   r   r   r   r   r   r   r   r$   r   r   r   r    r   r   r~   r>   r   r   r   r%   r+   rK   r   r   )rJ   r   rx     s2   	
	rx   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_floatrH   r   r   )r   r   r   r}   )rJ   r   r   r     s    zComplexModel.__init__)r:   r;   r<   NotImplementedZ_element_typer   rK   r   r   )rJ   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&   ra   r'   r   r   r   r(     s    z'TupleModel.__init__.<locals>.<listcomp>)rs   rH   r   r   )r   r   r   r}   )rJ   r   r   r     s    zTupleModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   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_typerH   r   r   )r   r   r   r}   )rJ   r   r   r     s    zPairModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   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	containerrP   rH   r   r   )r   r   r   r}   )rJ   r   r   r     s
    zListPayloadModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   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pyobjectrH   r   r   )r   r   r   payload_typer}   )rJ   r   r   r     s    
zListModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   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   rH   r   r   )r   r   r   r   r}   )rJ   r   r   r     s    zListIterModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   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 )Nr4   key)Zset_typerP   r   r   rH   r   r   )r   r   r   rP   r}   )rJ   r   r   r     s    
zSetEntryModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   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 )NZfillZusedmaskZfingerr   entries)r   SetEntryr   r   r   rH   r   r   )r   r   r   Z
entry_typer}   )rJ   r   r   r     s    
zSetPayloadModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r     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 )Nr   r   )r   
SetPayloadr   r   rH   r   r   )r   r   r   r   r}   )rJ   r   r   r   %  s    
zSetModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   #  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 )Nr   r   )	r   r   r   r   r   r   rH   r   r   )r   r   r   r   r}   )rJ   r   r   r   1  s    zSetIterModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   /  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   rP   r   r   CPointerUniTuplerH   r   r   )r   r   r   r   r}   )rJ   r   r   r   D  s    zArrayModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   =  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_typerH   r   r   )r   r   r   r}   )rJ   r   r   r   U  s    zArrayFlagsModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   S  s   r   c                   s   e Zd Z fddZ  ZS )SmartArrayModelc                s,   dt jfd|jfg}tt| ||| d S )Nr   r   )r   r   Zas_arrayrH   r   r   )r   r   r   r}   )rJ   r   r   r   ^  s    zSmartArrayModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   \  s   r   c                   s$   e Zd Z fddZdd Z  ZS )NestedArrayModelc                s(   | |j | _tt| || d S )N)rO   rP   r   _be_typerH   r   r   )r   r   r   )rJ   r   r   r   h  s    zNestedArrayModel.__init__c             C   s   t | j| jj}|S )N)r   r]   r   r   r   )r   Zretr   r   r   r   l  s    zNestedArrayModel.get_data_type)r:   r;   r<   r   r   rK   r   r   )rJ   r   r   f  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)r2   r   r   rO   _value_modelrH   r   r   )r   r   r   r}   )rJ   r   r   r   s  s    zOptionalModel.__init__c             C   s
   | j  S )N)r   r   )r   r   r   r   r   {  s    zOptionalModel.get_return_typec             C   s   t d S )N)r   )r   r   r   r   r   r   r   ~  s    zOptionalModel.as_returnc             C   s   | j ||S )N)r   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   Zselectr   rq   r2   )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   r     s    z)OptionalModel.traverse.<locals>.get_validr   r   )r   )r   r   r   r   )r   r   r   r   r%     s    zOptionalModel.traverse)	r:   r;   r<   r   r   r   r    r%   rK   r   r   )rJ   r   r   q  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   rO   )r&   _r'   )r   r   r   r(     s    z(RecordModel.__init__.<locals>.<listcomp>rC   )rH   r   r   r}   r|   r   r]   rF   r   r   rS   _be_ptr_type)r   r   r   )rJ   )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 )N)r   )r   r   r   r   r     s    zRecordModel.get_argument_typec             C   s   | j S )N)r   )r   r   r   r   r     s    zRecordModel.get_return_typec             C   s   | j S )N)r   )r   r   r   r   r     s    zRecordModel.get_data_typec             C   s
   | |S )N)r"   )r   r   r   r   r   r   r     s    zRecordModel.as_datac             C   s   t dd S )Nz$use load_from_data_pointer() instead)r   )r   r   r   r   r   r   r     s    zRecordModel.from_datac             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zRecordModel.as_argumentc             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zRecordModel.from_argumentc             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zRecordModel.as_returnc             C   s   |S )Nr   )r   r   r   r   r   r   r      s    zRecordModel.from_returnNc             C   s   | ||  S )N)r[   r   )r   r   r#   r!   r   r   r   r$     s    z"RecordModel.load_from_data_pointer)N)r:   r;   r<   r   r   r   r   r   r   r   r   r   r   r    r$   rK   r   r   )rJ   r   r     s   r   c                   s,   e Zd Z fddZdd Zdd Z  ZS )UnicodeCharSeqc                s6   t t| || ttjd }t||j| _	d S )NrC   )
rH   r   r   r   rF   r   Zsizeof_unicode_charr]   r^   r   )r   r   r   charty)rJ   r   r   r     s    zUnicodeCharSeq.__init__c             C   s   | j S )N)r   )r   r   r   r   r     s    zUnicodeCharSeq.get_value_typec             C   s   | j S )N)r   )r   r   r   r   r     s    zUnicodeCharSeq.get_data_type)r:   r;   r<   r   r   r   rK   r   r   )rJ   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 )NrC   )rH   r   r   r   rF   r]   r^   r   )r   r   r   r   )rJ   r   r   r     s    
zCharSeq.__init__c             C   s   | j S )N)r   )r   r   r   r   r     s    zCharSeq.get_value_typec             C   s   | j S )N)r   )r   r   r   r   r     s    zCharSeq.get_data_typec             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zCharSeq.as_datac             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zCharSeq.from_datac             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zCharSeq.as_returnc             C   s   |S )Nr   )r   r   r   r   r   r   r      s    zCharSeq.from_returnc             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zCharSeq.as_argumentc             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zCharSeq.from_argument)r:   r;   r<   r   r   r   r   r   r   r    r   r   rK   r   r   )rJ   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   layoutrA   rP   r   r   r   r   rn   EphemeralArrayrH   r   r   )r   r   r   need_indicesr   rP   r   r}   )rJ   r   r   r     s    zCContiguousFlatIter.__init__)r:   r;   r<   r   rK   r   r   )rJ   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   rP   r   r   r   r   r   r   r   rH   r   r   )r   r   r   r   rP   r   r}   )rJ   r   r   r     s    zFlatIter.__init__)r:   r;   r<   r   rK   r   r   )rJ   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   r5   )r   r   r   r   rH   r   r   )r   r   r   r}   )rJ   r   r   r   	  s    zUniTupleIter.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r     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   rH   r   r   )r   r   r   r}   )rJ   r   r   r     s    zSliceModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   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   rF   rH   r   r   )r   r   r   rI   )rJ   r   r   r     s    
zNPDatetimeModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r     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   Zuintpr   rH   r   r   )r   r   r   r}   )rJ   r   r   r   #  s    zArrayIterator.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   !  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_typerH   r   r   )r   r   r   r}   )rJ   r   r   r   ,  s    zEnumerateType.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   *  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&   ra   r   r   r   r   r(   6  s   z$ZipType.__init__.<locals>.<listcomp>)rs   Zsource_typesrH   r   r   )r   r   r   r}   )rJ   r   r   r   5  s    zZipType.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   3  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   rH   r   r   )r   r   r   int_typer}   )rJ   r   r   r   =  s    zRangeIteratorType.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   ;  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   rO   )r&   r'   )r   r   r   r(   K  s    z+GeneratorModel.__init__.<locals>.<listcomp>c                s   g | ]} j |qS r   )r   rO   )r&   r'   )r   r   r   r(   M  s    c             S   s   g | ]}|  qS r   )r   )r&   r'   r   r   r   r(   P  s    c             S   s   g | ]}|  qS r   )r   )r&   r'   r   r   r   r(   R  s    )rH   r   r   Z	arg_typesZ_arg_modelsZstate_typesZ_state_modelsr   r   Z_args_be_typeZ_state_be_typer   rO   r   Zint32r   r   rS   r   )r   r   r   )rJ   )r   r   r   H  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   Y  s    zGeneratorModel.get_value_typec             C   s   | j S )N)r   )r   r   r   r   r   _  s    z GeneratorModel.get_argument_typec             C   s   | j S )N)r   )r   r   r   r   r   b  s    zGeneratorModel.get_return_typec             C   s   | j S )N)r   )r   r   r   r   r   e  s    zGeneratorModel.get_data_typec             C   s   |S )Nr   )r   r   r   r   r   r   r   h  s    zGeneratorModel.as_argumentc             C   s   |S )Nr   )r   r   r   r   r   r   r   k  s    zGeneratorModel.from_argumentc             C   s   |  ||S )N)r   )r   r   r   r   r   r   r   n  s    zGeneratorModel.as_returnc             C   s   |  ||S )N)r   )r   r   r   r   r   r   r    q  s    zGeneratorModel.from_returnc             C   s
   | |S )N)r"   )r   r   r   r   r   r   r   t  s    zGeneratorModel.as_datac             C   s   t ||j}||| |S )N)r   Zalloca_oncer2   Zstore)r   r   r   stackr   r   r   r   w  s    zGeneratorModel.from_data)r:   r;   r<   r   r   r   r   r   r   r   r   r    r   r   rK   r   r   )rJ   r   r   F  s   r   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   rP   r   rH   r   r   )r   r   r   r}   )rJ   r   r   r     s    zArrayCTypesModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r   }  s   r   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 )Nr   r   r   )r   r   rH   r   r   )r   r   r   r   r}   )rJ   r   r   r     s
    
zRangeModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r     s   r   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   rH   r   r   )r   r   r   r   r}   )rJ   r   r   r     s
    zNdIndexModel.__init__)r:   r;   r<   r   rK   r   r   )rJ   r   r     s   r   c             C   s(   |j jdkrt| |ddS t| |S d S )Nr   F)r   )r   r   r   r   )r   tyr   r   r   handle_numpy_flat_type  s    r   c             C   s(   |j jdkrt| |ddS t| |S d S )Nr   T)r   )r   r   r   r   )r   r   r   r   r   handle_numpy_ndenumerate_type  s    r   c             C   s
   | |j  S )N)this)r   r   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}x\t
|jD ]N\}}|\}	}
}}d| }|	dkr||ttjf qd|	dkrqdd	sdtqdW x>t
|j D ]0\}}t|tjsd
| }||t|f qW tt| ||| d S )Nr	   r   arraysr   r   zindex%dZflat)ZscalarZindexedZ0dr   zscalar%d)r   r   Zneed_shaped_indexingr   r   r   Tupler   r   r   rs   Zindexersrn   rA   r   ArrayrH   r   r   )r   r   r   Zarray_typesr   Z	shape_lenr}   ra   subkindZ	start_dimZend_dimr   member_namer   )rJ   r   r   r     s(    zNdIter.__init__)r:   r;   r<   r   rK   r   r   )rJ   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})rH   r   r   r   idtypenamer   actual_fe_type)r   r   r   )rJ   r   r   r     s    zDeferredStructModel.__init__c             C   s   t j| jd S )Nz.value)r   global_contextget_identified_typer   )r   r   r   r   r     s    z"DeferredStructModel.get_value_typec             C   s   t j| jd S )Nz.data)r   r  r  r   )r   r   r   r   r     s    z!DeferredStructModel.get_data_typec             C   s
   | j  S )N)_actual_modelr   )r   r   r   r   r     s    z%DeferredStructModel.get_argument_typec             C   s   |  ||}| j||S )N)r   r  r   )r   r   r   innerr   r   r   r     s    zDeferredStructModel.as_argumentc             C   s    | j ||}| ||  |S )N)r  r   r   make_uninitialized)r   r   r   Zresr   r   r   r     s    z!DeferredStructModel.from_argumentc             C   s8   |    | ||}| j||}|  }| |||S )N)_definer   r  r   r  r   )r   r   r   elemro   r   r   r   r     s
    zDeferredStructModel.from_datac             C   s<   |    | ||}| j||}| jdd}| |||S )Nr   )r   )r  r   r  r   r  r   )r   r   r   r  ro   r   r   r   r     s
    zDeferredStructModel.as_datac             C   s   |S )Nr   )r   r   r   r   r   r   r      s    zDeferredStructModel.from_returnc             C   s   |S )Nr   )r   r   r   r   r   r   r     s    zDeferredStructModel.as_returnc             C   s   | |dgS )Nr   )rm   )r   r   r   r   r   r   r      s    zDeferredStructModel.getc             C   s   | ||dgS )Nr   )rt   )r   r   r   Zcontentr   r   r   r     s    zDeferredStructModel.setr   c             C   s0   |    |dkr|  }n|  }t|tjS )Nr   )r  r   r   r   rq   rr   )r   r   r   r   r   r   r    s
    
z&DeferredStructModel.make_uninitializedc             C   s(   |   }| | |  }| | d S )N)r   _define_value_typer   _define_data_type)r   ZvaltyZdattyr   r   r   r    s    
zDeferredStructModel._definec             C   s   |j r|| j  d S )N)	is_opaqueset_bodyr  r   )r   Z
value_typer   r   r   r	    s    z&DeferredStructModel._define_value_typec             C   s   |j r|| j  d S )N)r  r  r  r   )r   Z	data_typer   r   r   r
    s    z%DeferredStructModel._define_data_typec             C   s   | j | jS )N)r   rO   r  )r   r   r   r   r    s    z!DeferredStructModel._actual_modelc                s   | j  fddfgS )Nc                s     | dgS )Nr   )rm   )r   )r   r   r   <lambda>"  s    z.DeferredStructModel.traverse.<locals>.<lambda>)r  )r   r   r   )r   r   r%      s    zDeferredStructModel.traverse)r   )r:   r;   r<   r   r   r   r   r   r   r   r   r    r   r   r   r  r  r	  r
  r>   r  r%   rK   r   r   )rJ   r   r     s$   
r   N)Z
__future__r   r   	functoolsr   Zllvmliter   Znumbar   r   r   registryr
   objectr   r   r?   ZBooleanrB   rG   rL   Z
EnumMemberZIntEnumMemberrN   ZOpaqueZPyObjectZ
RawPointerZNoneTypeZStringLiteralZEllipsisTypeZFunctionZTypeZObjectZModuleZPhantomZContextManagerZ
DispatcherZObjModeDispatcherZExceptionClassZDummyZExceptionInstanceZExternalFunctionZMacroZ	EnumClassZIntEnumClassZNumberClassZTypeRefZNamedTupleClassZDTypeZRecursiveCallrQ   r   rT   ZIntegerZIntegerLiteralrU   ZFloatrV   r   rW   r   rZ   r   r\   ZExternalFunctionPointerrd   r   ZNamedUniTuplerh   rw   rx   ZComplexr   r   Z
NamedTupler   ZPairr   r   r   ZListr   ZListIterr   r   r   r   r   Setr   ZSetIterr   r   ZBufferZ	ByteArrayZBytesZ
MemoryViewZPyArrayr   Z
ArrayFlagsr   ZSmartArrayTyper   ZNestedArrayr   ZOptionalr   ZRecordr   r   r   r   r   r   Z	SliceTyper   Z
NPDatetimeZNPTimedeltar   r   r   r   r   	Generatorr   ZArrayCTypesr   Z	RangeTyper   ZNumpyNdIndexTyper   ZNumpyFlatTyper   ZNumpyNdEnumerateTyper   ZBoundFunctionr   ZNumpyNdIterTyper   ZDeferredTyper   r   r   r   r   <module>   s   	#$
	:

E T
	
+	

6
"