a
    Df                     @   s  d Z ddlZddlZddlZddl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mZmZmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZm Z m!Z! dd Z"dd Z#dZ$dZ%dZ&dZ'dZ(dZ)dd Z*e!dd Z+dd Z,dd Z-dd Z.dd  Z/e0d!d"Z1G d#d$ d$e2Z3G d%d& d&e2Z4G d'd( d(e2Z5d)d* Z6ee7d+d, Z8ee7e
j9d-d. Z:ee;e
j<d/d0 Z=eej>e
j<e
j?d1d2 Z@ed3e
j<d4d5 ZAed6e
jBeejCd7d8 ZDed9e
j<e
j?d:d; ZEe!d<d= ZFe e
j<d>d?d@ ZGe!dAdB ZHe e
j<dCdDdE ZIe!dFdG ZJe e
j<dHdIdJ ZKe!dKdL ZLe e
j<dMdNdO ZMe!dPdQ ZNe e
j<dRdSdT ZOdUdV ZPe!dWdX ZQe e
j<dYdZd[ ZRd\d] ZSe!d^d_ ZTe e
j<d`dadb ZUdcdd ZVe!dedf ZWe e
j<dgdhdi ZXedje
j<e
j9dkdl ZYdmdn ZZej[eSfej\eYfej]ePfej^eVffD ]\Z_Z`eZe_e` qPeejae e
j<dodpdq Zbeejce e
j<drdsdt Zdeejee e
j<dudvdw Zfeejge e
j<dxdydz Zhe!d{d| Zie e
j<d}d~d Zje!dd Zkeejle e
j<ddd Zmeejne e
j<ddd Zoe!dd Zpeejqdd Zreejsdd Zte!dd Zueejvdd Zweejxdd Zyeejze
j<e
j<dd Z{ee
j<e
j<dd Z|dS )z&
Support for native homogeneous sets.
    N)cached_property)ir)typestypingcgutils)	lower_builtin
lower_castiternext_implimpl_ret_borrowedimpl_ret_new_refimpl_ret_untrackedfor_itercall_lenRefType)	quicksort)slicing)NumbaValueErrorTypingError)overloadoverload_method	intrinsicc                 C   s4   t |}| | }|||}| j|||dS )zx
    Given a set value and type, get its payload structure (as a
    reference, so that mutations are seen by all).
    ref)r   
SetPayloadget_data_typeZ
as_pointerbitcastmake_data_helper)contextbuilderset_typeptrpayload_typeZptrtypayload r#   a/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/numba/cpython/setobj.pyget_payload_struct   s    
r%   c                 C   s   |  t|}| |S )z7
    Return the entry size for the given set type.
    )r   r   SetEntryget_abi_sizeof)r   r   Zlltyr#   r#   r$   get_entry_size#   s    r(   i      Fc                 C   s`   | j }|t}|||fi }| ||}|||f}t| ||}	t|jt	}
|
|	||
S )z.
    Compute the hash of the given value.
    )typing_contextresolve_value_typehashget_call_typeget_functionis_hash_usedr   ConstanttypeFALLBACKselect)r   r   typvalue	typingctxfntysigfnhZis_okfallbackr#   r#   r$   get_hash_value;   s    
r?   c                    s.    fdd}|  t}||  fi }||fS )Nc                    s   t | | |d S Nr   )r?   )r   r   r7   argsr8   r#   r$   implL   s    z'_get_hash_value_intrinsic.<locals>.impl)r.   r/   r0   )r9   r8   rC   r:   r;   r#   rB   r$   _get_hash_value_intrinsicJ   s    
rD   c                 C   s   t |jt}|d||S )z8
    Whether the hash value denotes an empty entry.
    ==)r   r3   r4   EMPTYicmp_unsigned)r   r   r=   emptyr#   r#   r$   is_hash_emptyS   s    rI   c                 C   s   t |jt}|d||S )z9
    Whether the hash value denotes a deleted entry.
    rE   r   r3   r4   DELETEDrG   r   r   r=   Zdeletedr#   r#   r$   is_hash_deletedZ   s    rM   c                 C   s   t |jt}|d||S )z9
    Whether the hash value denotes an active entry.
    <rJ   rL   r#   r#   r$   r2   a   s    r2   c                     sH   t dd  D s td  t  fdd D sDtd  d S )Nc                 S   s   g | ]}t |tjqS r#   )
isinstancer   Set).0r7   r#   r#   r$   
<listcomp>k       z!check_all_set.<locals>.<listcomp>z All arguments must be Sets, got c                    s   g | ]} d  j |j kqS )r   dtype)rQ   srA   r#   r$   rR   n   rS   z'All Sets must be of the same type, got )allr   rW   r#   rW   r$   check_all_setj   s    rY   SetLoopindexentrydo_breakc                   @   s   e Zd Zdd Zedd Zejdd Zedd Zejdd Zed	d
 Zejdd
 Zedd Z	e	jdd Z	edd Z
e
jdd Z
edd Zedd Zdd Zd ddZejd!ddZejdd ZdS )"_SetPayloadc                 C   s<   t ||||}|| _|| _|| _|| _|d| _|| _d S )Nentries)r%   _context_builder_ty_payloadZ_get_ptr_by_name_entries_ptr)selfr   r   r   r    r"   r#   r#   r$   __init__w   s    z_SetPayload.__init__c                 C   s   | j jS Nrd   maskrg   r#   r#   r$   rk      s    z_SetPayload.maskc                 C   s   || j _d S ri   rj   rg   r8   r#   r#   r$   rk      s    c                 C   s   | j jS ri   rd   usedrl   r#   r#   r$   ro      s    z_SetPayload.usedc                 C   s   || j _d S ri   rn   rm   r#   r#   r$   ro      s    c                 C   s   | j jS ri   rd   fillrl   r#   r#   r$   rq      s    z_SetPayload.fillc                 C   s   || j _d S ri   rp   rm   r#   r#   r$   rq      s    c                 C   s   | j jS ri   rd   fingerrl   r#   r#   r$   rs      s    z_SetPayload.fingerc                 C   s   || j _d S ri   rr   rm   r#   r#   r$   rs      s    c                 C   s   | j jS ri   rd   dirtyrl   r#   r#   r$   ru      s    z_SetPayload.dirtyc                 C   s   || j _d S ri   rt   rm   r#   r#   r$   ru      s    c                 C   s   | j S )z>
        A pointer to the start of the entries array.
        )re   rl   r#   r#   r$   r`      s    z_SetPayload.entriesc                 C   s   | j S )zC
        A pointer to the start of the NRT-allocated area.
        )rf   rl   r#   r#   r$   r       s    z_SetPayload.ptrc                 C   s2   t | j| j|}| jj| jt| j|d}|S )z)
        Get entry number *idx*.
        r   )	r   geprb   re   ra   r   r   r&   rc   )rg   idxZ	entry_ptrr]   r#   r#   r$   	get_entry   s    

z_SetPayload.get_entryFc                    s  
j 
jj}
j}
jj}j}|tj	}|
|||fi }	||	t|d}
t|d}t}t|}r|dtd}d dd} 	
fdd	}tt|tF |}|| ||
}||}|| W d
   n1 sL0    Y  | | |}|| |}||}|
||}|||}|| || | W d
   n1 s0    Y  X rH|}}d|||}|| | W d
   n1 sh0    Y    | W d
   n1 s0    Y  | tdd}| tj!  | tj" ||fS )ag  
        Lookup the *item* with the given hash values in the entries.

        Return a (found, entry index) tuple:
        - If found is true, <entry index> points to the entry containing
          the item.
        - If found is false, <entry index> points to the empty entry that
          the item can be written to (only if *for_insert* is true)
              r)   zlookup.bodyzlookup.foundzlookup.not_foundz
lookup.endc              	      s0  
 | }|j}d|T 	|jf}|   W d   n1 s`0    Y  W d   n1 s~0    Y  t|  W d   n1 s0    Y  r,t|> }	d|| |}
| W d   n1 s"0    Y  dS )zO
            Check entry *i* against the value being searched for.
            rE   N)rx   r/   if_thenrG   keybranchrI   rM   loadr6   store)ir]   Z
entry_hasheqjZbb_foundZbb_not_foundr   r   Zeqfn
for_insertZ
free_indexZfree_index_sentinelr=   itemrg   r#   r$   check_entry   s    
F(
z(_SetPayload._lookup.<locals>.check_entryNrE   found)#ra   rb   r4   rk   rc   rU   r-   r.   operatorr   r0   r1   r   r3   r   alloca_once_valueand_append_basic_block	for_rangeLINEAR_PROBESr~   addr   r}   
goto_blocklshrmulr6   rG   position_at_endphiZIntTypeZadd_incomingtrue_bit	false_bit)rg   r   r=   r   intp_trk   rU   Ztyctxr:   r;   oneZfiveZperturbr\   bb_bodybb_endr   r   pr   r   r#   r   r$   _lookup   sp    






 
,


*

**
z_SetPayload._lookupNc              	   c   s   | j }| j}|tj}t|d}|| j|}t	j
|||dl}| |j}t|||j}	||	( t|j||jd}
|
V  W d   n1 s0    Y  W d   n1 s0    Y  dS )zG
        Iterate over the payload's entries.  Yield a SetLoop.
        ry   startr[   N)ra   rb   get_value_typer   intpr   r3   r   rk   r   r   rx   r\   r2   r/   r{   rZ   r^   )rg   r   r   r   r   r   sizeZ
range_loopr]   is_usedloopr#   r#   r$   _iterate7  s    z_SetPayload._iteratec                 c   s  | j }| j}|tj}t|d}t|d}| j}|d}|d}t	
|| j}	|| ||` ||	}
||||
|}
||
|	 | |
}t|||j}|||| W d   n1 s0    Y  || ||	}
|
| _| |
V  dS )z
        Yield a random entry from the payload.  Caller must ensure the
        set isn't empty, otherwise the function won't end.
        r   ry   Znext_entry_bodyZnext_entry_endN)ra   rb   r   r   r   r   r3   rk   r   r   r   rs   r}   r   r~   r   r   r   rx   r2   r/   cbranchr   )rg   r   r   r   zeror   rk   r   r   r\   r   r]   r   r#   r#   r$   _next_entryK  s*    




,

z_SetPayload._next_entry)F)N)__name__
__module____qualname__rh   propertyrk   setterro   rq   rs   ru   r`   r    rx   r   
contextlibcontextmanagerr   r   r#   r#   r#   r$   r_   u   s>   	













vr_   c                   @   s  e Zd Zdd Zedd Zedd Zedd Zed	d
 Zedd Z	e	j
dd Z	dd Zdd ZdUddZdVddZdWddZdXddZdYddZdZd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d[d2d3Zd4d5 Zd6d7 Zed\d9d:Z ed]d;d<Z!ed=d> Z"ed?d@ Z#dAdB Z$dCdD Z%dEdF Z&dGdH Z'd^dIdJZ(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSdT Z-d8S )_SetInstancec                 C   s2   || _ || _|| _t||| _||||| _d S ri   )ra   rb   rc   r(   
_entrysizemake_helper_set)rg   r   r   r   set_valr#   r#   r$   rh   v  s
    zSetInstance.__init__c                 C   s   | j jS ri   )rc   rU   rl   r#   r#   r$   rU   }  s    zSetInstance.dtypec                 C   s.   | j }| j}| j j|| j}t||| j|S )z/
        The _SetPayload for this set.
        )ra   rb   nrtmeminfo_datameminfor_   rc   )rg   r   r   r    r#   r#   r$   r"     s    zSetInstance.payloadc                 C   s
   | j  S ri   )r   	_getvaluerl   r#   r#   r$   r8     s    zSetInstance.valuec                 C   s   | j jS ri   )r   r   rl   r#   r#   r$   r     s    zSetInstance.meminfoc                 C   s   | j jS ri   r   parentrl   r#   r#   r$   r     s    zSetInstance.parentc                 C   s   || j _d S ri   r   rm   r#   r#   r$   r     s    c                 C   s   | j jS )z<
        Return the number of elements in the size.
        )r"   ro   rl   r#   r#   r$   get_size  s    zSetInstance.get_sizec                 C   s    | j jr|rtjntj| j_d S ri   )rc   Z	reflectedr   r   r   r"   ru   rg   valr#   r#   r$   	set_dirty  s    zSetInstance.set_dirtyTc                 C   s   | j }| j}|j}||_| | ||_|j}	t|	jd}
|	|	|
 }	|_|j
t|||dd  |	|j|
|_W d    n1 s0    Y  |r| |	 | d d S )Nry   TZlikely)ra   rb   r/   incref_valuer|   ro   r   r3   r4   r   r{   rI   rq   upsizer   )rg   r"   r]   r   r=   	do_resizer   r   old_hashro   r   r#   r#   r$   
_add_entry  s     
.
zSetInstance._add_entryc              	   C   s  | j }| j}|j||dd\}}	||}
||
 ||	}|j}||_|rZ| | ||_|j	}t
|jd}||| }|_	|jt|||dd  ||j||_W d    n1 s0    Y  |r| | | d W d    n1 s0    Y  d S )NTr   ry   r   )ra   rb   r   not_r{   rx   r/   r   r|   ro   r   r3   r4   r   rI   rq   r   r   )rg   r"   r   r=   r   	do_increfr   r   r   r   	not_foundr]   r   ro   r   r#   r#   r$   _add_key  s*    


.
zSetInstance._add_keyc                 C   sf   t |jjt|_|r"| |j |j}t |jd}| j	|| }|_|rX| 
| | d d S )Nry   T)r   r3   r/   r4   rK   decref_valuer|   ro   rb   subdownsizer   )rg   r"   r]   r   	do_decrefro   r   r#   r#   r$   _remove_entry  s    
zSetInstance._remove_entryc           
      C   sb   | j }| j}|||\}}||( ||}	| ||	| W d    n1 sT0    Y  |S ri   )ra   rb   r   r{   rx   r   )
rg   r"   r   r=   r   r   r   r   r   r]   r#   r#   r$   _remove_key  s    
,zSetInstance._remove_keyc                 C   s8   | j }| j}| j}t||| jj|}| |||| d S ri   )ra   rb   r"   r?   rc   rU   r   )rg   r   r   r   r   r"   r=   r#   r#   r$   r     s
    zSetInstance.addc                 C   s6   | j }| j}| j}| ||||}| |||| dS )z`A version of .add for use inside functions following Python calling
        convention.
        N)ra   rb   r"   _pyapi_get_hash_valuer   )rg   pyapir   r   r   r   r"   r=   r#   r#   r$   	add_pyapi  s
    zSetInstance.add_pyapic                 C   s   | j jg}tj}dd }|g}tj|g|R  }	|||	|\}
}|j|
dd ||	  W d   n1 st0    Y  |S )z=Python API compatible version of `get_hash_value()`.
        c                 S   s   t | S ri   )rD   )r   r#   r#   r$   wrapper  s    z2SetInstance._pyapi_get_hash_value.<locals>.wrapperFr   N)
rc   rU   r   r   r   	signatureZcall_jit_coder{   retZget_null_object)rg   r   r   r   r   argtypesZrestyr   rA   r;   Zis_errorretvalr#   r#   r$   r     s    
,z!SetInstance._pyapi_get_hash_valuec                 C   s8   | j }| j}| j}t||| jj|}|||\}}|S ri   )ra   rb   r"   r?   rc   rU   r   )rg   r   r   r   r"   r=   r   r   r#   r#   r$   contains  s    zSetInstance.containsc                 C   s6   | j }| j}| j}t||| jj|}| |||}|S ri   )ra   rb   r"   r?   rc   rU   r   )rg   r   r   r   r"   r=   r   r#   r#   r$   discard   s    zSetInstance.discardc                 C   s|   | j }| j}|| jj}t||}| j}| .}|	|j
| | j||dd W d    n1 sh0    Y  ||S )NF)r   )ra   rb   r   rc   rU   r   Zalloca_oncer"   r   r   r|   r   r~   )rg   r   r   Zltyr|   r"   r]   r#   r#   r$   pop)  s    
.zSetInstance.popc                 C   s<   | j }| j}|tj}t|t}| | | 	d d S )NT)
ra   rb   r   r   r   r   r3   MINSIZE_replace_payloadr   )rg   r   r   r   minsizer#   r#   r$   clear8  s    
zSetInstance.clearc              
   C   s  | j }| j}| j}|j}|j}t| ||| jd}|d||}|j|ddV\}}	|^ |	|}
|j
||
dd  |j|td W d   n1 s0    Y  W d   n1 s0    Y  |	 | |||}||}
|j
||
dd  |j|td W d   n1 s"0    Y  |j}| ,}|j}|j||j|jdd W d   n1 sn0    Y  W d   n1 s0    Y  W d   n1 s0    Y  |S )z,
        Return a copy of this set.
        NrE   Tr   F)zcannot copy setr   )ra   rb   r"   ro   rq   r4   rc   rG   if_else_copy_payloadr{   r   	call_convreturn_user_excMemoryErrorchoose_alloc_size_allocate_payloadr   r]   r   r|   r/   )rg   r   r   r"   ro   rq   otherZno_deleted_entriesZif_no_deletedZ
if_deletedoknentriesother_payloadr   r]   r#   r#   r$   copyA  s:    

@

$
fzSetInstance.copyc           
   	   C   s   | j }| j}| j}|j}| j}|j}||j|j\}}	||	|  | j
||dd W d   n1 sr0    Y  W d   n1 s0    Y  | |j dS )z9
        In-place intersection with *other* set.
        Fr   N)ra   rb   r"   r   r]   r   r|   r/   r{   r   r   r   ro   )
rg   r   r   r   r"   r   r   r]   r   _r#   r#   r$   	intersecth  s    
LzSetInstance.intersectc                 C   sl   | j }| j}| j}|j}| ,}|j}| j||j|jdd W d   n1 sR0    Y  | |j	 dS )z7
        In-place difference with *other* set.
        Fr   N)
ra   rb   r"   r   r]   r   r|   r/   r   ro   )rg   r   r   r   r"   r   r   r]   r#   r#   r$   
differencez  s    
4zSetInstance.differencec              
   C   s  | j }| j}|j}| }|jj}|jj}| j}|j||dd\}	}
||
}|	|	|\}}|  | j
||dd W d   n1 s0    Y  |  | |||| W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s0    Y  | | jj dS )zA
        In-place symmetric difference with *other* set.
        Tr   Fr   N)ra   rb   r"   r   r]   r|   r/   r   rx   r   r   r   r   ro   )rg   r   r   r   r   r   r|   r=   r"   r   r   r]   Z	if_commonZif_not_commonr#   r#   r$   symmetric_difference  s    

.jz SetInstance.symmetric_differenceFc                 C   s\  | j }| j}| j}|j}|r dnd}t|tj}||||j|j\}	}
|
 |	tj
| W d    n1 sx0    Y  |	 | p}|j}||j|j\}}|||& |	tj
| |  W d    n1 s0    Y  W d    n1 s0    Y  W d    n1 s(0    Y  W d    n1 sH0    Y  ||S )NrN   <=)ra   rb   r"   r   r   r   r   rG   ro   r   r   r   r]   r   r|   r/   r{   r   r^   r~   )rg   r   strictr   r   r"   r   cmp_opresZ
if_smaller	if_largerr   r]   r   r   r#   r#   r$   issubset  s(    ,
zSetInstance.issubsetc              	      s   | j }| j | j}|j}t tj fdd}  d|j|jp\}}| ||| W d    n1 sv0    Y  | ||| W d    n1 s0    Y  W d    n1 s0    Y   	S )Nc              	      s   |   j}|j}||j|j\}} |&  tj |	  W d    n1 sZ0    Y  W d    n1 sx0    Y  d S ri   )
r   r]   r   r|   r/   r{   r   r   r   r^   )ZsmallerZlargerr   r]   r   r   r   r   r#   r$   check  s    
z%SetInstance.isdisjoint.<locals>.check>)
ra   rb   r"   r   r   r   r   rG   ro   r~   )rg   r   r   r"   r   r   r   	otherwiser#   r   r$   
isdisjoint  s    	(FzSetInstance.isdisjointc                 C   sN  | j }| j}| j}|j}t|tj}||d|j|j\}}| |	 p}	|	j
}
||
j|
j\}}|||& |tj| |	  W d    n1 s0    Y  W d    n1 s0    Y  W d    n1 s0    Y  | |tj| W d    n1 s0    Y  W d    n1 s:0    Y  ||S )NrE   )ra   rb   r"   r   r   r   r   rG   ro   r   r]   r   r|   r/   r{   r   r   r   r^   r~   )rg   r   r   r   r"   r   r   Zif_same_sizer   r   r]   r   r   r#   r#   r$   equals  s&    
bNzSetInstance.equalsNc           	      C   sf   | tj}|du r"t|t}n$t|tr8t||}| |||}| |||d}|	|}||fS )z
        Allocate a SetInstance with its storage.
        Return a (ok, instance) tuple where *ok* is a LLVM boolean and
        *instance* is a SetInstance object (the object's contents are
        only valid when *ok* is true).
        N)
r   r   r   r   r3   r   rO   intr   r   )	clsr   r   r   nitemsr   r   rg   r   r#   r#   r$   allocate_ex  s    

zSetInstance.allocate_exc                 C   s\   |  ||||\}}|j||dd  |j|td W d   n1 sN0    Y  |S )z
        Allocate a SetInstance with its storage.  Same as allocate_ex(),
        but return an initialized *instance*.  If allocation failed,
        control is transferred to the caller using the target's current
        call convention.
        Fr   )zcannot allocate setN)r   r{   r   r   r   r   )r   r   r   r   r   r   rg   r#   r#   r$   allocate  s    
"zSetInstance.allocatec                 C   s<   | |||d}||j _|tj|j _|j|||j |S )z
        Allocate a new set instance pointing to an existing payload
        (a meminfo pointer).
        Note the parent field has to be filled by the caller.
        N)	r   r   get_constant_nullr   pyobjectr   r   increfr8   )r   r   r   r   r   rg   r#   r#   r$   from_meminfo  s
    zSetInstance.from_meminfoc              	   C   s  |j }t|d}t|t}|||}t||}|d}	|d}
||	 |	|	 |
|}|d||}|j|dd ||
 W d   n1 s0    Y  |||}||| ||	 W d   n1 s0    Y  ||
 |
|S )zT
        Choose a suitable number of entries for the given number of items.
        ry   calcsize.bodycalcsize.end>=Fr   N)r4   r   r3   r   shlr   r   r   r}   r   r~   rG   r{   r   r   )r   r   r   r   r   r   r   min_entriesZsize_pr   r   r   Zis_large_enoughZ	next_sizer#   r#   r$   r   $  s$    



((
zSetInstance.choose_alloc_sizec              	   C   sZ  | j }| j}|j}t|d}t|d}| j}|||}||j|}	|	d||	}
|j
|
dd t||	}|d}|d}|| ||N ||}|||}||| |	d||}|||| W d   n1 s0    Y  || ||}tr(||d	||	|| | ||d
 W d   n1 sL0    Y  dS )zs
        When adding to the set, ensure it is properly sized for the given
        number of used entries.
        ry      r  Fr   r  r  NzKupsize to %zd items: current size = %zd, min entries = %zd, new size = %zd
zcannot grow set)ra   rb   r4   r   r3   r"   r  r   rk   rG   r{   r   r   r   r}   r   r~   r   r   r   DEBUG_ALLOCSprintf_resize)rg   r   r   r   r   r   twor"   r  r   need_resize
new_size_pr   r   new_sizeis_too_smallr#   r#   r$   r   C  s8    



,

zSetInstance.upsizec              
   C   s  | j }| j}|j}t|d}t|d}t|t}| j}|||}	||	d|	||	|}	||	|}
|
|j|}||	d|
||	d||}|j|dd t||}|d}|d	}|| || ||}|||}|	d
|	|}|| || W d   n1 s20    Y  ||| || W d   n1 sh0    Y  || ||}tr||d|||	| | ||d W d   n1 s0    Y  dS )zw
        When removing from the set, ensure it is properly sized for the given
        number of used entries.
        ry   r  r  r   rN   Fr   r  r  r   NzMdownsize to %zd items: current size = %zd, min entries = %zd, new size = %zd
zcannot shrink set)ra   rb   r4   r   r3   r   r"   r  r6   rG   r   rk   r   r{   r   r   r   r}   r   r~   r   r   r   r	  r
  r  )rg   r   r   r   r   r   r  r   r"   r  max_sizer   r  r  r   r   r  r  r#   r#   r$   r   q  sL    



**

zSetInstance.downsizec           
      C   s   | j }| j}|}| j|dd}|j||dd" |j|t|f W d   n1 sZ0    Y  | j}|	 .}|j
}	| j||	j|	jddd W d   n1 s0    Y  | |j dS )zw
        Resize the payload to the given number of entries.

        CAUTION: *nentries* must be a power of 2!
        TreallocFr   N)r   r   )ra   rb   r   r{   r   r   r   r   r"   r   r]   r   r|   r/   _free_payloadr    )
rg   r"   r   errmsgr   r   Zold_payloadr   r   r]   r#   r#   r$   r    s    
"
$zSetInstance._resizec                 C   s   | j }| j}| j "}|j}| |j W d   n1 s>0    Y  | | jj | j	|dd}|j
||dd  |j|td W d   n1 s0    Y  dS )z
        Replace the payload with a new empty payload with the given number
        of entries.

        CAUTION: *nentries* must be a power of 2!
        NTr  Fr   )zcannot reallocate set)ra   rb   r"   r   r]   r   r|   r  r    r   r{   r   r   r   r   )rg   r   r   r   r   r]   r   r#   r#   r$   r     s    *
zSetInstance._replace_payloadc              
   C   sn  | j }| j}t|tj}|tj}t	|d}t	|d}|
t| j}	||	}
| j}|
|8 }
t||t	||t	||
\}}|j|dd |tj| W d   n1 s0    Y  |j||ddt |r| jj}|jj|||d}t||}n4| ||j}|j||||tj}t||}|j|dd\}}| |tj| W d   n1 s0    Y  | |s|| j_|tj | j_!| j"}t#||j$|d ||_%||_&||_'|(||}||_)t*r|+|d	||j$| W d   n1 s0    Y  W d   n1 s:0    Y  W d   n1 sZ0    Y  ||S )
z
        Allocate and initialize payload for the given number of entries.
        If *realloc* is True, the existing meminfo is reused.

        CAUTION: *nentries* must be a power of 2!
        r   ry   Fr   NT)r      .allocated %zd bytes for set at %p: mask = %zd
),ra   rb   r   r   r   r   r   r   r   r3   r   r   rc   r'   r   Zmuladd_with_overflowr{   r   r   r~   r   r   r   Zmeminfo_varsize_alloc_uncheckedis_null	_imp_dtormodule"meminfo_new_varsize_dtor_uncheckedr   	voidptr_tr   r   r   r   r"   memsetr    ro   rq   rs   r   rk   r	  r
  )rg   r   r  r   r   r   r   r   r   r!   payload_size
entry_size	allocsizeZovfr   r    alloc_okdtorif_errorif_okr"   Znew_maskr#   r#   r$   r     sh    


,.dzSetInstance._allocate_payloadc                 C   s   | j j| j| j| dS )z9
        Free an allocated old payload at *ptr*.
        N)ra   r   Zmeminfo_varsize_freerb   r   )rg   r    r#   r#   r$   r  "  s    zSetInstance._free_payloadc                 C   s6  | j }| j}t|tj}|tj}t	|d}t	|d}|
t| j}||}	| j}
|	|
8 }	|j}|||}|t	||	|t	||
|}|j||ddf | ||j}|j||||tj}t||}|j|dd \}}| |tj| W d   n1 s*0    Y  | || j_| j }|j!|_!|j"|_"||_#||_t$||j%|j%||
 |& }| '|j(j) W d   n1 s0    Y  t*r|+|d||j,| W d   n1 s0    Y  W d   n1 s0    Y  W d   n1 s"0    Y  ||S )z7
        Raw-copy the given payload into self.
        r   ry   Tr   FNr  )-ra   rb   r   r   r   r   r   r   r   r3   r   r   rc   r'   r   rk   r   r   r{   r~   r  r  r   r  r   r  r  r   r   r   r   r   r"   ro   rq   rs   Z
raw_memcpyr`   r   r   r]   r|   r	  r
  r    )rg   Zsrc_payloadr   r   r   r   r   r   r!   r  r  rk   r   r   r"  r   r!  r#  r$  r"   r   r#   r#   r$   r   (  sZ    
.

.dzSetInstance._copy_payloadc                 C   s   t j}|tj}tt |||g}d| jj	 }t j
|||d}|jrd|_t| }t||| j|jd }	|	 ,}
|
j}|j|| jj	|j W d   n1 s0    Y  |  |S )z Define the dtor for set
        z
.dtor.set.)nameZlinkonce_odrr   N)r   r  r   r   Zsize_tr   FunctionTypeZVoidTyperc   rU   Zget_or_insert_functionZis_declarationlinkageZ	IRBuilderr   r_   rA   r   r]   r   decrefr|   Zret_void)rg   r   r  Z	llvoidptrZllsize_tr:   fnamer<   r   r"   r   r]   r#   r#   r$   r  i  s"    
4zSetInstance._imp_dtorc                 C   s   | j j| j| jj| dS )z Incref an element value
        N)ra   r   r  rb   rc   rU   r   r#   r#   r$   r     s    zSetInstance.incref_valuec                 C   s   | j j| j| jj| dS )z Decref an element value
        N)ra   r   r(  rb   rc   rU   r   r#   r#   r$   r     s    zSetInstance.decref_value)T)TT)TT)T)T)T)F)N)N)F).r   r   r   rh   r   rU   r"   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r  r   r   r   r  r   r   r  r   r  r   r   r#   r#   r#   r$   r   t  sf   











			'


.<
CAr   c                   @   sZ   e Zd Zdd Zedd Zedd Zedd Zed	d
 Z	e	j
dd
 Z	dd ZdS )SetIterInstancec                 C   sL   || _ || _|| _||||| _| j j|| j}t||| jj	|| _
d S ri   )ra   rb   rc   r   _iterr   r   r   r_   	containerrd   )rg   r   r   	iter_typeZiter_valr    r#   r#   r$   rh     s    zSetIterInstance.__init__c                 C   sJ   t |||j|}| |||d }|tjd}t|||j_|j	|j_	|S r@   )
r   r-  get_constantr   r   r   r   r,  r\   r   )r   r   r   r.  r   Zset_instrg   r\   r#   r#   r$   from_set  s    
zSetIterInstance.from_setc                 C   s
   | j  S ri   )r,  r   rl   r#   r#   r$   r8     s    zSetIterInstance.valuec                 C   s   | j jS ri   )r,  r   rl   r#   r#   r$   r     s    zSetIterInstance.meminfoc                 C   s   | j | jjS ri   )rb   r~   r,  r\   rl   r#   r#   r$   r\     s    zSetIterInstance.indexc                 C   s   | j || jj d S ri   )rb   r   r,  r\   rm   r#   r#   r$   r\     s    c                 C   s   | j }| j}t|jd}|  |j|dD}|j}|  |	|j
 | j|j || _ |  W d    n1 sx0    Y  d S )Nry   r   )r\   rd   r   r3   r4   Zset_exhaustedr   r]   Z	set_validZyield_r|   rb   r   r^   )rg   resultr\   r"   r   r   r]   r#   r#   r$   iternext  s    zSetIterInstance.iternextN)r   r   r   rh   r*  r0  r   r8   r   r\   r   r2  r#   r#   r#   r$   r+    s   




r+  c              	   C   s   t |}t| |||}|dkrt||}t||}| tj|}t	||2}	|
t||d|	j}
||
 W d   n1 s0    Y  t| |||jS )zD
    Build a set of the given type, containing the given items.
    r   N)lenr   r   r   Z
pack_arrayr   r/  r   r   r   r~   rv   r\   r   r   r8   )r   r   r   itemsr   instarrayZ	array_ptrcountr   r   r#   r#   r$   	build_set  s    (r8  c                 C   s$   |j }t| ||}t| |||jS ri   )return_typer   r   r   r8   )r   r   r;   rA   r   r5  r#   r#   r$   set_empty_constructor  s    r:  c           
      C   s   |j }|j\}|\}t| |||}t| |||}t| |||0}	||	j | j	||j
|	j W d    n1 sv0    Y  t| |||jS ri   )r9  rA   r   r   r   r   r   r8   r   r(  rU   r   )
r   r   r;   rA   r   
items_typer4  nr5  r   r#   r#   r$   set_constructor  s    2r=  c                 C   s    t | ||jd |d }| S r@   )r   rA   r   r   r   r;   rA   r5  r#   r#   r$   set_len  s    r?  c                 C   s&   t | ||jd |d }||d S Nr   ry   )r   rA   r   r>  r#   r#   r$   in_set  s    rA  Zgetiterc                 C   s(   t | ||j|d }t| ||j|jS r@   )r+  r0  r9  r
   r8   r>  r#   r#   r$   getiter_set  s    rB  r2  c                 C   s&   t | ||jd |d }|| d S r@   )r+  rA   r2  )r   r   r;   rA   r1  r5  r#   r#   r$   iternext_listiter	  s    rC  zset.addc                 C   s2   t | ||jd |d }|d }|| |  S r@  )r   rA   r   get_dummy_valuer   r   r;   rA   r5  r   r#   r#   r$   set_add  s    
rF  c                 C   s   t ||}dd }||fS )Nc                 S   s2   t | ||jd |d }|d }|| |  S r@  )r   rA   r   rD  rE  r#   r#   r$   set_discard"  s    
z!_set_discard.<locals>.set_discardr   none)r9   rV   r   r;   rG  r#   r#   r$   _set_discard  s    rJ  r   c                 C   s   dd S )Nc                 S   s
   t | |S ri   )rJ  rV   r   r#   r#   r$   <lambda>.  rS   z ol_set_discard.<locals>.<lambda>r#   rK  r#   r#   r$   ol_set_discard,  s    rM  c                 C   s   | |}dd }||fS )Nc                 S   sn   t | ||jd |d }|jj}|jt||dd  | j|t	d W d    n1 s\0    Y  |
 S )Nr   Fr   )zset.pop(): empty set)r   rA   r"   ro   r{   r   r  r   r   KeyErrorr   )r   r   r;   rA   r5  ro   r#   r#   r$   set_pop5  s    
"z_set_pop.<locals>.set_poprT   )r9   rV   r;   rO  r#   r#   r$   _set_pop1  s    
	rP  r   c                 C   s   dd S )Nc                 S   s   t | S ri   )rP  rV   r#   r#   r$   rL  C  rS   zol_set_pop.<locals>.<lambda>r#   rQ  r#   r#   r$   
ol_set_popA  s    rR  c                 C   s   t ||}dd }||fS )Nc                 S   sv   t | ||jd |d }|d }||}|j||dd  | j|td W d    n1 sd0    Y  |  S )Nr   ry   Fr   )zset.remove(): key not in set)	r   rA   r   r{   r   r   r   rN  rD  )r   r   r;   rA   r5  r   r   r#   r#   r$   
set_removeJ  s    

"z_set_remove.<locals>.set_removerH  )r9   rV   r   r;   rS  r#   r#   r$   _set_removeF  s    
rT  removec                 C   s   | j |krdd S d S )Nc                 S   s
   t | |S ri   )rT  rK  r#   r#   r$   rL  Z  rS   zol_set_remove.<locals>.<lambda>rT   rK  r#   r#   r$   ol_set_removeW  s    
rV  c                 C   s   t |}dd }||fS )Nc                 S   s(   t | ||jd |d }|  |  S r@   )r   rA   r   rD  r>  r#   r#   r$   	set_clearc  s    z_set_clear.<locals>.set_clearrH  )r9   rV   r;   rW  r#   r#   r$   
_set_clear_  s    
rX  r   c                 C   s   dd S )Nc                 S   s   t | S ri   )rX  rQ  r#   r#   r$   rL  m  rS   zol_set_clear.<locals>.<lambda>r#   rQ  r#   r#   r$   ol_set_cleark  s    rY  c                 C   s   ||}dd }||fS )Nc                 S   s2   t | ||jd |d }| }t| ||j|jS r@   )r   rA   r   r   r9  r8   r   r   r;   rA   r5  r   r#   r#   r$   set_copyt  s    z_set_copy.<locals>.set_copyr#   )r9   rV   r;   r[  r#   r#   r$   	_set_copyp  s    r\  r   c                 C   s   dd S )Nc                 S   s   t | S ri   )r\  rQ  r#   r#   r$   rL  ~  rS   zol_set_copy.<locals>.<lambda>r#   rQ  r#   r#   r$   ol_set_copy|  s    r]  c                 C   sB   t | ||jd |d }t | ||jd |d }|| |  S r@  )r   rA   r   rD  rZ  r#   r#   r$   set_difference_update  s    
r^  c                 C   s   t ||}|tfS ri   )r   rI  r^  r9   abr;   r#   r#   r$   _set_difference_update  s    rb  difference_updatec                 C   s   t | | dd S )Nc                 S   s
   t | |S ri   )rb  r`  ra  r#   r#   r$   rL    rS   z,set_difference_update_impl.<locals>.<lambda>rY   rd  r#   r#   r$   set_difference_update_impl  s    
rf  c                 C   sB   t | ||jd |d }t | ||jd |d }|| |  S r@  )r   rA   r   rD  rZ  r#   r#   r$   set_intersection_update  s    
rg  c                 C   s   t ||}|tfS ri   )r   rI  rg  r_  r#   r#   r$   _set_intersection_update  s    rh  intersection_updatec                 C   s   t | | dd S )Nc                 S   s
   t | |S ri   )rh  rd  r#   r#   r$   rL    rS   z.set_intersection_update_impl.<locals>.<lambda>re  rd  r#   r#   r$   set_intersection_update_impl  s    
rj  c                 C   sB   t | ||jd |d }t | ||jd |d }|| |  S r@  )r   rA   r   rD  rZ  r#   r#   r$   set_symmetric_difference_update  s    
rk  c                 C   s   t ||}|tfS ri   )r   rI  rk  r_  r#   r#   r$    _set_symmetric_difference_update  s    rl  symmetric_difference_updatec                 C   s   t | | dd S )Nc                 S   s
   t | |S ri   )rl  rd  r#   r#   r$   rL    rS   z6set_symmetric_difference_update_impl.<locals>.<lambda>re  rd  r#   r#   r$   $set_symmetric_difference_update_impl  s    
rn  z
set.updatec                 C   s   t | ||jd |d }|jd }|d }t| |||}|d urZ||jj|}|| t| |||D}	| ||	j	|j
|j
}
||
 | j||j
|	j	 W d    n1 s0    Y  |d ur||jj |  S r@  )r   rA   r   r   r"   ro   r   r   castr8   rU   r   r(  r   rD  )r   r   r;   rA   r5  r;  r4  r<  r  r   Zcastedr#   r#   r$   
set_update  s    


2rp  c                    s(   t fdd t|  fdd}d S )Nc                    s   |||} fdd}||fS )Nc                    s:   |j |jd ksJ  | ||| t| ||jd |d S r@   )r9  rA   r
   )r   r   r;   rA   rC   r#   r$   codegen  s    z>gen_operator_impl.<locals>._set_operator_intr.<locals>.codegenr#   r9   r`  ra  r;   rr  rq  r#   r$   _set_operator_intr  s    
z-gen_operator_impl.<locals>._set_operator_intrc                    s   t | |  fddS )Nc                    s
    | |S ri   r#   rd  rt  r#   r$   rL    rS   z=gen_operator_impl.<locals>._ol_set_operator.<locals>.<lambda>re  rd  ru  r#   r$   _ol_set_operator  s    
z+gen_operator_impl.<locals>._ol_set_operator)r   r   )oprC   rv  r#   )rt  rC   r$   gen_operator_impl  s    rx  r   c                 C   s   t | | dd }|S )Nc                 S   s   |   }|| |S ri   )r   rc  r`  ra  rV   r#   r#   r$   difference_impl  s    
z,impl_set_difference.<locals>.difference_implre  )r`  ra  rz  r#   r#   r$   impl_set_difference  s    
r{  intersectionc                 C   s   t | | dd }|S )Nc                 S   s@   t | t |k r&|  }|| |S | }||  |S d S ri   )r3  r   ri  ry  r#   r#   r$   intersection_impl  s    

z+set_intersection.<locals>.intersection_implre  )r`  ra  r}  r#   r#   r$   set_intersection  s    

r~  r   c                 C   s   t | | dd }|S )Nc                 S   s@   t | t |kr&|  }|| |S | }||  |S d S ri   )r3  r   rm  ry  r#   r#   r$   symmetric_difference_impl  s    

z;set_symmetric_difference.<locals>.symmetric_difference_implre  )r`  ra  r  r#   r#   r$   set_symmetric_difference  s    

r  unionc                 C   s   t | | dd }|S )Nc                 S   s@   t | t |kr&|  }|| |S | }||  |S d S ri   )r3  r   updatery  r#   r#   r$   
union_impl(  s    

zset_union.<locals>.union_implre  )r`  ra  r  r#   r#   r$   	set_union#  s    

r  c                 C   s   t ||}dd }||fS )Nc                 S   s:   t | ||jd |d }t | ||jd |d }||S r@  )r   rA   r   rZ  r#   r#   r$   rr  ;  s    z _set_isdisjoint.<locals>.codegenr   booleanrs  r#   r#   r$   _set_isdisjoint7  s    r  r   c                 C   s   t | | dd S )Nc                 S   s
   t | |S ri   )r  rd  r#   r#   r$   rL  H  rS   z set_isdisjoint.<locals>.<lambda>re  rd  r#   r#   r$   set_isdisjointD  s    
r  c                 C   s   t ||}dd }||fS )Nc                 S   s:   t | ||jd |d }t | ||jd |d }||S r@  r   rA   r   rZ  r#   r#   r$   rr  O  s    z_set_issubset.<locals>.codegenr  rs  r#   r#   r$   _set_issubsetK  s    r  r   c                 C   s   t | | dd S )Nc                 S   s
   t | |S ri   )r  rd  r#   r#   r$   rL  \  rS   zset_issubset.<locals>.<lambda>re  rd  r#   r#   r$   set_issubsetW  s    
r  
issupersetc                 C   s   t | | dd }|S )Nc                 S   s
   | | S ri   )r   rd  r#   r#   r$   superset_impld  s    z%set_issuperset.<locals>.superset_implre  )r`  ra  r  r#   r#   r$   set_issuperset_  s    
r  c                 C   s   t ||}dd }||fS )Nc                 S   s:   t | ||jd |d }t | ||jd |d }||S r@  )r   rA   r   rZ  r#   r#   r$   rr  m  s    z_set_eq.<locals>.codegenr  rs  r#   r#   r$   _set_eqi  s    r  c                 C   s   t | | dd S )Nc                 S   s
   t | |S ri   )r  rd  r#   r#   r$   rL  y  rS   zset_eq.<locals>.<lambda>re  rd  r#   r#   r$   set_equ  s    
r  c                 C   s   t | | dd }|S )Nc                 S   s
   | |k S ri   r#   rd  r#   r#   r$   ne_impl  s    zset_ne.<locals>.ne_implre  )r`  ra  r  r#   r#   r$   set_ne{  s    
r  c                 C   s   t ||}dd }||fS )Nc                 S   s>   t | ||jd |d }t | ||jd |d }|j|ddS )Nr   ry   T)r   r  rZ  r#   r#   r$   rr    s    z_set_lt.<locals>.codegenr  rs  r#   r#   r$   _set_lt  s    r  c                 C   s   t | | dd S )Nc                 S   s
   t | |S ri   )r  rd  r#   r#   r$   rL    rS   zset_lt.<locals>.<lambda>re  rd  r#   r#   r$   set_lt  s    
r  c                 C   s   t | | dd }|S )Nc                 S   s   || k S ri   r#   rd  r#   r#   r$   gt_impl  s    zset_gt.<locals>.gt_implre  )r`  ra  r  r#   r#   r$   set_gt  s    
r  c                 C   s^   t | ||jd |d }t | ||jd |d }||jtj}||jtj}|d||S )Nr   ry   rE   )r   rA   Zptrtointr   r   r   Zicmp_signed)r   r   r;   rA   r`  ra  mambr#   r#   r$   set_is  s
    r  c                 C   s   |j |j ksJ |S ri   rT   )r   r   ZfromtyZtotyr   r#   r#   r$   
set_to_set  s    r  )}__doc__collectionsr   mathr   	functoolsr   Zllvmliter   Z
numba.corer   r   r   Znumba.core.imputilsr   r   r	   r
   r   r   r   r   r   Z
numba.miscr   Znumba.cpythonr   Znumba.core.errorsr   r   Znumba.core.extendingr   r   r   r%   r(   rF   rK   r5   r   r   r	  r?   rD   rI   rM   r2   rY   
namedtuplerZ   objectr_   r   r+  r8  setr:  ZIterableTyper=  r3  rP   r?  r   AnyrA  rB  ZSetIterZBORROWEDrC  rF  rJ  rM  rP  rR  rT  rV  rX  rY  r\  r]  r^  rb  rf  rg  rh  rj  rk  rl  rn  rp  rx  iandiorisubixorZop_Zop_implr   r{  r   r~  xorr  or_r  r  r  r  ler  ger  r  r   r  ner  r  ltr  gtr  is_r  r  r#   r#   r#   r$   <module>   s  ,
	        "6

























	



























