U
    hâËdžß  ã                   @   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_typeZ
as_pointerÚbitcastÚmake_data_helper)ÚcontextÚbuilderÚset_typeÚptrÚpayload_typeZptrtyÚpayload© r#   úM/home/sam/Atlas/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   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   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)rQ   Ús©rA   r#   r$   rR   n   s     z'All Sets must be of the same type, got )Úallr   rV   r#   rV   r$   Úcheck_all_setj   s    rX   Ú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©rc   Úmask©rf   r#   r#   r$   rj   €   s    z_SetPayload.maskc                 C   s   || j _d S rh   ri   ©rf   r8   r#   r#   r$   rj   „   s    c                 C   s   | j jS rh   ©rc   Úusedrk   r#   r#   r$   rn   ‰   s    z_SetPayload.usedc                 C   s   || j _d S rh   rm   rl   r#   r#   r$   rn   �   s    c                 C   s   | j jS rh   ©rc   Úfillrk   r#   r#   r$   rp   ‘   s    z_SetPayload.fillc                 C   s   || j _d S rh   ro   rl   r#   r#   r$   rp   •   s    c                 C   s   | j jS rh   ©rc   Úfingerrk   r#   r#   r$   rr   ™   s    z_SetPayload.fingerc                 C   s   || j _d S rh   rq   rl   r#   r#   r$   rr   �   s    c                 C   s   | j jS rh   ©rc   Údirtyrk   r#   r#   r$   rt   ¡   s    z_SetPayload.dirtyc                 C   s   || j _d S rh   rs   rl   r#   r#   r$   rt   ¥   s    c                 C   s   | j S )z>
        A pointer to the start of the entries array.
        )rd   rk   r#   r#   r$   r_   ©   s    z_SetPayload.entriesc                 C   s   | j S )zC
        A pointer to the start of the NRT-allocated area.
        )re   rk   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   Úgepra   rd   r`   r   r   r&   rb   )rf   Ú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¡¡�< ˆ |¡}||ƒ ˆ ||
¡}ˆ ||¡}ˆ ||¡ 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.
            rE   N)rw   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=   Úitemrf   r#   r$   Úcheck_entryé   s     

 ÿz(_SetPayload._lookup.<locals>.check_entryrE   Úfound)#r`   ra   r4   rj   rb   rT   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)rf   r„   r=   rƒ   Úintp_trj   rT   Ztyctxr:   r;   ÚoneÚ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.
        rx   ©ÚstartrZ   N)r`   ra   Úget_value_typer   Úintpr   r3   r�   rj   r   r‹   rw   r[   r2   r/   rz   rY   r]   )rf   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¡}	| |¡ | |¡�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   rx   Znext_entry_bodyZnext_entry_endN)r`   ra   rž   r   rŸ   r   r3   rj   rŠ   r   rˆ   rr   r|   rŽ   r}   r‰   r�   r~   rw   r2   r/   Úcbranchr‘   )rf   r   r   r•   Úzeror–   rj   r˜   r™   r[   r   r\   r¡   r#   r#   r$   Ú_next_entryK  s*    






z_SetPayload._next_entry)F)N)Ú__name__Ú
__module__Ú__qualname__rg   Úpropertyrj   Úsetterrn   rp   rr   rt   r_   r    rw   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 rh   )r`   ra   rb   r(   Ú
_entrysizeÚmake_helperÚ_set)rf   r   r   r   Úset_valr#   r#   r$   rg   v  s
    zSetInstance.__init__c                 C   s   | j jS rh   )rb   rT   rk   r#   r#   r$   rT   }  s    zSetInstance.dtypec                 C   s.   | j }| j}| j j || j¡}t||| j|ƒS )z/
        The _SetPayload for this set.
        )r`   ra   ÚnrtÚmeminfo_dataÚmeminfor^   rb   )rf   r   r   r    r#   r#   r$   r"   �  s    zSetInstance.payloadc                 C   s
   | j  ¡ S rh   )r±   Ú	_getvaluerk   r#   r#   r$   r8   �  s    zSetInstance.valuec                 C   s   | j jS rh   )r±   rµ   rk   r#   r#   r$   rµ   ‘  s    zSetInstance.meminfoc                 C   s   | j jS rh   ©r±   Úparentrk   r#   r#   r$   r¸   •  s    zSetInstance.parentc                 C   s   || j _d S rh   r·   rl   r#   r#   r$   r¸   ™  s    c                 C   s   | j jS )z<
        Return the number of elements in the size.
        )r"   rn   rk   r#   r#   r$   Úget_size�  s    zSetInstance.get_sizec                 C   s    | j jr|rtjntj| j_d S rh   )rb   Z	reflectedr   r“   r”   r"   rt   ©rf   Ú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 )Nrx   T©Zlikely)r`   ra   r/   Úincref_valuer{   rn   r   r3   r4   r�   rz   rI   rp   Úupsizer¼   )rf   r"   r\   r„   r=   Ú	do_resizer   r   Úold_hashrn   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ƒ   rx   r½   )r`   ra   r›   Únot_rz   rw   r/   r¾   r{   rn   r   r3   r4   r�   rI   rp   r¿   r¼   )rf   r"   r„   r=   rÀ   Ú	do_increfr   r   r†   r   Ú	not_foundr\   rÁ   rn   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 )Nrx   T)r   r3   r/   r4   rK   Údecref_valuer{   rn   ra   ÚsubÚdownsizer¼   )rf   r"   r\   rÀ   Ú	do_decrefrn   r–   r#   r#   r$   Ú_remove_entryØ  s    
zSetInstance._remove_entryc           
   	   C   sN   | j }| j}| ||¡\}}| |¡� | |¡}	|  ||	|¡ W 5 Q R X |S rh   )r`   ra   r›   rz   rw   rÌ   )
rf   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 rh   )r`   ra   r"   r?   rb   rT   rÇ   )rf   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)r`   ra   r"   Ú_pyapi_get_hash_valuerÇ   )rf   Ú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 rh   )rD   )r»   r#   r#   r$   Úwrapper  s    z2SetInstance._pyapi_get_hash_value.<locals>.wrapperFr½   )
rb   rT   r   rŸ   r   Ú	signatureZcall_jit_coderz   ÚretZget_null_object)rf   rÏ   r   r   r„   Z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 rh   )r`   ra   r"   r?   rb   rT   r›   )rf   r„   r   r   r"   r=   r†   r   r#   r#   r$   Úcontains  s    zSetInstance.containsc                 C   s6   | j }| j}| j}t||| jj|ƒ}|  |||¡}|S rh   )r`   ra   r"   r?   rb   rT   rÍ   )rf   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Ë   )r`   ra   rž   rb   rT   r   Zalloca_oncer"   r¦   r~   r{   rÌ   r}   )rf   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)
r`   ra   rž   r   rŸ   r   r3   ÚMINSIZEÚ_replace_payloadr¼   )rf   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.
        NrE   Tr½   F)zcannot copy set©rÀ   )r`   ra   r"   rn   rp   r4   rb   rG   Úif_elseÚ_copy_payloadrz   rÄ   Ú	call_convÚreturn_user_excÚMemoryErrorÚchoose_alloc_sizeÚ_allocate_payloadr£   r\   rÇ   r{   r/   )rf   r   r   r"   rn   rp   ÚotherZno_deleted_entriesZif_no_deletedZ
if_deletedÚokÚnentriesÚother_payloadr¢   r\   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)r`   ra   r"   r£   r\   r›   r{   r/   rz   rÄ   rÌ   rÊ   rn   )
rf   rä   r   r   r"   rç   r¢   r\   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)
r`   ra   r"   r£   r\   rÍ   r{   r/   rÊ   rn   )rf   rä   r   r   r"   rç   r¢   r\   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)r`   ra   r"   r£   r\   r{   r/   r›   rw   rÝ   rÌ   rÂ   rÊ   rn   )rf   rä   r   r   rç   r¢   r{   r=   r"   r†   r   r\   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 )NrN   ú<=)r`   ra   r"   r   rˆ   r“   rÝ   rG   rn   r~   r”   r£   r\   r›   r{   r/   rz   rÄ   r]   r}   )rf   rä   Ústrictr   r   r"   rç   Úcmp_opÚresZ
if_smallerÚ	if_largerr¢   r\   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 rh   )
r£   r\   r›   r{   r/   rz   r~   r   r”   r]   )ZsmallerZlargerr¢   r\   r†   ré   ©r   rð   r#   r$   ÚcheckÄ  s    
z%SetInstance.isdisjoint.<locals>.checkú>)
r`   ra   r"   r   rˆ   r“   rÝ   rG   rn   r}   )rf   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 )NrE   )r`   ra   r"   r   rˆ   r“   rÝ   rG   rn   r£   r\   r›   r{   r/   rz   rÄ   r~   r”   r]   r}   )rf   rä   r   r   r"   rç   rð   Zif_same_sizerö   r¢   r\   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   r3   rØ   rO   Úintrâ   rã   )	Úclsr   r   r   Únitemsr•   ræ   rf   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ü   rz   rÄ   rß   rà   rá   )rú   r   r   r   rû   rå   rf   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µ   rf   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.
        rx   úcalcsize.bodyúcalcsize.endú>=Fr½   )r4   r   r3   rØ   Úshlr   rˆ   rŠ   r|   rŽ   r}   rG   rz   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.
        rx   é   r  Fr½   r  r  zKupsize to %zd items: current size = %zd, min entries = %zd, new size = %zd
zcannot grow setN)r`   ra   r4   r   r3   r"   r  r�   rj   rG   rz   r   rˆ   rŠ   r|   rŽ   r}   r~   r¤   r‘   ÚDEBUG_ALLOCSÚprintfÚ_resize)rf   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.
        rx   r  r  rí   rN   Fr½   r  r  rõ   zMdownsize to %zd items: current size = %zd, min entries = %zd, new size = %zd
zcannot shrink setN)r`   ra   r4   r   r3   rØ   r"   r  r6   rG   r�   rj   r‰   rz   r   rˆ   rŠ   r|   rŽ   r}   r�   r~   r‘   r  r	  r
  )rf   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)r`   ra   rã   rz   rÄ   rß   rà   rá   r"   r£   r\   rÇ   r{   r/   Ú_free_payloadr    )
rf   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 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)r`   ra   r"   r£   r\   rÈ   r{   r  r    rã   rz   rÄ   rß   rà   rá   )rf   ræ   r   r   r¢   r\   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   rx   Fr½   T)r    éÿ   ú.allocated %zd bytes for set at %p: mask = %zd
),r`   ra   r   rˆ   r“   rž   r   rŸ   r   r3   r   r   rb   r'   r¯   Zmuladd_with_overflowrz   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"   Zmemsetr    rn   rp   rr   rÉ   rj   r  r	  )rf   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ã   ß  sp    


þþ  ÿÿ  þ"zSetInstance._allocate_payloadc                 C   s   | j j | j| j|¡ dS )z9
        Free an allocated old payload at *ptr*.
        N)r`   r³   Zmeminfo_varsize_freera   rµ   )rf   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   rx   Tr½   Fr  )-r`   ra   r   rˆ   r“   rž   r   rŸ   r   r3   r   r   rb   r'   r¯   rj   r�   r�   rz   r}   r  r  r³   r  r   r  r  rÝ   r~   r”   r±   rµ   r"   rn   rp   rr   Z
raw_memcpyr_   r£   r¾   r\   r{   r  r	  r    )rf   Zsrc_payloadr   r   rå   r•   r¥   r–   r!   r  r  rj   ræ   r  r   rµ   r  r!  r"  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.)ÚnameZlinkonce_odrr   )r   r  rž   r   Zsize_tr   ÚFunctionTypeZVoidTyperb   rT   Zget_or_insert_functionZis_declarationÚlinkageZ	IRBuilderrŠ   r^   rA   r£   r\   r³   Údecrefr{   Zret_void)rf   r   r  Z	llvoidptrZllsize_tr:   Úfnamer<   r   r"   r¢   r\   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)r`   r³   r   ra   rb   rT   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)r`   r³   r&  ra   rb   rT   rº   r#   r#   r$   rÈ   Š  s    zSetInstance.decref_value)T)TT)TT)T)T)T)F)N)N)F).r§   r¨   r©   rg   rª   rT   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 rh   )r`   ra   rb   r°   Ú_iterr³   r´   rµ   r^   Ú	containerrc   )rf   r   r   Ú	iter_typeZiter_valr    r#   r#   r$   rg   ’  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_instrf   r[   r#   r#   r$   Úfrom_setš  s    
zSetIterInstance.from_setc                 C   s
   | j  ¡ S rh   )r*  r¶   rk   r#   r#   r$   r8   £  s    zSetIterInstance.valuec                 C   s   | j jS rh   )r*  rµ   rk   r#   r#   r$   rµ   §  s    zSetIterInstance.meminfoc                 C   s   | j  | jj¡S rh   )ra   r}   r*  r[   rk   r#   r#   r$   r[   «  s    zSetIterInstance.indexc                 C   s   | j  || jj¡ d S rh   )ra   r~   r*  r[   rl   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 )Nrx   rœ   )r[   rc   r   r3   r4   Zset_exhaustedr£   r\   Z	set_validZyield_r{   ra   r�   r]   )rf   Úresultr[   r"   r–   r¢   r\   r#   r#   r$   Úiternext³  s    zSetIterInstance.iternextN)r§   r¨   r©   rg   r(  r.  rª   r8   rµ   r[   r«   r0  r#   r#   r#   r$   r)  �  s   




r)  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   Z
pack_arrayrˆ   r-  r   rŸ   r‹   r}   ru   r[   r�   r   r8   )r   r   r   Úitemsrû   ÚinstÚarrayZ	array_ptrÚcountr¢   r„   r#   r#   r$   Ú	build_setÆ  s    r6  c                 C   s$   |j }t | ||¡}t| |||jƒS rh   )Úreturn_typer®   rý   r   r8   )r   r   r;   rA   r   r3  r#   r#   r$   Úset_empty_constructorÜ  s    r8  c           
   	   C   s|   |j }|j\}|\}t| |||ƒ}t | |||¡}t| |||ƒ�&}	| |	j¡ | j 	||j
|	j¡ W 5 Q R X t| |||jƒS rh   )r7  rA   r   r®   rý   r   r�   r8   r³   r&  rT   r   )
r   r   r;   rA   r   Ú
items_typer2  Únr3  r¢   r#   r#   r$   Úset_constructorâ  s    r;  c                 C   s    t | ||jd |d ƒ}| ¡ S r@   )r®   rA   r¹   ©r   r   r;   rA   r3  r#   r#   r$   Úset_lenú  s    r=  c                 C   s&   t | ||jd |d ƒ}| |d ¡S ©Nr   rx   )r®   rA   rÕ   r<  r#   r#   r$   Úin_setÿ  s    r?  Zgetiterc                 C   s(   t  | ||j|d ¡}t| ||j|jƒS r@   )r)  r.  r7  r
   r8   r<  r#   r#   r$   Úgetiter_set  s    r@  r0  c                 C   s&   t | ||jd |d ƒ}| |¡ d S r@   )r)  rA   r0  )r   r   r;   rA   r/  r3  r#   r#   r$   Úiternext_listiter	  s    rA  zset.addc                 C   s2   t | ||jd |d ƒ}|d }| |¡ |  ¡ S r>  )r®   rA   r�   Úget_dummy_value©r   r   r;   rA   r3  r„   r#   r#   r$   Úset_add  s    
rD  c                 C   s   t  ||¡}dd„ }||fS )Nc                 S   s2   t | ||jd |d ƒ}|d }| |¡ |  ¡ S r>  )r®   rA   rÖ   rB  rC  r#   r#   r$   Úset_discard"  s    
z!_set_discard.<locals>.set_discard©r   Únone)r9   rU   r„   r;   rE  r#   r#   r$   Ú_set_discard  s    rH  rÖ   c                 C   s   dd„ S )Nc                 S   s
   t | |ƒS rh   )rH  ©rU   r„   r#   r#   r$   Ú<lambda>.  ó    z ol_set_discard.<locals>.<lambda>r#   rI  r#   r#   r$   Úol_set_discard,  s    rL  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®   rA   r"   rn   rz   r   r  rß   rà   ÚKeyErrorr×   )r   r   r;   rA   r3  rn   r#   r#   r$   Úset_pop5  s    
ÿz_set_pop.<locals>.set_poprS   )r9   rU   r;   rN  r#   r#   r$   Ú_set_pop1  s    
	rO  r×   c                 C   s   dd„ S )Nc                 S   s   t | ƒS rh   )rO  ©rU   r#   r#   r$   rJ  C  rK  zol_set_pop.<locals>.<lambda>r#   rP  r#   r#   r$   Ú
ol_set_popA  s    rQ  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   rx   Fr½   )zset.remove(): key not in set)	r®   rA   rÖ   rz   rÄ   rß   rà   rM  rB  )r   r   r;   rA   r3  r„   r†   r#   r#   r$   Ú
set_removeJ  s    

ÿz_set_remove.<locals>.set_removerF  )r9   rU   r„   r;   rR  r#   r#   r$   Ú_set_removeF  s    
rS  Úremovec                 C   s   | j |krdd„ S d S )Nc                 S   s
   t | |ƒS rh   )rS  rI  r#   r#   r$   rJ  Z  rK  zol_set_remove.<locals>.<lambda>rS   rI  r#   r#   r$   Úol_set_removeW  s    
rU  c                 C   s   t  |¡}dd„ }||fS )Nc                 S   s(   t | ||jd |d ƒ}| ¡  |  ¡ S r@   )r®   rA   rÛ   rB  r<  r#   r#   r$   Ú	set_clearc  s    z_set_clear.<locals>.set_clearrF  )r9   rU   r;   rV  r#   r#   r$   Ú
_set_clear_  s    
rW  rÛ   c                 C   s   dd„ S )Nc                 S   s   t | ƒS rh   )rW  rP  r#   r#   r$   rJ  m  rK  zol_set_clear.<locals>.<lambda>r#   rP  r#   r#   r$   Úol_set_cleark  s    rX  c                 C   s   ||ƒ}dd„ }||fS )Nc                 S   s2   t | ||jd |d ƒ}| ¡ }t| ||j|jƒS r@   )r®   rA   rè   r   r7  r8   ©r   r   r;   rA   r3  rä   r#   r#   r$   Úset_copyt  s    z_set_copy.<locals>.set_copyr#   )r9   rU   r;   rZ  r#   r#   r$   Ú	_set_copyp  s    r[  rè   c                 C   s   dd„ S )Nc                 S   s   t | ƒS rh   )r[  rP  r#   r#   r$   rJ  ~  rK  zol_set_copy.<locals>.<lambda>r#   rP  r#   r#   r$   Úol_set_copy|  s    r\  c                 C   sB   t | ||jd |d ƒ}t | ||jd |d ƒ}| |¡ |  ¡ S r>  )r®   rA   rë   rB  rY  r#   r#   r$   Úset_difference_update�  s    
r]  c                 C   s   t  ||¡}|tfS rh   )r   rG  r]  ©r9   ÚaÚbr;   r#   r#   r$   Ú_set_difference_updateŠ  s    ra  Údifference_updatec                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rh   )ra  ©r_  r`  r#   r#   r$   rJ  “  rK  z,set_difference_update_impl.<locals>.<lambda>©rX   rc  r#   r#   r$   Úset_difference_update_impl�  s    
re  c                 C   sB   t | ||jd |d ƒ}t | ||jd |d ƒ}| |¡ |  ¡ S r>  )r®   rA   rê   rB  rY  r#   r#   r$   Úset_intersection_update–  s    
rf  c                 C   s   t  ||¡}|tfS rh   )r   rG  rf  r^  r#   r#   r$   Ú_set_intersection_update�  s    rg  Úintersection_updatec                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rh   )rg  rc  r#   r#   r$   rJ  ¦  rK  z.set_intersection_update_impl.<locals>.<lambda>rd  rc  r#   r#   r$   Úset_intersection_update_impl£  s    
ri  c                 C   sB   t | ||jd |d ƒ}t | ||jd |d ƒ}| |¡ |  ¡ S r>  )r®   rA   rì   rB  rY  r#   r#   r$   Úset_symmetric_difference_update©  s    
rj  c                 C   s   t  ||¡}|tfS rh   )r   rG  rj  r^  r#   r#   r$   Ú _set_symmetric_difference_update°  s    rk  Úsymmetric_difference_updatec                 C   s   t | |ƒ dd„ S )Nc                 S   s
   t | |ƒS rh   )rk  rc  r#   r#   r$   rJ  ¹  rK  z6set_symmetric_difference_update_impl.<locals>.<lambda>rd  rc  r#   r#   r$   Ú$set_symmetric_difference_update_impl¶  s    
rm  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 r>  )r®   rA   r   r�   r"   rn   r¿   r   Úcastr8   rT   r³   r&  rÊ   rB  )r   r   r;   rA   r3  r9  r2  r:  r  r¢   Zcastedr#   r#   r$   Ú
set_update¼  s    


ro  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 r@   )r7  rA   ÚAssertionErrorr
   )r   r   r;   rA   ©rC   r#   r$   ÚcodegenÞ  s    z>gen_operator_impl.<locals>._set_operator_intr.<locals>.codegenr#   ©r9   r_  r`  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 rh   r#   rc  ©rt  r#   r$   rJ  ç  rK  z=gen_operator_impl.<locals>._ol_set_operator.<locals>.<lambda>rd  rc  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 rh   )rè   rb  ©r_  r`  rU   r#   r#   r$   Údifference_implú  s    
z,impl_set_difference.<locals>.difference_implrd  )r_  r`  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 rh   )r1  rè   rh  ry  r#   r#   r$   Úintersection_impl  s    

z+set_intersection.<locals>.intersection_implrd  )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 rh   )r1  rè   rl  ry  r#   r#   r$   Úsymmetric_difference_impl  s    

z;set_symmetric_difference.<locals>.symmetric_difference_implrd  )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 rh   )r1  rè   Úupdatery  r#   r#   r$   Ú
union_impl(  s    

zset_union.<locals>.union_implrd  )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 r>  )r®   rA   r÷   rY  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 rh   )r‡  rc  r#   r#   r$   rJ  H  rK  z set_isdisjoint.<locals>.<lambda>rd  rc  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ò   rY  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 rh   )rŠ  rc  r#   r#   r$   rJ  \  rK  zset_issubset.<locals>.<lambda>rd  rc  r#   r#   r$   Úset_issubsetW  s    
r‹  Ú
issupersetc                 C   s   t | |ƒ dd„ }|S )Nc                 S   s
   |  | ¡S rh   )rò   rc  r#   r#   r$   Úsuperset_impld  s    z%set_issuperset.<locals>.superset_implrd  )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 r>  )r®   rA   rø   rY  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 rh   )r�  rc  r#   r#   r$   rJ  y  rK  zset_eq.<locals>.<lambda>rd  rc  r#   r#   r$   Úset_equ  s    
r�  c                 C   s   t | |ƒ dd„ }|S )Nc                 S   s
   | |k S rh   r#   rc  r#   r#   r$   Úne_impl  s    zset_ne.<locals>.ne_implrd  )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   rx   T)rî   r‰  rY  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 rh   )r“  rc  r#   r#   r$   rJ  ”  rK  zset_lt.<locals>.<lambda>rd  rc  r#   r#   r$   Úset_lt�  s    
r”  c                 C   s   t | |ƒ dd„ }|S )Nc                 S   s   || k S rh   r#   rc  r#   r#   r$   Úgt_implš  s    zset_gt.<locals>.gt_implrd  )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   rx   rE   )r®   rA   Zptrtointrµ   r   r•   Zicmp_signed)r   r   r;   rA   r_  r`  ÚmaÚmbr#   r#   r$   Úset_isŸ  s
    r™  c                 C   s   |j |j kst‚|S rh   )rT   rp  )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   rX   Ú
namedtuplerY   Úobjectr^   r®   r)  r6  Úsetr8  ZIterableTyper;  r1  rP   r=  rÕ   ÚAnyr?  r@  ZSetIterZBORROWEDrA  rD  rH  rL  rO  rQ  rS  rU  rW  rX  r[  r\  r]  ra  re  rf  rg  ri  rj  rk  rm  ro  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

























	









ü

















