U
    ë¾|ežß  ã                   @   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!d€d�„ ƒZkeejlƒe e
j<d‚ƒdƒd„„ ƒƒZmeejnƒe e
j<d…ƒd†d‡„ ƒƒZoe!dˆd‰„ ƒZpeejqƒdŠd‹„ ƒZreejsƒdŒd�„ ƒZte!dŽd�„ ƒZueejvƒd�d‘„ ƒZweejxƒd’d“„ ƒZyeejze
j<e
j<ƒd”d•„ ƒZ{ee
j<e
j<ƒd–d—„ ƒ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_typeÚ
as_pointerÚbitcastÚmake_data_helper)ÚcontextÚbuilderÚset_typeÚptrÚpayload_typeÚptrtyÚpayload© r%   úQ/var/www/website-v5/atlas_env/lib/python3.8/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    Ú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ÚhÚis_okÚfallbackr%   r%   r&   Úget_hash_value;   s    
rC   c                    s.   ‡ fdd„}|   t¡}| | ˆ fi ¡}||fS )Nc                    s   t | |ˆ |d ƒS ©Nr   )rC   )r   r   r:   Úargs©r;   r%   r&   ÚimplL   s    z'_get_hash_value_intrinsic.<locals>.impl)r1   r2   r3   )r<   r;   rG   r=   r>   r%   rF   r&   Ú_get_hash_value_intrinsicJ   s    
rH   c                 C   s   t  |jt¡}| d||¡S )z8
    Whether the hash value denotes an empty entry.
    ú==)r   r6   r7   ÚEMPTYÚicmp_unsigned)r   r   r@   Úemptyr%   r%   r&   Úis_hash_emptyS   s    rM   c                 C   s   t  |jt¡}| d||¡S )z9
    Whether the hash value denotes a deleted entry.
    rI   ©r   r6   r7   ÚDELETEDrK   ©r   r   r@   Údeletedr%   r%   r&   Úis_hash_deletedZ   s    rR   c                 C   s   t  |jt¡}| d||¡S )z9
    Whether the hash value denotes an active entry.
    ú<rN   rP   r%   r%   r&   r5   a   s    r5   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)Ú.0r:   r%   r%   r&   Ú
<listcomp>k   s     z!check_all_set.<locals>.<listcomp>z All arguments must be Sets, got c                    s   g | ]}ˆ d  j |j k‘qS )r   ©Údtype)rV   Ús©rE   r%   r&   rW   n   s     z'All Sets must be of the same type, got )Úallr   r[   r%   r[   r&   Úcheck_all_setj   s    r]   Ú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Ú_payloadÚ_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©rh   Úmask©rl   r%   r%   r&   rp   €   s    z_SetPayload.maskc                 C   s   || j _d S rn   ro   ©rl   r;   r%   r%   r&   rp   „   s    c                 C   s   | j jS rn   ©rh   Úusedrq   r%   r%   r&   rt   ‰   s    z_SetPayload.usedc                 C   s   || j _d S rn   rs   rr   r%   r%   r&   rt   �   s    c                 C   s   | j jS rn   ©rh   Úfillrq   r%   r%   r&   rv   ‘   s    z_SetPayload.fillc                 C   s   || j _d S rn   ru   rr   r%   r%   r&   rv   •   s    c                 C   s   | j jS rn   ©rh   Úfingerrq   r%   r%   r&   rx   ™   s    z_SetPayload.fingerc                 C   s   || j _d S rn   rw   rr   r%   r%   r&   rx   �   s    c                 C   s   | j jS rn   ©rh   Údirtyrq   r%   r%   r&   rz   ¡   s    z_SetPayload.dirtyc                 C   s   || j _d S rn   ry   rr   r%   r%   r&   rz   ¥   s    c                 C   s   | j S )z>
        A pointer to the start of the entries array.
        )rj   rq   r%   r%   r&   rd   ©   s    z_SetPayload.entriesc                 C   s   | j S )zC
        A pointer to the start of the NRT-allocated area.
        )rk   rq   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   Úgeprf   rj   re   r   r   r(   rg   )rl   ÚidxZ	entry_ptrra   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¡¡�< ˆ |¡}||ƒ ˆ ||
¡}ˆ ||¡}ˆ ||¡ W 5 Q R X ˆ |¡ ˆ |¡�x ˆ |¡}||ƒ ˆ |¡}ˆ ||¡}ˆ |
ˆ ||¡¡}ˆ |ˆ ||¡¡}ˆ ||¡ ˆ ||¡ ˆ |¡ W 5 Q R X ˆ ˆ¡�N ˆ�rˆ |¡}ˆ ˆ¡}ˆ ˆ d
|ˆ¡||¡}ˆ ||¡ ˆ |¡ W 5 Q R X ˆ ˆ ¡� ˆ |¡ W 5 Q R X ˆ |¡ ˆ 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              
      sÜ   ˆ
  | ¡}|j}ˆ ˆ dˆ|¡¡�6 ˆˆˆ	|jfƒ}ˆ |¡� ˆ ˆ ¡ W 5 Q R X W 5 Q R X ˆ tˆˆ|ƒ¡� ˆ ˆ¡ W 5 Q R X ˆrØˆ tˆˆ|ƒ¡�4 ˆ ˆ¡}ˆ 	ˆ d|ˆ¡| |¡}ˆ 
|ˆ¡ W 5 Q R X dS )zO
            Check entry *i* against the value being searched for.
            rI   N)r}   r2   Úif_thenrK   ÚkeyÚbranchrM   rR   Úloadr9   Ústore)Úira   Z
entry_hashÚeqÚj©Zbb_foundZbb_not_foundr   r   ZeqfnÚ
for_insertZ
free_indexZfree_index_sentinelr@   Úitemrl   r%   r&   Úcheck_entryé   s     

 ÿz(_SetPayload._lookup.<locals>.check_entryrI   Úfound)#re   rf   r7   rp   rg   rY   r0   r1   Úoperatorr†   r3   r4   r   r6   r   Úalloca_once_valueÚand_Úappend_basic_blockÚ	for_rangeÚLINEAR_PROBESrƒ   Úaddr„   r‚   Ú
goto_blockÚlshrÚmulr9   rK   Úposition_at_endÚphiÚIntTypeÚadd_incomingÚtrue_bitÚ	false_bit)rl   rŠ   r@   r‰   Úintp_trp   rY   Útyctxr=   r>   ÚoneZfiveZperturbr`   Úbb_bodyÚbb_endr‹   r…   Úpr‡   rŒ   r%   rˆ   r&   Ú_lookupÁ   sr    

ÿ




 





 ÿ
z_SetPayload._lookupNc              
   c   sš   | j }| j}| tj¡}t |d¡}| | j|¡}t	j
|||d��N}|  |j¡}t|||jƒ}	| |	¡� t|j||jd�}
|
V  W 5 Q R X W 5 Q R X dS )zG
        Iterate over the payload's entries.  Yield a SetLoop.
        r~   ©Ústartr_   N)re   rf   Úget_value_typer   Úintpr   r6   r“   rp   r   r‘   r}   r`   r5   r2   r€   r^   rb   )rl   r¥   r   r   r�   rŸ   ÚsizeZ
range_loopra   Ú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¡}	| |¡ | |¡�V | |	¡}
| || |
|¡¡}
| |
|	¡ |  |
¡}t|||jƒ}| |||¡ W 5 Q R X | |¡ | |	¡}
|
| _|  |
¡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   r~   Znext_entry_bodyZnext_entry_endN)re   rf   r¦   r   r§   r   r6   rp   r�   r   rŽ   rx   r‚   r”   rƒ   r�   r“   r„   r}   r5   r2   Úcbranchr—   )rl   r   r   r�   ÚzerorŸ   rp   r    r¡   r`   r…   ra   r©   r%   r%   r&   Ú_next_entryK  s*    






z_SetPayload._next_entry)F)N)Ú__name__Ú
__module__Ú__qualname__rm   Úpropertyrp   Úsetterrt   rv   rx   rz   rd   r!   r}   r£   Ú
contextlibÚcontextmanagerr«   r®   r%   r%   r%   r&   rc   u   s>   	













vrc   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 rn   )re   rf   rg   r+   Ú
_entrysizeÚmake_helperÚ_set)rl   r   r   r    Úset_valr%   r%   r&   rm   v  s
    zSetInstance.__init__c                 C   s   | j jS rn   )rg   rY   rq   r%   r%   r&   rY   }  s    zSetInstance.dtypec                 C   s.   | j }| j}| j j || j¡}t||| j|ƒS )z/
        The _SetPayload for this set.
        )re   rf   ÚnrtÚmeminfo_dataÚmeminforc   rg   )rl   r   r   r!   r%   r%   r&   r$   �  s    zSetInstance.payloadc                 C   s
   | j  ¡ S rn   )r¹   Ú	_getvaluerq   r%   r%   r&   r;   �  s    zSetInstance.valuec                 C   s   | j jS rn   )r¹   r½   rq   r%   r%   r&   r½   ‘  s    zSetInstance.meminfoc                 C   s   | j jS rn   ©r¹   Úparentrq   r%   r%   r&   rÀ   •  s    zSetInstance.parentc                 C   s   || j _d S rn   r¿   rr   r%   r%   r&   rÀ   ™  s    c                 C   s   | j jS )z<
        Return the number of elements in the size.
        )r$   rt   rq   r%   r%   r&   Úget_size�  s    zSetInstance.get_sizec                 C   s    | j jr|rtjntj| j_d S rn   )rg   Ú	reflectedr   r›   rœ   r$   rz   ©rl   Ú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 5 Q R X |rŽ|  |	¡ |  d¡ d S )Nr~   T©Úlikely)re   rf   r2   Úincref_valuer�   rt   r   r6   r7   r“   r€   rM   rv   ÚupsizerÅ   )rl   r$   ra   rŠ   r@   Ú	do_resizer   r   Úold_hashrt   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 5 Q R X |rÆ|  |¡ |  d¡ W 5 Q R X d S )NT©r‰   r~   rÆ   )re   rf   r£   Únot_r€   r}   r2   rÈ   r�   rt   r   r6   r7   r“   rM   rv   rÉ   rÅ   )rl   r$   rŠ   r@   rÊ   Ú	do_increfr   r   rŒ   r…   Ú	not_foundra   rË   rt   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 )Nr~   T)r   r6   r2   r7   rO   Údecref_valuer�   rt   rf   ÚsubÚdownsizerÅ   )rl   r$   ra   rÊ   Ú	do_decrefrt   rŸ   r%   r%   r&   Ú_remove_entryØ  s    
zSetInstance._remove_entryc           
   	   C   sN   | j }| j}| ||¡\}}| |¡� | |¡}	|  ||	|¡ W 5 Q R X |S rn   )re   rf   r£   r€   r}   rÖ   )
rl   r$   rŠ   r@   rÊ   r   r   rŒ   r…   ra   r%   r%   r&   Ú_remove_keyæ  s    
zSetInstance._remove_keyc                 C   s8   | j }| j}| j}t||| jj|ƒ}|  ||||¡ d S rn   )re   rf   r$   rC   rg   rY   rÑ   )rl   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)re   rf   r$   Ú_pyapi_get_hash_valuerÑ   )rl   ÚpyapirŠ   rÊ   r   r   r$   r@   r%   r%   r&   Ú	add_pyapiú  s
    zSetInstance.add_pyapic              	   C   sl   | j jg}tj}dd„ }|g}tj|f|žŽ }	| ||	|¡\}
}|j|
dd�� | | 	¡ ¡ W 5 Q R X |S )z=Python API compatible version of `get_hash_value()`.
        c                 S   s   t | ƒS rn   )rH   )rÄ   r%   r%   r&   Úwrapper  s    z2SetInstance._pyapi_get_hash_value.<locals>.wrapperFrÆ   )
rg   rY   r   r§   r   Ú	signatureÚcall_jit_coder€   ÚretÚget_null_object)rl   rÙ   r   r   rŠ   ÚargtypesÚrestyrÛ   rE   r>   Úis_errorÚretvalr%   r%   r&   rØ     s    
z!SetInstance._pyapi_get_hash_valuec                 C   s8   | j }| j}| j}t||| jj|ƒ}| ||¡\}}|S rn   )re   rf   r$   rC   rg   rY   r£   )rl   rŠ   r   r   r$   r@   rŒ   r…   r%   r%   r&   Úcontains  s    zSetInstance.containsc                 C   s6   | j }| j}| j}t||| jj|ƒ}|  |||¡}|S rn   )re   rf   r$   rC   rg   rY   r×   )rl   rŠ   r   r   r$   r@   rŒ   r%   r%   r&   Údiscard   s    zSetInstance.discardc              	   C   sh   | j }| j}| | jj¡}t ||¡}| j}| ¡ �$}| 	|j
|¡ | j||dd� W 5 Q R X | |¡S )NF)rÕ   )re   rf   r¦   rg   rY   r   Úalloca_oncer$   r®   r„   r�   rÖ   rƒ   )rl   r   r   Últyr�   r$   ra   r%   r%   r&   Úpop)  s    
zSetInstance.popc                 C   s<   | j }| j}| tj¡}t |t¡}|  |¡ |  	d¡ d S )NT)
re   rf   r¦   r   r§   r   r6   ÚMINSIZEÚ_replace_payloadrÅ   )rl   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��â\}}	|�@ | 	|¡}
|j
| |
¡dd�� |j |td¡ W 5 Q R X W 5 Q R X |	�„ |  |||¡}| |¡}
|j
| |
¡dd�� |j |td¡ W 5 Q R X |j}| ¡ �"}|j}|j||j|jdd� W 5 Q R X W 5 Q R X W 5 Q R X |S )z,
        Return a copy of this set.
        NrI   TrÆ   F)zcannot copy set©rÊ   )re   rf   r$   rt   rv   r7   rg   rK   Úif_elseÚ_copy_payloadr€   rÎ   Ú	call_convÚreturn_user_excÚMemoryErrorÚchoose_alloc_sizeÚ_allocate_payloadr«   ra   rÑ   r�   r2   )rl   r   r   r$   rt   rv   ÚotherZno_deleted_entriesZif_no_deletedZ
if_deletedÚokÚnentriesÚother_payloadrª   ra   r%   r%   r&   ÚcopyA  s:    

ÿ

ÿ
ÿ$zSetInstance.copyc           
   
   C   s‚   | j }| j}| j}|j}| ¡ �L}|j}| |j|j¡\}}	| | 	|¡¡� | j
||dd� W 5 Q R X W 5 Q R X |  |j¡ dS )z9
        In-place intersection with *other* set.
        Frí   N)re   rf   r$   r«   ra   r£   r�   r2   r€   rÎ   rÖ   rÔ   rt   )
rl   rõ   r   r   r$   rø   rª   ra   rŒ   Ú_r%   r%   r&   Ú	intersecth  s    
$zSetInstance.intersectc              	   C   sX   | j }| j}| j}|j}| ¡ �"}|j}| j||j|jdd� W 5 Q R X |  |j	¡ dS )z7
        In-place difference with *other* set.
        Frí   N)
re   rf   r$   r«   ra   r×   r�   r2   rÔ   rt   )rl   rõ   r   r   r$   rø   rª   ra   r%   r%   r&   Ú
differencez  s    
 zSetInstance.differencec                 C   sÆ   | j }| j}|j}| ¡ �”}|jj}|jj}| j}|j||dd�\}	}
| |
¡}| 	|	¡�J\}}|� | j
||dd� W 5 Q R X |� |  ||||¡ W 5 Q R X W 5 Q R X W 5 Q R X |  | jj¡ dS )zA
        In-place symmetric difference with *other* set.
        TrÍ   Frí   N)re   rf   r$   r«   ra   r�   r2   r£   r}   rî   rÖ   rÌ   rÔ   rt   )rl   rõ   r   r   rø   rª   r�   r@   r$   rŒ   r…   ra   Z	if_commonZif_not_commonr%   r%   r&   Úsymmetric_differenceŠ  s    

.z SetInstance.symmetric_differenceFc                 C   sò   | j }| j}| j}|j}|r dnd}t |tj¡}| | ||j|j¡¡�˜\}	}
|
� | 	tj
|¡ W 5 Q R X |	�f | ¡ �R}|j}| |j|j¡\}}| | |¡¡� | 	tj
|¡ | ¡  W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X | |¡S )NrS   ú<=)re   rf   r$   r   rŽ   r›   rî   rK   rt   r„   rœ   r«   ra   r£   r�   r2   r€   rÎ   rb   rƒ   )rl   rõ   Ústrictr   r   r$   rø   Úcmp_opÚresZ
if_smallerÚ	if_largerrª   ra   rŒ   rú   r%   r%   r&   Úissubset¢  s(    ÿ
0zSetInstance.issubsetc              
      sš   | j }| j‰ | j}|j}t ˆ tj¡‰‡ ‡fdd„}ˆ  ˆ  d|j|j¡¡�>\}}|� |||ƒ W 5 Q R X |� |||ƒ W 5 Q R X W 5 Q R X ˆ  	ˆ¡S )Nc              
      s^   |   ¡ �L}|j}| |j|j¡\}}ˆ  |¡� ˆ  tjˆ¡ | 	¡  W 5 Q R X W 5 Q R X d S rn   )
r«   ra   r£   r�   r2   r€   r„   r   rœ   rb   )ZsmallerZlargerrª   ra   rŒ   rú   ©r   r  r%   r&   ÚcheckÄ  s    
z%SetInstance.isdisjoint.<locals>.checkú>)
re   rf   r$   r   rŽ   r›   rî   rK   rt   rƒ   )rl   rõ   r   r$   rø   r  r  Ú	otherwiser%   r  r&   Ú
isdisjoint¼  s    	ÿzSetInstance.isdisjointc                 C   sæ   | j }| j}| j}|j}t |tj¡}| | d|j|j¡¡�˜\}}|�f | 	¡ �R}	|	j
}
| |
j|
j¡\}}| | |¡¡� | tj|¡ |	 ¡  W 5 Q R X W 5 Q R X W 5 Q R X |� | tj|¡ W 5 Q R X W 5 Q R X | |¡S )NrI   )re   rf   r$   r   rŽ   r›   rî   rK   rt   r«   ra   r£   r�   r2   r€   rÎ   r„   rœ   rb   rƒ   )rl   rõ   r   r   r$   rø   r  Zif_same_sizer  rª   ra   rŒ   rú   r%   r%   r&   ÚequalsÛ  s&    ÿ
&"zSetInstance.equalsNc           	      C   sf   |  tj¡}|dk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   r6   ré   rT   Úintró   rô   )	Úclsr   r   r    Únitemsr�   r÷   rl   rö   r%   r%   r&   Úallocate_exó  s    

zSetInstance.allocate_exc              	   C   sH   |   ||||¡\}}|j| |¡dd�� |j |td¡ W 5 Q R X |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 set)r  r€   rÎ   rð   rñ   rò   )r  r   r   r    r  rö   rl   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»   Úincrefr;   )r  r   r   r    r½   rl   r%   r%   r&   Úfrom_meminfo  s
    zSetInstance.from_meminfoc              
   C   sÜ   |j }t |d¡}t |t¡}| ||¡}t ||¡}| d¡}	| d¡}
| |	¡ | 	|	¡�d | 
|¡}| d||¡}|j|dd�� | |
¡ W 5 Q R X | ||¡}| ||¡ | |	¡ W 5 Q R X | |
¡ | 
|¡S )zT
        Choose a suitable number of entries for the given number of items.
        r~   úcalcsize.bodyúcalcsize.endú>=FrÆ   )r7   r   r6   ré   Úshlr   rŽ   r�   r‚   r”   rƒ   rK   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   s0  | j }| j}|j}t |d¡}t |d¡}| j}| ||¡}| |j|¡}	| 	d||	¡}
|j
|
dd��À t ||	¡}| d¡}| d¡}| |¡ | |¡�D | |¡}| ||¡}| ||¡ | 	d||¡}| |||¡ W 5 Q R X | |¡ | |¡}t�r| |d||	||¡ |  ||d	¡ W 5 Q R X d
S )zs
        When adding to the set, ensure it is properly sized for the given
        number of used entries.
        r~   é   r  FrÆ   r  r  zKupsize to %zd items: current size = %zd, min entries = %zd, new size = %zd
zcannot grow setN)re   rf   r7   r   r6   r$   r  r“   rp   rK   r€   r   rŽ   r�   r‚   r”   rƒ   r„   r¬   r—   ÚDEBUG_ALLOCSÚprintfÚ_resize)rl   r  r   r   r�   rŸ   Útwor$   r  r¨   Úneed_resizeÚ
new_size_pr    r¡   Únew_sizeÚis_too_smallr%   r%   r&   rÉ   C  s>    





   ý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 5 Q R X | ||¡ | |¡ W 5 Q R X | |¡ | |¡}t�rr| |d|||	|¡ |  ||d¡ W 5 Q R X dS )zw
        When removing from the set, ensure it is properly sized for the given
        number of used entries.
        r~   r  r  rþ   rS   FrÆ   r  r  r  zMdownsize to %zd items: current size = %zd, min entries = %zd, new size = %zd
zcannot shrink setN)re   rf   r7   r   r6   ré   r$   r  r9   rK   r“   rp   r�   r€   r   rŽ   r�   r‚   r”   rƒ   r•   r„   r—   r  r  r  )rl   r  r   r   r�   rŸ   r  rë   r$   r  Úmax_sizer¨   r  r  r    r¡   r  r   r%   r%   r&   rÔ   q  sT     ÿþ





   ýzSetInstance.downsizec           
   	   C   s˜   | j }| j}|}| j|dd�}|j| |¡dd�� |j |t|f¡ W 5 Q R X | j}| 	¡ �$}|j
}	| j||	j|	jddd� W 5 Q R X |  |j¡ dS )zw
        Resize the payload to the given number of entries.

        CAUTION: *nentries* must be a power of 2!
        T©ÚreallocFrÆ   )rÊ   rÏ   N)re   rf   rô   r€   rÎ   rð   rñ   rò   r$   r«   ra   rÑ   r�   r2   Ú_free_payloadr!   )
rl   r$   r÷   Úerrmsgr   r   Zold_payloadrö   rª   ra   r%   r%   r&   r  ­  s     
ÿ
 ÿzSetInstance._resizec              	   C   s„   | j }| j}| j ¡ �}|j}|  |j¡ W 5 Q R X |  | jj¡ | j	|dd�}|j
| |¡dd�� |j |td¡ W 5 Q R X 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!
        Tr"  FrÆ   )zcannot reallocate setN)re   rf   r$   r«   ra   rÒ   r�   r$  r!   rô   r€   rÎ   rð   rñ   rò   )rl   r÷   r   r   rª   ra   rö   r%   r%   r&   rê   È  s    
ÿzSetInstance._replace_payloadc                 C   s   | j }| j}t |tj¡}| tj¡}t 	|d¡}t 	|d¡}| 
t | j¡¡}	| |	¡}
| j}|
|8 }
t ||t 	||¡t 	||
¡¡\}}|j|dd�� | tj|¡ W 5 Q R X |j| |¡dd���& |rø| jj}|jj|||d�}t ||¡}n4|  ||j¡}|j ||| |tj¡¡}t ||¡}|j|dd��¬\}}|� | tj|¡ W 5 Q R X |�z |�s‚|| j_| tj ¡| j_!| j"}t #||j$|d¡ ||_%||_&||_'| (||¡}||_)t*�rØ| +|d||j$|¡ W 5 Q R X W 5 Q R X W 5 Q R X | |¡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   r~   FrÆ   T)r¨   éÿ   ú.allocated %zd bytes for set at %p: mask = %zd
),re   rf   r   rŽ   r›   r¦   r   r§   r   r6   r   r   rg   r)   r·   Ú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!   rt   rv   rx   rÓ   rp   r  r  )rl   r÷   r#  r   r   rö   r�   r­   rŸ   r"   Úpayload_sizeÚ
entry_sizeÚ	allocsizeÚovfr½   r!   Úalloc_okÚdtorÚif_errorÚif_okr$   Únew_maskr%   r%   r&   rô   ß  sp    


þþ  ÿÿ  þ"zSetInstance._allocate_payloadc                 C   s   | j j | j| j|¡ dS )z9
        Free an allocated old payload at *ptr*.
        N)re   r»   Zmeminfo_varsize_freerf   r½   )rl   r!   r%   r%   r&   r$  "  s    zSetInstance._free_payloadc                 C   sÆ  | j }| j}t |tj¡}| tj¡}t 	|d¡}t 	|d¡}| 
t | j¡¡}| |¡}	| j}
|	|
8 }	|j}| ||¡}| t 	||	¡| t 	||
¡|¡¡}|j| |¡dd��� |  ||j¡}|j ||| |tj¡¡}t ||¡}|j|dd��´\}}|� | tj|¡ W 5 Q R X |�‚ || j_| j }|j!|_!|j"|_"||_#||_t $||j%|j%||
¡ | &¡ �}|  '|j(j)¡ W 5 Q R X t*�rž| +|d||j,|¡ W 5 Q R X W 5 Q R X W 5 Q R X | |¡S )z7
        Raw-copy the given payload into self.
        r   r~   TrÆ   Fr'  )-re   rf   r   rŽ   r›   r¦   r   r§   r   r6   r   r   rg   r)   r·   rp   r“   r–   r€   rƒ   r*  r+  r»   r,  r   r-  r)  rî   r„   rœ   r¹   r½   r$   rt   rv   rx   Ú
raw_memcpyrd   r«   rÈ   ra   r�   r  r  r!   )rl   Zsrc_payloadr   r   rö   r�   r­   rŸ   r"   r/  r0  rp   r÷   r1  r4  r½   r3  r5  r6  r$   rª   r%   r%   r&   rï   (  sd    
ÿÿ  ÿ
 þ
  þ"zSetInstance._copy_payloadc              	   C   s²   t j}| tj¡}t t ¡ |||g¡}d| jj	› �}t j
|||d�}|jr®d|_t | ¡ ¡}t||| j|jd ƒ}	|	 ¡ �"}
|
j}|j || jj	|j¡ W 5 Q R X | ¡  |S )z Define the dtor for set
        z
.dtor.set.)ÚnameÚlinkonce_odrr   )r   r-  r¦   r   Úsize_tr   ÚFunctionTypeÚVoidTyperg   rY   Úget_or_insert_functionÚis_declarationÚlinkageÚ	IRBuilderr�   rc   rE   r«   ra   r»   Údecrefr�   Úret_void)rl   r   r+  Ú	llvoidptrZllsize_tr=   Úfnamer?   r   r$   rª   ra   r%   r%   r&   r*  i  s"    þ
 zSetInstance._imp_dtorc                 C   s   | j j | j| jj|¡ dS )z Incref an element value
        N)re   r»   r  rf   rg   rY   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)re   r»   rB  rf   rg   rY   rÃ   r%   r%   r&   rÒ   Š  s    zSetInstance.decref_value)T)TT)TT)T)T)T)F)N)N)F).r¯   r°   r±   rm   r²   rY   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	  Ú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 rn   )re   rf   rg   r¸   Ú_iterr»   r¼   r½   rc   Ú	containerrh   )rl   r   r   Ú	iter_typeÚiter_valr!   r%   r%   r&   rm   ’  s    zSetIterInstance.__init__c                 C   sJ   t |||j|ƒ}| |||d ƒ}| tjd¡}t ||¡|j_|j	|j_	|S rD   )
r¶   rI  Úget_constantr   r§   r   rŽ   rH  r`   r½   )r  r   r   rJ  rº   Zset_instrl   r`   r%   r%   r&   Úfrom_setš  s    
zSetIterInstance.from_setc                 C   s
   | j  ¡ S rn   )rH  r¾   rq   r%   r%   r&   r;   £  s    zSetIterInstance.valuec                 C   s   | j jS rn   )rH  r½   rq   r%   r%   r&   r½   §  s    zSetIterInstance.meminfoc                 C   s   | j  | jj¡S rn   )rf   rƒ   rH  r`   rq   r%   r%   r&   r`   «  s    zSetIterInstance.indexc                 C   s   | j  || jj¡ d S rn   )rf   r„   rH  r`   rr   r%   r%   r&   r`   ¯  s    c              	   C   sr   | j }| j}t |jd¡}| ¡  |j|d��:}|j}| ¡  | 	|j
¡ | j |j |¡| _ | ¡  W 5 Q R X d S )Nr~   r¤   )r`   rh   r   r6   r7   Úset_exhaustedr«   ra   Ú	set_validÚyield_r�   rf   r“   rb   )rl   Úresultr`   r$   rŸ   rª   ra   r%   r%   r&   Úiternext³  s    zSetIterInstance.iternextN)r¯   r°   r±   rm   rF  rM  r²   r;   r½   r`   r³   rR  r%   r%   r%   r&   rG  �  s   




rG  c              	   C   s�   t |ƒ}t | |||¡}|dkr€t ||¡}t ||¡}|  tj|¡}t 	||¡�(}	| 
t ||d|	j¡¡}
| |
¡ W 5 Q R X t| |||jƒS )zD
    Build a set of the given type, containing the given items.
    r   )Úlenr¶   r  r   Ú
pack_arrayrŽ   rL  r   r§   r‘   rƒ   r{   r`   r“   r   r;   )r   r   r    Úitemsr  ÚinstÚarrayÚ	array_ptrÚcountrª   rŠ   r%   r%   r&   Ú	build_setÆ  s    rZ  c                 C   s$   |j }t | ||¡}t| |||jƒS rn   )Úreturn_typer¶   r  r   r;   )r   r   r>   rE   r    rV  r%   r%   r&   Úset_empty_constructorÜ  s    r\  c           
   	   C   s|   |j }|j\}|\}t| |||ƒ}t | |||¡}t| |||ƒ�&}	| |	j¡ | j 	||j
|	j¡ W 5 Q R X t| |||jƒS rn   )r[  rE   r   r¶   r  r   r“   r;   r»   rB  rY   r   )
r   r   r>   rE   r    Ú
items_typerU  ÚnrV  rª   r%   r%   r&   Úset_constructorâ  s    r_  c                 C   s    t | ||jd |d ƒ}| ¡ S rD   )r¶   rE   rÁ   ©r   r   r>   rE   rV  r%   r%   r&   Úset_lenú  s    ra  c                 C   s&   t | ||jd |d ƒ}| |d ¡S ©Nr   r~   )r¶   rE   rä   r`  r%   r%   r&   Úin_setÿ  s    rc  Úgetiterc                 C   s(   t  | ||j|d ¡}t| ||j|jƒS rD   )rG  rM  r[  r
   r;   r`  r%   r%   r&   Úgetiter_set  s    re  rR  c                 C   s&   t | ||jd |d ƒ}| |¡ d S rD   )rG  rE   rR  )r   r   r>   rE   rQ  rV  r%   r%   r&   Úiternext_listiter	  s    rf  zset.addc                 C   s2   t | ||jd |d ƒ}|d }| |¡ |  ¡ S rb  )r¶   rE   r“   Úget_dummy_value©r   r   r>   rE   rV  rŠ   r%   r%   r&   Úset_add  s    
ri  c                 C   s   t  ||¡}dd„ }||fS )Nc                 S   s2   t | ||jd |d ƒ}|d }| |¡ |  ¡ S rb  )r¶   rE   rå   rg  rh  r%   r%   r&   Úset_discard"  s    
z!_set_discard.<locals>.set_discard©r   Únone)r<   rZ   rŠ   r>   rj  r%   r%   r&   Ú_set_discard  s    rm  rå   c                 C   s   dd„ S )Nc                 S   s
   t | |ƒS rn   )rm  ©rZ   rŠ   r%   r%   r&   Ú<lambda>.  ó    z ol_set_discard.<locals>.<lambda>r%   rn  r%   r%   r&   Úol_set_discard,  s    rq  c                 C   s   |  |¡}dd„ }||fS )Nc              	   S   sZ   t | ||jd |d ƒ}|jj}|jt ||¡dd�� | j |t	d¡ W 5 Q R X | 
¡ S )Nr   FrÆ   )zset.pop(): empty set)r¶   rE   r$   rt   r€   r   r)  rð   rñ   ÚKeyErrorrè   )r   r   r>   rE   rV  rt   r%   r%   r&   Úset_pop5  s    
ÿz_set_pop.<locals>.set_poprX   )r<   rZ   r>   rs  r%   r%   r&   Ú_set_pop1  s    
	rt  rè   c                 C   s   dd„ S )Nc                 S   s   t | ƒS rn   )rt  ©rZ   r%   r%   r&   ro  C  rp  zol_set_pop.<locals>.<lambda>r%   ru  r%   r%   r&   Ú
ol_set_popA  s    rv  c                 C   s   t  ||¡}dd„ }||fS )Nc              	   S   sb   t | ||jd |d ƒ}|d }| |¡}|j| |¡dd�� | j |td¡ W 5 Q R X |  ¡ S )Nr   r~   FrÆ   )zset.remove(): key not in set)	r¶   rE   rå   r€   rÎ   rð   rñ   rr  rg  )r   r   r>   rE   rV  rŠ   rŒ   r%   r%   r&   Ú
set_removeJ  s    

ÿz_set_remove.<locals>.set_removerk  )r<   rZ   rŠ   r>   rw  r%   r%   r&   Ú_set_removeF  s    
rx  Úremovec                 C   s   | j |krdd„ S d S )Nc                 S   s
   t | |ƒS rn   )rx  rn  r%   r%   r&   ro  Z  rp  zol_set_remove.<locals>.<lambda>rX   rn  r%   r%   r&   Úol_set_removeW  s    
rz  c                 C   s   t  |¡}dd„ }||fS )Nc                 S   s(   t | ||jd |d ƒ}| ¡  |  ¡ S rD   )r¶   rE   rì   rg  r`  r%   r%   r&   Ú	set_clearc  s    z_set_clear.<locals>.set_clearrk  )r<   rZ   r>   r{  r%   r%   r&   Ú
_set_clear_  s    
r|  rì   c                 C   s   dd„ S )Nc                 S   s   t | ƒS rn   )r|  ru  r%   r%   r&   ro  m  rp  zol_set_clear.<locals>.<lambda>r%   ru  r%   r%   r&   Úol_set_cleark  s    r}  c                 C   s   ||ƒ}dd„ }||fS )Nc                 S   s2   t | ||jd |d ƒ}| ¡ }t| ||j|jƒS rD   )r¶   rE   rù   r   r[  r;   ©r   r   r>   rE   rV  rõ   r%   r%   r&   Úset_copyt  s    z_set_copy.<locals>.set_copyr%   )r<   rZ   r>   r  r%   r%   r&   Ú	_set_copyp  s    r€  rù   c                 C   s   dd„ S )Nc                 S   s   t | ƒS rn   )r€  ru  r%   r%   r&   ro  ~  rp  zol_set_copy.<locals>.<lambda>r%   ru  r%   r%   r&   Úol_set_copy|  s    r�  c                 C   sB   t | ||jd |d ƒ}t | ||jd |d ƒ}| |¡ |  ¡ S rb  )r¶   rE   rü   rg  r~  r%   r%   r&   Úset_difference_update�  s    
r‚  c                 C   s   t  ||¡}|tfS rn   )r   rl  r‚  ©r<   ÚaÚbr>   r%   r%   r&   Ú_set_difference_updateŠ  s    r†  Údifference_updatec                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rn   )r†  ©r„  r…  r%   r%   r&   ro  “  rp  z,set_difference_update_impl.<locals>.<lambda>©r]   rˆ  r%   r%   r&   Úset_difference_update_impl�  s    
rŠ  c                 C   sB   t | ||jd |d ƒ}t | ||jd |d ƒ}| |¡ |  ¡ S rb  )r¶   rE   rû   rg  r~  r%   r%   r&   Úset_intersection_update–  s    
r‹  c                 C   s   t  ||¡}|tfS rn   )r   rl  r‹  rƒ  r%   r%   r&   Ú_set_intersection_update�  s    rŒ  Úintersection_updatec                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rn   )rŒ  rˆ  r%   r%   r&   ro  ¦  rp  z.set_intersection_update_impl.<locals>.<lambda>r‰  rˆ  r%   r%   r&   Úset_intersection_update_impl£  s    
rŽ  c                 C   sB   t | ||jd |d ƒ}t | ||jd |d ƒ}| |¡ |  ¡ S rb  )r¶   rE   rý   rg  r~  r%   r%   r&   Úset_symmetric_difference_update©  s    
r�  c                 C   s   t  ||¡}|tfS rn   )r   rl  r�  rƒ  r%   r%   r&   Ú _set_symmetric_difference_update°  s    r�  Úsymmetric_difference_updatec                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rn   )r�  rˆ  r%   r%   r&   ro  ¹  rp  z6set_symmetric_difference_update_impl.<locals>.<lambda>r‰  rˆ  r%   r%   r&   Ú$set_symmetric_difference_update_impl¶  s    
r’  z
set.updatec              	   C   sÆ   t | ||jd |d ƒ}|jd }|d }t| |||ƒ}|d k	rZ| |jj|¡}| |¡ t| |||ƒ�:}	|  ||	j	|j
|j
¡}
| |
¡ | j ||j
|	j	¡ W 5 Q R X |d k	r¾| |jj¡ |  ¡ S rb  )r¶   rE   r   r“   r$   rt   rÉ   r   Úcastr;   rY   r»   rB  rÔ   rg  )r   r   r>   rE   rV  r]  rU  r^  r  rª   Úcastedr%   r%   r&   Ú
set_update¼  s    


r•  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t‚ˆ | |||ƒ t| ||jd |d ƒS rD   )r[  rE   ÚAssertionErrorr
   )r   r   r>   rE   ©rG   r%   r&   ÚcodegenÞ  s    z>gen_operator_impl.<locals>._set_operator_intr.<locals>.codegenr%   ©r<   r„  r…  r>   r˜  r—  r%   r&   Ú_set_operator_intrÛ  s    
z-gen_operator_impl.<locals>._set_operator_intrc                    s   t | |ƒ ‡ fdd„S )Nc                    s
   ˆ | |ƒS rn   r%   rˆ  ©rš  r%   r&   ro  ç  rp  z=gen_operator_impl.<locals>._ol_set_operator.<locals>.<lambda>r‰  rˆ  r›  r%   r&   Ú_ol_set_operatorä  s    
z+gen_operator_impl.<locals>._ol_set_operator)r   r   )ÚoprG   rœ  r%   )rš  rG   r&   Úgen_operator_implÚ  s    rž  rü   c                 C   s   t | |ƒ dd„ }|S )Nc                 S   s   |   ¡ }| |¡ |S rn   )rù   r‡  ©r„  r…  rZ   r%   r%   r&   Údifference_implú  s    
z,impl_set_difference.<locals>.difference_implr‰  )r„  r…  r   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 rn   )rS  rù   r�  rŸ  r%   r%   r&   Úintersection_impl  s    

z+set_intersection.<locals>.intersection_implr‰  )r„  r…  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 rn   )rS  rù   r‘  rŸ  r%   r%   r&   Úsymmetric_difference_impl  s    

z;set_symmetric_difference.<locals>.symmetric_difference_implr‰  )r„  r…  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 rn   )rS  rù   ÚupdaterŸ  r%   r%   r&   Ú
union_impl(  s    

zset_union.<locals>.union_implr‰  )r„  r…  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 rb  )r¶   rE   r  r~  r%   r%   r&   r˜  ;  s    z _set_isdisjoint.<locals>.codegen©r   Úbooleanr™  r%   r%   r&   Ú_set_isdisjoint7  s    r­  r  c                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rn   )r­  rˆ  r%   r%   r&   ro  H  rp  z set_isdisjoint.<locals>.<lambda>r‰  rˆ  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 rb  ©r¶   rE   r  r~  r%   r%   r&   r˜  O  s    z_set_issubset.<locals>.codegenr«  r™  r%   r%   r&   Ú_set_issubsetK  s    r°  r  c                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rn   )r°  rˆ  r%   r%   r&   ro  \  rp  zset_issubset.<locals>.<lambda>r‰  rˆ  r%   r%   r&   Úset_issubsetW  s    
r±  Ú
issupersetc                 C   s   t | |ƒ dd„ }|S )Nc                 S   s
   |  | ¡S rn   )r  rˆ  r%   r%   r&   Úsuperset_impld  s    z%set_issuperset.<locals>.superset_implr‰  )r„  r…  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 rb  )r¶   rE   r	  r~  r%   r%   r&   r˜  m  s    z_set_eq.<locals>.codegenr«  r™  r%   r%   r&   Ú_set_eqi  s    rµ  c                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rn   )rµ  rˆ  r%   r%   r&   ro  y  rp  zset_eq.<locals>.<lambda>r‰  rˆ  r%   r%   r&   Úset_equ  s    
r¶  c                 C   s   t | |ƒ dd„ }|S )Nc                 S   s
   | |k S rn   r%   rˆ  r%   r%   r&   Úne_impl  s    zset_ne.<locals>.ne_implr‰  )r„  r…  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   r~   T)rÿ   r¯  r~  r%   r%   r&   r˜  ˆ  s    z_set_lt.<locals>.codegenr«  r™  r%   r%   r&   Ú_set_lt„  s    r¹  c                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rn   )r¹  rˆ  r%   r%   r&   ro  ”  rp  zset_lt.<locals>.<lambda>r‰  rˆ  r%   r%   r&   Úset_lt�  s    
rº  c                 C   s   t | |ƒ dd„ }|S )Nc                 S   s   || k S rn   r%   rˆ  r%   r%   r&   Úgt_implš  s    zset_gt.<locals>.gt_implr‰  )r„  r…  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   r~   rI   )r¶   rE   Úptrtointr½   r   r�   Úicmp_signed)r   r   r>   rE   r„  r…  ÚmaÚmbr%   r%   r&   Úset_isŸ  s
    rÁ  c                 C   s   |j |j kst‚|S rn   )rY   r–  )r   r   ÚfromtyÚtotyrÄ   r%   r%   r&   Ú
set_to_set«  s    rÄ  )}Ú__doc__Úcollectionsr´   Úmathr�   Ú	functoolsr   Úllvmliter   Ú
numba.corer   r   r   Únumba.core.imputilsr   r   r	   r
   r   r   r   r   r   Ú
numba.miscr   Únumba.cpythonr   Únumba.core.errorsr   r   Únumba.core.extendingr   r   r   r'   r+   rJ   rO   r8   ré   r’   r  rC   rH   rM   rR   r5   r]   Ú
namedtupler^   Úobjectrc   r¶   rG  rZ  Úsetr\  ÚIterableTyper_  rS  rU   ra  rä   ÚAnyrc  re  ÚSetIterÚBORROWEDrf  ri  rm  rq  rt  rv  rx  rz  r|  r}  r€  r�  r‚  r†  rŠ  r‹  rŒ  rŽ  r�  r�  r’  r•  rž  Ú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

























	









ü

















