U
    ,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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 dd	lmZ dd
l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+e,dd Z-G d!d" d"e.Z/G d#d$ d$e.Z0G d%d& d&e.Z1d'd( Z2ee3d)d* Z4ee3ej5d+d, Z6ee7ej8d-d. Z9eej:ej8ej;d/d0 Z<ed1ej8d2d3 Z=ed4ej>eej?d5d6 Z@ed7ej8ej;d8d9 ZAed:ej8ej;d;d< ZBed=ej8d>d? ZCed@ej8ej;dAdB ZDedCej8dDdE ZEedFej8dGdH ZFedIej8ej5dJdK ZGedLej8ej8dMdN ZHedOej8ej8dPdQ ZIedRej8ej5dSdT ZJejKeHfejLeJfejMeGfejNeIffD ]&\ZOZPeeOej8ej8ePfdUdVZQqeejRej8ej8edWej8ej8dXdY ZSeejTej8ej8edZej8ej8d[d\ ZUeejVej8ej8ed]ej8ej8d^d_ ZWeejXej8ej8ed`ej8ej8dadb ZYedcej8ej8ddde ZZeej[ej8ej8edfej8ej8dgdh Z\eej]ej8ej8ediej8ej8djdk Z^eej_ej8ej8dlde ZZeej`ej8ej8dmdn Zaeejbej8ej8dodp Zceejdej8ej8dqdr Zeeejfej8ej8dsdt Zgeej8ej8dudv ZhdS )wz&
Support for native homogeneous sets.
    N)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)cached_property)	quicksort)slicing)	intrinsic)NumbaValueErrorc                 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    8/tmp/pip-unpacked-wheel-eu7e0c37/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   r4   argsr5   r    r!   implL   s    z'_get_hash_value_intrinsic.<locals>.impl)r+   r,   r-   )r6   r5   r@   r7   r8   r    r?   r!   _get_hash_value_intrinsicJ   s    
rA   c                 C   s   t |jt}|d||S )z8
    Whether the hash value denotes an empty entry.
    ==)r   r0   r1   EMPTYicmp_unsigned)r   r   r:   emptyr    r    r!   is_hash_emptyS   s    rF   c                 C   s   t |jt}|d||S )z9
    Whether the hash value denotes a deleted entry.
    rB   r   r0   r1   DELETEDrD   r   r   r:   Zdeletedr    r    r!   is_hash_deletedZ   s    rJ   c                 C   s   t |jt}|d||S )z9
    Whether the hash value denotes an active entry.
    <rG   rI   r    r    r!   r/   a   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_payloadZ_get_ptr_by_name_entries_ptr)selfr   r   r   r   r   r    r    r!   __init__o   s    z_SetPayload.__init__c                 C   s   | j jS NrV   maskrY   r    r    r!   r]   x   s    z_SetPayload.maskc                 C   s   || j _d S r[   r\   rY   r5   r    r    r!   r]   |   s    c                 C   s   | j jS r[   rV   usedr^   r    r    r!   ra      s    z_SetPayload.usedc                 C   s   || j _d S r[   r`   r_   r    r    r!   ra      s    c                 C   s   | j jS r[   rV   fillr^   r    r    r!   rc      s    z_SetPayload.fillc                 C   s   || j _d S r[   rb   r_   r    r    r!   rc      s    c                 C   s   | j jS r[   rV   fingerr^   r    r    r!   re      s    z_SetPayload.fingerc                 C   s   || j _d S r[   rd   r_   r    r    r!   re      s    c                 C   s   | j jS r[   rV   dirtyr^   r    r    r!   rg      s    z_SetPayload.dirtyc                 C   s   || j _d S r[   rf   r_   r    r    r!   rg      s    c                 C   s   | j S )z>
        A pointer to the start of the entries array.
        )rW   r^   r    r    r!   rR      s    z_SetPayload.entriesc                 C   s   | j S )zC
        A pointer to the start of the NRT-allocated area.
        )rX   r^   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   geprT   rW   rS   r   r   r#   rU   )rY   idxZ	entry_ptrrO   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.
            rB   N)rj   r,   if_thenrD   keybranchrF   rJ   loadr3   store)irO   Z
entry_hasheqjZbb_foundZbb_not_foundr   r   Zeqfn
for_insertZ
free_indexZfree_index_sentinelr:   itemrY   r    r!   check_entry   s     

 z(_SetPayload._lookup.<locals>.check_entryrB   found)#rS   rT   r1   r]   rU   dtyper*   r+   operatorrs   r-   r.   r   r0   r   alloca_once_valueand_append_basic_block	for_rangeLINEAR_PROBESrp   addrq   ro   
goto_blocklshrmulr3   rD   position_at_endphiZIntTypeZadd_incomingtrue_bit	false_bit)rY   rw   r:   rv   intp_tr]   rz   Ztyctxr7   r8   oneZfiveZperturbrN   bb_bodybb_endrx   rr   prt   ry   r    ru   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.
        rk   startrM   N)rS   rT   get_value_typer   intpr   r0   r   r]   r   r   rj   rN   r/   r,   rm   rL   rP   )rY   r   r   r   r   r   sizeZ
range_looprO   is_usedloopr    r    r!   _iterate/  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   rk   Znext_entry_bodyZnext_entry_endN)rS   rT   r   r   r   r   r0   r]   r~   r   r|   re   ro   r   rp   r}   r   rq   rj   r/   r,   cbranchr   )rY   r   r   r   zeror   r]   r   r   rN   rr   rO   r   r    r    r!   _next_entryC  s*    






z_SetPayload._next_entry)F)N)__name__
__module____qualname__rZ   propertyr]   setterra   rc   re   rg   rR   r   rj   r   
contextlibcontextmanagerr   r   r    r    r    r!   rQ   m   s>   	













vrQ   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 r[   )rS   rT   rU   r%   
_entrysizemake_helper_set)rY   r   r   r   set_valr    r    r!   rZ   n  s
    zSetInstance.__init__c                 C   s   | j jS r[   )rU   rz   r^   r    r    r!   rz   u  s    zSetInstance.dtypec                 C   s.   | j }| j}| j j|| j}t||| j|S )z/
        The _SetPayload for this set.
        )rS   rT   nrtmeminfo_datameminforQ   rU   )rY   r   r   r   r    r    r!   r   y  s    zSetInstance.payloadc                 C   s
   | j  S r[   )r   	_getvaluer^   r    r    r!   r5     s    zSetInstance.valuec                 C   s   | j jS r[   )r   r   r^   r    r    r!   r     s    zSetInstance.meminfoc                 C   s   | j jS r[   r   parentr^   r    r    r!   r     s    zSetInstance.parentc                 C   s   || j _d S r[   r   r_   r    r    r!   r     s    c                 C   s   | j jS )z<
        Return the number of elements in the size.
        )r   ra   r^   r    r    r!   get_size  s    zSetInstance.get_sizec                 C   s    | j jr|rtjntj| j_d S r[   )rU   Z	reflectedr   r   r   r   rg   rY   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 )Nrk   TZlikely)rS   rT   r,   incref_valuern   ra   r   r0   r1   r   rm   rF   rc   upsizer   )rY   r   rO   rw   r:   	do_resizer   r   old_hashra   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rv   rk   r   )rS   rT   r   not_rm   rj   r,   r   rn   ra   r   r0   r1   r   rF   rc   r   r   )rY   r   rw   r:   r   	do_increfr   r   ry   rr   	not_foundrO   r   ra   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 )Nrk   T)r   r0   r,   r1   rH   decref_valuern   ra   rT   subdownsizer   )rY   r   rO   r   	do_decrefra   r   r    r    r!   _remove_entry  s    
zSetInstance._remove_entryc           
   	   C   sN   | j }| j}|||\}}|| ||}	| ||	| W 5 Q R X |S r[   )rS   rT   r   rm   rj   r   )
rY   r   rw   r:   r   r   r   ry   rr   rO   r    r    r!   _remove_key  s    
zSetInstance._remove_keyc                 C   s8   | j }| j}| j}t||| jj|}| |||| d S r[   )rS   rT   r   r<   rU   rz   r   )rY   rw   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)rS   rT   r   _pyapi_get_hash_valuer   )rY   pyapirw   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 r[   )rA   )r   r    r    r!   wrapper  s    z2SetInstance._pyapi_get_hash_value.<locals>.wrapperFr   )
rU   rz   r   r   r   	signatureZcall_jit_coderm   retZget_null_object)rY   r   r   r   rw   argtypesZrestyr   r>   r8   Zis_errorretvalr    r    r!   r     s    
z!SetInstance._pyapi_get_hash_valuec                 C   s8   | j }| j}| j}t||| jj|}|||\}}|S r[   )rS   rT   r   r<   rU   rz   r   )rY   rw   r   r   r   r:   ry   rr   r    r    r!   contains  s    zSetInstance.containsc                 C   s6   | j }| j}| j}t||| jj|}| |||}|S r[   )rS   rT   r   r<   rU   rz   r   )rY   rw   r   r   r   r:   ry   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   )rS   rT   r   rU   rz   r   Zalloca_oncer   r   rq   rn   r   rp   )rY   r   r   Zltyrn   r   rO   r    r    r!   pop!  s    
zSetInstance.popc                 C   s<   | j }| j}|tj}t|t}| | | 	d d S )NT)
rS   rT   r   r   r   r   r0   MINSIZE_replace_payloadr   )rY   r   r   r   minsizer    r    r!   clear0  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.
        NrB   Tr   F)zcannot copy setr   )rS   rT   r   ra   rc   r1   rU   rD   if_else_copy_payloadrm   r   	call_convreturn_user_excMemoryErrorchoose_alloc_size_allocate_payloadr   rO   r   rn   r,   )rY   r   r   r   ra   rc   otherZno_deleted_entriesZif_no_deletedZ
if_deletedoknentriesother_payloadr   rO   r    r    r!   copy9  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)rS   rT   r   r   rO   r   rn   r,   rm   r   r   r   ra   )
rY   r   r   r   r   r   r   rO   ry   _r    r    r!   	intersect`  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)
rS   rT   r   r   rO   r   rn   r,   r   ra   )rY   r   r   r   r   r   r   rO   r    r    r!   
differencer  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)rS   rT   r   r   rO   rn   r,   r   rj   r   r   r   r   ra   )rY   r   r   r   r   r   rn   r:   r   ry   rr   rO   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 )NrK   <=)rS   rT   r   r   r|   r   r   rD   ra   rq   r   r   rO   r   rn   r,   rm   r   rP   rp   )rY   r   strictr   r   r   r   cmp_opresZ
if_smaller	if_largerr   rO   ry   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 r[   )
r   rO   r   rn   r,   rm   rq   r   r   rP   )ZsmallerZlargerr   rO   ry   r   r   r   r    r!   check  s    
z%SetInstance.isdisjoint.<locals>.check>)
rS   rT   r   r   r|   r   r   rD   ra   rp   )rY   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 )NrB   )rS   rT   r   r   r|   r   r   rD   ra   r   rO   r   rn   r,   rm   r   rq   r   rP   rp   )rY   r   r   r   r   r   r   Zif_same_sizer   r   rO   ry   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   r0   r   
isinstanceintr   r   )	clsr   r   r   nitemsr   r   rY   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   rm   r   r   r   r   )r   r   r   r   r   r   rY   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   increfr5   )r   r   r   r   r   rY   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.
        rk   calcsize.bodycalcsize.end>=Fr   )r1   r   r0   r   shlr   r|   r~   ro   r   rp   rD   rm   rq   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.
        rk      r   Fr   r   r   zKupsize to %zd items: current size = %zd, min entries = %zd, new size = %zd
zcannot grow setN)rS   rT   r1   r   r0   r   r   r   r]   rD   rm   r   r|   r~   ro   r   rp   rq   r   r   DEBUG_ALLOCSprintf_resize)rY   r   r   r   r   r   twor   r   r   need_resize
new_size_pr   r   new_sizeis_too_smallr    r    r!   r   ;  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.
        rk   r   r   r   rK   Fr   r   r   r   zMdownsize to %zd items: current size = %zd, min entries = %zd, new size = %zd
zcannot shrink setN)rS   rT   r1   r   r0   r   r   r   r3   rD   r   r]   r}   rm   r   r|   r~   ro   r   rp   r   rq   r   r   r   r   )rY   r   r   r   r   r   r   r   r   r   max_sizer   r  r  r   r   r  r  r    r    r!   r   i  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)rS   rT   r   rm   r   r   r   r   r   r   rO   r   rn   r,   _free_payloadr   )
rY   r   r   errmsgr   r   Zold_payloadr   r   rO   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)rS   rT   r   r   rO   r   rn   r  r   r   rm   r   r   r   r   )rY   r   r   r   r   rO   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   rk   Fr   T)r      .allocated %zd bytes for set at %p: mask = %zd
),rS   rT   r   r|   r   r   r   r   r   r0   r   r   rU   r$   r   Zmuladd_with_overflowrm   rq   r   rp   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   ra   rc   re   r   r]   r   r   )rY   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)rS   r   Zmeminfo_varsize_freerT   r   )rY   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   rk   Tr   Fr  )-rS   rT   r   r|   r   r   r   r   r   r0   r   r   rU   r$   r   r]   r   r   rm   rp   r  r  r   r  r   r  r  r   rq   r   r   r   r   ra   rc   re   Z
raw_memcpyrR   r   r   rO   rn   r   r   r   )rY   Zsrc_payloadr   r   r   r   r   r   r   r  r  r]   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rd|_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VoidTyperU   rz   Zget_or_insert_functionZis_declarationlinkageZ	IRBuilderr~   rQ   r>   r   rO   r   decrefrn   Zret_void)rY   r   r  Z	llvoidptrZllsize_tr7   fnamer9   r   r   r   rO   r    r    r!   r  a  s"    
 zSetInstance._imp_dtorc                 C   s   | j j| j| jj| dS )z Incref an element value
        N)rS   r   r   rT   rU   rz   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)rS   r   r  rT   rU   rz   r   r    r    r!   r     s    zSetInstance.decref_value)T)TT)TT)T)T)T)F)N)N)F).r   r   r   rZ   r   rz   r   r5   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   l  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 r[   )rS   rT   rU   r   _iterr   r   r   rQ   	containerrV   )rY   r   r   	iter_typeZiter_valr   r    r    r!   rZ     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   rN   r   )r   r   r   r"  r   Zset_instrY   rN   r    r    r!   from_set  s    
zSetIterInstance.from_setc                 C   s
   | j  S r[   )r   r   r^   r    r    r!   r5     s    zSetIterInstance.valuec                 C   s   | j jS r[   )r   r   r^   r    r    r!   r     s    zSetIterInstance.meminfoc                 C   s   | j | jjS r[   )rT   rp   r   rN   r^   r    r    r!   rN     s    zSetIterInstance.indexc                 C   s   | j || jj d S r[   )rT   rq   r   rN   r_   r    r    r!   rN     s    c              	   C   sr   | j }| j}t|jd}|  |j|d:}|j}|  |	|j
 | j|j || _ |  W 5 Q R X d S )Nrk   r   )rN   rV   r   r0   r1   Zset_exhaustedr   rO   Z	set_validZyield_rn   rT   r   rP   )rY   resultrN   r   r   r   rO   r    r    r!   iternext  s    zSetIterInstance.iternextN)r   r   r   rZ   r  r$  r   r5   r   rN   r   r&  r    r    r    r!   r    s   




r  c              	   C   s   t |}t| |||}|dkrt||}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   rp   rh   rN   r   r
   r5   )r   r   r   itemsr   instarrayZ	array_ptrcountr   rw   r    r    r!   	build_set  s    r,  c                 C   s$   |j }t| ||}t| |||jS r[   )return_typer   r   r
   r5   )r   r   r8   r>   r   r)  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 r[   )r-  r>   r   r   r   r   r   r5   r   r  rz   r
   )
r   r   r8   r>   r   
items_typer(  nr)  r   r    r    r!   set_constructor  s    r1  c                 C   s    t | ||jd |d }| S r=   )r   r>   r   r   r   r8   r>   r)  r    r    r!   set_len  s    r3  c                 C   s&   t | ||jd |d }||d S Nr   rk   )r   r>   r   r2  r    r    r!   in_set  s    r5  Zgetiterc                 C   s(   t | ||j|d }t| ||j|jS r=   )r  r$  r-  r	   r5   r2  r    r    r!   getiter_set  s    r6  r&  c                 C   s&   t | ||jd |d }|| d S r=   )r  r>   r&  )r   r   r8   r>   r%  r)  r    r    r!   iternext_listiter  s    r7  zset.addc                 C   s2   t | ||jd |d }|d }|| |  S r4  )r   r>   r   get_dummy_valuer   r   r8   r>   r)  rw   r    r    r!   set_add  s    
r:  zset.discardc                 C   s2   t | ||jd |d }|d }|| |  S r4  )r   r>   r   r8  r9  r    r    r!   set_discard  s    
r;  zset.popc              	   C   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   r>   r   ra   rm   r   r  r   r   KeyErrorr   )r   r   r8   r>   r)  ra   r    r    r!   set_pop  s    
r=  z
set.removec              	   C   sb   t | ||jd |d }|d }||}|j||dd | j|td W 5 Q R X |  S )Nr   rk   Fr   )zset.remove(): key not in set)	r   r>   r   rm   r   r   r   r<  r8  )r   r   r8   r>   r)  rw   ry   r    r    r!   
set_remove'  s    

r>  z	set.clearc                 C   s(   t | ||jd |d }|  |  S r=   )r   r>   r   r8  r2  r    r    r!   	set_clear5  s    r?  zset.copyc                 C   s2   t | ||jd |d }| }t| ||j|jS r=   )r   r>   r   r
   r-  r5   r   r   r8   r>   r)  r   r    r    r!   set_copy;  s    rA  zset.difference_updatec                 C   sB   t | ||jd |d }t | ||jd |d }|| |  S r4  )r   r>   r   r8  r@  r    r    r!   set_difference_updateA  s    
rB  zset.intersection_updatec                 C   sB   t | ||jd |d }t | ||jd |d }|| |  S r4  )r   r>   r   r8  r@  r    r    r!   set_intersection_updateJ  s    
rC  zset.symmetric_difference_updatec                 C   sB   t | ||jd |d }t | ||jd |d }|| |  S r4  )r   r>   r   r8  r@  r    r    r!   set_symmetric_difference_updateS  s    
rD  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 r4  )r   r>   r   r   r   ra   r   r   castr5   rz   r   r  r   r8  )r   r   r8   r>   r)  r/  r(  r0  r  r   Zcastedr    r    r!   
set_update\  s    


rF  c                 C   s:   |j |jd kst|| ||| t| ||jd |d S r=   )r-  r>   AssertionErrorr	   )r   r   r8   r>   op_implr    r    r!   set_inplace  s    rI  zset.differencec                 C   s   dd }|  ||||S )Nc                 S   s   |   }|| |S r[   )r   difference_updateabsr    r    r!   difference_impl  s    
z'set_difference.<locals>.difference_implZcompile_internal)r   r   r8   r>   rO  r    r    r!   set_difference  s    rQ  zset.intersectionc                 C   s   dd }|  ||||S )Nc                 S   s@   t | t |k r&|  }|| |S | }||  |S d S r[   )r'  r   intersection_updaterK  r    r    r!   intersection_impl  s    

z+set_intersection.<locals>.intersection_implrP  )r   r   r8   r>   rS  r    r    r!   set_intersection  s    
rT  zset.symmetric_differencec                 C   s   dd }|  ||||S )Nc                 S   s@   t | t |kr&|  }|| |S | }||  |S d S r[   )r'  r   symmetric_difference_updaterK  r    r    r!   symmetric_difference_impl  s    

z;set_symmetric_difference.<locals>.symmetric_difference_implrP  )r   r   r8   r>   rV  r    r    r!   set_symmetric_difference  s
    
 rW  z	set.unionc                 C   s   dd }|  ||||S )Nc                 S   s@   t | t |kr&|  }|| |S | }||  |S d S r[   )r'  r   updaterK  r    r    r!   
union_impl  s    

zset_union.<locals>.union_implrP  )r   r   r8   r>   rY  r    r    r!   	set_union  s    
rZ  zset.isdisjointc                 C   s:   t | ||jd |d }t | ||jd |d }||S r4  )r   r>   r   r@  r    r    r!   set_isdisjoint  s    r[  zset.issubsetc                 C   s:   t | ||jd |d }t | ||jd |d }||S r4  r   r>   r   r@  r    r    r!   set_issubset  s    r]  zset.issupersetc                 C   s   dd }|  ||||S )Nc                 S   s
   | | S r[   )r   rL  rM  r    r    r!   superset_impl  s    z%set_issuperset.<locals>.superset_implrP  )r   r   r8   r>   r_  r    r    r!   set_issuperset  s    r`  c                 C   s:   t | ||jd |d }t | ||jd |d }||S r4  )r   r>   r   r@  r    r    r!   r[    s    c                 C   s   dd }|  ||||S )Nc                 S   s
   | |k S r[   r    r^  r    r    r!   ne_impl  s    zset_ne.<locals>.ne_implrP  )r   r   r8   r>   ra  r    r    r!   set_ne  s    rb  c                 C   s>   t | ||jd |d }t | ||jd |d }|j|ddS )Nr   rk   T)r   r\  r@  r    r    r!   set_lt  s    rc  c                 C   s   dd }|  ||||S )Nc                 S   s   || k S r[   r    r^  r    r    r!   gt_impl  s    zset_gt.<locals>.gt_implrP  )r   r   r8   r>   rd  r    r    r!   set_gt  s    re  c                 C   s^   t | ||jd |d }t | ||jd |d }||jtj}||jtj}|d||S )Nr   rk   rB   )r   r>   Zptrtointr   r   r   Zicmp_signed)r   r   r8   r>   rL  rM  mambr    r    r!   set_is  s
    rh  c                 C   s   |j |j kst|S r[   )rz   rG  )r   r   ZfromtyZtotyr   r    r    r!   
set_to_set  s    ri  )i__doc__collectionsr   mathr{   Zllvmliter   Z
numba.corer   r   r   Znumba.core.imputilsr   r   r   r	   r
   r   r   r   r   Znumba.core.utilsr   Z
numba.miscr   Znumba.cpythonr   Znumba.extendingr   Znumba.core.errorsr   r"   r%   rC   rH   r2   r   r   r   r<   rA   rF   rJ   r/   
namedtuplerL   objectrQ   r   r  r,  setr.  ZIterableTyper1  r'  Setr3  r   Anyr5  r6  ZSetIterZBORROWEDr7  r:  r;  r=  r>  r?  rA  rB  rC  rD  rF  iandiorisubixorZop_rH  rI  r   rQ  r}   rT  xorrW  or_rZ  r[  ler]  ger`  rs   nerb  ltrc  gtre  is_rh  ri  r    r    r    r!   <module>   s   ,
	        "6













	














