o
    iM                     @   s   d Z ddlZddlZddlmZ ddl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mZ dZer:d	nd
ZG dd deZG dd deZG dd deZG dd de
jZG dd deZdS )z2
Testing C implementation of the numba dictionary
    N)TestCase)generated_jit
_helperlibjittypedtypes)	IS_32BITS)UniTupleModel)register_modeltypeof_implunbox      c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$S )%DictzWA wrapper around the C-API to provide a minimal dictionary object for
    testing.
    c                 C   s$   || _ || _|| _| ||| _dS )z
        Parameters
        ----------
        tc : TestCase instance
        keysize : int
            byte size for the key
        valsize : int
            byte size for the value
        N)tckeysizevalsizedict_new_minsizedp)selfr   r   r    r   h/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/numba/tests/test_dictimpl.py__init__   s   
zDict.__init__c                 C   s   | j | j d S N)r   numba_dict_freer   r   r   r   r   __del__(   s   zDict.__del__c                 C   s   |   S r   )dict_lengthr   r   r   r   __len__+      zDict.__len__c                 C   sP   t | }t | }| jt|| j | jt|| j | || d S r   )bytesencoder   assertEquallenr   r   dict_insert)r   kvbkbvr   r   r   __setitem__.   s
   zDict.__setitem__c                 C   sB   t | }| jt|| j | |\}}|tkrt|	 S r   )
r!   r"   r   r#   r$   r   dict_lookup
DKIX_EMPTYKeyErrordecode)r   r&   r(   ixoldr   r   r   __getitem__5   s   zDict.__getitem__c                 C   s6   t | }| jt|| j | |st|d S r   )r!   r"   r   r#   r$   r   dict_delitemr-   )r   r&   r(   r   r   r   __delitem__>   s
   
zDict.__delitem__c                 C   s    z| | W S  t y   Y d S w r   )r-   )r   r&   r   r   r   getD   s
   
zDict.getc                 C      t | S r   )DictIterr   r   r   r   itemsJ   r    z
Dict.itemsc                 C   s   |   \}}| | fS r   )dict_popitemr.   )r   r&   r'   r   r   r   popitemM   s   zDict.popitemc                 C   s2   t  }| jt |d||}| j|d |S Nr   )ctypesc_void_pr   numba_dict_new_sizedbyrefr#   )r   key_sizeval_sizer   statusr   r   r   r   U   s   zDict.dict_new_minsizec                 C   s   | j | jS r   )r   numba_dict_lengthr   r   r   r   r   r   ]      zDict.dict_lengthc                 C   s.   t |}| j| j|||}| j|d d S r:   )hashr   numba_dict_insert_ezr   assertGreaterEqual)r   	key_bytes	val_byteshashvalrA   r   r   r   r%   `   s
   
zDict.dict_insertc                 C   s@   t |}t| j}| j| j|||}| j|t ||j	fS r   )
rD   r;   create_string_bufferr   r   numba_dict_lookupr   rF   r,   value)r   rG   rI   Zoldval_bytesr/   r   r   r   r+   g   s   

zDict.dict_lookupc                 C   sF   |  |\}}|tkrdS t|}| j| j||}| j|d dS )NFr   T)r+   r,   rD   r   numba_dict_delitemr   r#   )r   rG   r/   ZoldvalrI   rA   r   r   r   r2   p   s   zDict.dict_delitemc                 C   sZ   t | j}t | j}| j| j||}|dkr'|dkr!td| jd |j	|j	fS )Nr   popitem(): dictionary is emptyUnknown)
r;   rJ   r   r   r   numba_dict_popitemr   r-   Z_failrL   )r   rG   rH   rA   r   r   r   r8   y   s   zDict.dict_popitemc                 C   s   | j || j d S r   )r   numba_dict_iterr   )r   itptrr   r   r   	dict_iter      zDict.dict_iterc                 C   s   t d}t d}| j|t |t |}|dkr td|dkr&d S | j|d | jj|jt	 ddd | jj|jt	 ddd t j
| j |j}t j
| j |j}|j|jfS )Nr   zdictionary mutatedzkey not aligned)msgzval not aligned)r;   r<   r   numba_dict_iter_nextr>   
ValueErrorrF   r#   rL   ALIGNZc_charr   Zfrom_addressr   )r   rS   r(   r)   rA   keyvalr   r   r   dict_iter_next   s   

zDict.dict_iter_nextN)__name__
__module____qualname____doc__r   r   r   r*   r1   r3   r4   r7   r9   r   r   r%   r+   r2   r8   rT   r^   r   r   r   r   r      s&    			r   c                   @   s,   e Zd ZdZdd Zdd Zdd ZeZdS )	r6   zA iterator for the `Dict.items()`.

    Only the `.items()` is needed.  `.keys` and `.values` can be trivially
    implemented on the `.items` iterator.
    c                 C   sF   || _ | j j }tj| d| _t| jtj| _| j 	| j d S r:   )
parentr   numba_dict_iter_sizeofr;   c_char_pZit_state_bufcastr<   itrT   )r   rc   Zitsizer   r   r   r      s
   zDictIter.__init__c                 C   s   | S r   r   r   r   r   r   __iter__   s   zDictIter.__iter__c                 C   s2   | j | j}|d u rt|\}}| | fS r   )rc   r^   rg   StopIterationr.   )r   outr&   r'   r   r   r   __next__   s
   zDictIter.__next__N)r_   r`   ra   rb   r   rh   rk   nextr   r   r   r   r6      s    r6   c                   @   s   e Zd ZdZdd ZdS )Parametrizedz_supporting type for TestDictImpl.test_parametrized_types
    needs to be global to be cacheablec                 C   s   t dd |D sJ d S )Nc                 s   s    | ]}t |tV  qd S r   )
isinstancestr).0r'   r   r   r   	<genexpr>   s    z(Parametrized.__init__.<locals>.<genexpr>)all)r   tupr   r   r   r      s   zParametrized.__init__N)r_   r`   ra   rb   r   r   r   r   r   rm      s    rm   c                       s4   e Zd ZdZ fddZedd Zdd Z  ZS )ParametrizedTypezUthis is essentially UniTuple(unicode_type, n)
    BUT type name is the same for all nc                    s&   t t| d tj| _t|| _d S )Nrt   )superrt   r   r   unicode_typedtyper$   n)r   rL   	__class__r   r   r      s   zParametrizedType.__init__c                 C      | j S r   rx   r   r   r   r   r\      s   zParametrizedType.keyc                 C   r{   r   r|   r   r   r   r   r      s   zParametrizedType.__len__)	r_   r`   ra   rb   r   propertyr\   r   __classcell__r   r   ry   r   rt      s    
rt   c                   @   s~   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS ) TestDictImplc                 C   s$  t j}t j}t j}ddd}|dt j| _|dt jt |t jt jt jg| _|dd|g| _|dt j|g| _|d	t j|t j	|t j	g| _
|d
t j|t j	|t j	g| _|dt j||t jg| _|dt j|t j	t j	g| _|dt j| _|dd||g| _|dt j|t t jt t jg| _dS )zEBind to the c_helper library and provide the ctypes wrapper.
        r   c                 S   s    t j|g|R  }|tj|  S r   )r;   Z	CFUNCTYPEr   Z	c_helpers)namerestypeargtypesprotor   r   r   wrap   s   z TestDictImpl.setUp.<locals>.wrapZ	test_dictZdict_new_sizedZ	dict_freeNr   Zdict_insert_ezr+   r2   r8   Zdict_iter_sizeofrT   r^   )r   )r;   r<   Z	c_ssize_tc_intnumba_test_dictZPOINTERr=   r   rB   re   rE   rK   rM   rQ   Zc_size_trd   rR   rY   )r   Zdict_tZiter_tZhash_tr   r   r   r   setUp   s   





zTestDictImpl.setUpc                 C   s   |   }| |d d S r:   )r   r#   )r   retr   r   r   test_simple_c_test[  s   zTestDictImpl.test_simple_c_testc                 C   s  t | dd}| t|d | |d d|d< | t|d | |d | |d d d|d< | t|d | |d d d|d	< | t|d
 | |d d | |d	 d d|d< | t|d | |d d | |d	 d | |d d d S )Nr   r   r   abcdZbeefcafe   cafe0000cafe0001abce   cafe0002abcf   )r   r#   r$   assertIsNoner4   ZassertIsNotNoner   dr   r   r   test_insertion_small`  s&   z!TestDictImpl.test_insertion_smallc                 C   sx   t | dd}dd }dd }t|D ]}|||||< | t||d  qt|D ]}| ||| || q+d S )Nr   c                 S   
   d | S )Nz	key_{:04}formatr'   r   r   r   make_key     
z3TestDictImpl.check_insertion_many.<locals>.make_keyc                 S   r   )Nz	val_{:04}r   r   r   r   r   make_val  r   z3TestDictImpl.check_insertion_many.<locals>.make_valr   )r   ranger#   r$   )r   nmaxr   r   r   ir   r   r   check_insertion_many~  s   z!TestDictImpl.check_insertion_manyc                 C   s   | j dd | j dd | j dd | j dd | j dd | j dd | j dd | j d	d | j d
d | j dd | j dd | j dd d S )N   r   r   	          !   i     i  i  i   i  )r   r   r   r   r   test_insertion_many  s   z TestDictImpl.test_insertion_manyc                 C   s  t | dd}| t|d | |d d|d< d|d< d|d	< | t|d
 | |d d | |d d | |d	 d | t|d
 |d= | |d | |d d | |d	 d | t|d | t |d= W d    n1 sw   Y  |d	= | |d | |d d | |d	 | t|d |d= | |d | |d | |d	 | t|d d S )Nr   r   r   r   r   r   r   r   r   r   r   r   )r   r#   r$   r   r4   assertRaisesr-   r   r   r   r   test_deletion_small  s:   z TestDictImpl.test_deletion_smallr   c                 C   s  t | t| dd}i }dd }dd }t|D ]
}	||	|||	< qt|D ]}	||	}
||	}|||
< | ||
 | q(| t|| t t||}| }t	|ddD ]\}	}
||
= ||
= | t|||	  qY| t|||  |D ]
}
| 
||
 qz|D ]}
| ||
 ||
  qt|D ]}	|||	 }
|||	 }|||
< |||
< q| t|t| |D ]}
| ||
 ||
  qd S )Nr   c                 S   r   Nzk_{:06x}r   r   r   r   r   r     r   z4TestDictImpl.check_delete_randomly.<locals>.make_keyc                 S   r   Nzv_{:06x}r   r   r   r   r   r     r   z4TestDictImpl.check_delete_randomly.<locals>.make_valr   )start)randomseedr   r   r#   r$   samplelistcopy	enumerater   r4   )r   r   ndropnrefillr   r   keysr   r   r   r&   r'   droplistZremainr   r   r   check_delete_randomly  sB   

z"TestDictImpl.check_delete_randomlyc                 C   st   | j dddd | j dddd | j ddd	d | j dd
dd | j dddd | j dddd | j dddd d S )Nr   r   r   r   r      
   r   d   2      c   r   i  r   i   r   r   r   r   r   test_delete_randomly  s   z!TestDictImpl.test_delete_randomlyc                 C   s   | j dddd d S )Ni   i   r   r   r   r   r   r   r   test_delete_randomly_large  s   z'TestDictImpl.test_delete_randomly_largec           
      C   sN  d}t | dd}dd }dd }t|D ]
}|||||< q| t|| | \}}| t||d  | ||t| | ||t| t|r{t|}| \}}| t||d  | ||t| | ||t| t|sO| t|d | t}	|  W d    n1 sw   Y  | d	t|	j	 d S )
Nr   r   c                 S   r   r   r   r   r   r   r   r     r   z+TestDictImpl.test_popitem.<locals>.make_keyc                 S   r   r   r   r   r   r   r   r     r   z+TestDictImpl.test_popitem.<locals>.make_valr   r   rO   )
r   r   r#   r$   r9   r   r-   ZassertInro   	exception)
r   r   r   r   r   r   r&   r'   rx   Zraisesr   r   r   test_popitem  s4   
zTestDictImpl.test_popitemc                    s   t | dd}d dd } fdd}t D ]
}|||||< qt| D ]\}\}}| ||| | ||| q'd S )Nr   i  c                 S   r   Nz{:04}r   r   r   r   r   r   <  r   z.TestDictImpl.test_iter_items.<locals>.make_keyc                    s   d |   S r   r   r   r   r   r   r   ?  rC   z.TestDictImpl.test_iter_items.<locals>.make_valr   r   r   r7   r#   )r   r   r   r   r   r&   r'   r   r   r   test_iter_items7  s   zTestDictImpl.test_iter_itemsc           
         s   t |  } fdd}fdd}tD ]
}|||||< qt| D ]\}\}}	| ||| | |||	 q(d S )Nc                    s   d |  d   S )N{:0{}}r   r   )r?   r   r   r   N  rU   z+TestDictImpl.check_sizing.<locals>.make_keyc                    s   d  |  d d  S )Nr   r   r   r   )r   r@   r   r   r   Q  s   z+TestDictImpl.check_sizing.<locals>.make_valr   )
r   r?   r@   r   r   r   r   r   r&   r'   r   )r?   r   r@   r   check_sizingJ  s   zTestDictImpl.check_sizingc                 C   s(   t ddD ]}| j||d| d qd S )Nr   r   r   )r?   r@   r   )r   r   )r   r   r   r   r   test_sizing\  s   zTestDictImpl.test_sizingc                    s   t tt ttdd }ttdd }tdd  tddd fd	d
}tdtd}}||| |	   |
  |j  tdD ]
}| ||| qIdS )z*https://github.com/numba/numba/issues/6401c                 S   r5   r   )rt   )r]   cr   r   r   typeof_unitf  s   z9TestDictImpl.test_parametrized_types.<locals>.typeof_unitc                 S   s   | t| jt| |S r   )r   r   ZUniTuplerw   r$   )typobjcontextr   r   r   unbox_parametrizedj  s   z@TestDictImpl.test_parametrized_types.<locals>.unbox_parametrizedc                    s   |   fdd}|S )Nc                    s   t jtj }| |d< d S )Ndata)r   r   emptyr   rv   )r'   r   r   r   r   %objmode_vs_cache_vs_parametrized_implr  s   zzTestDictImpl.test_parametrized_types.<locals>.dict_vs_cache_vs_parametrized.<locals>.objmode_vs_cache_vs_parametrized_implr   )r'   r   r   r   r   dict_vs_cache_vs_parametrizedn  s   zKTestDictImpl.test_parametrized_types.<locals>.dict_vs_cache_vs_parametrizedT)Znopythoncachec                    s    |   | d S r   r   )xyr   r   r   set_parametrized_datay  s   zCTestDictImpl.test_parametrized_types.<locals>.set_parametrized_data)ab)r   r   N)r
   rt   r	   r   registerrm   r   r   r   Z_make_finalizerZ_reset_overloadsZ	targetctxinitr   r   )r   r   r   r   r   r   iir   r   r   test_parametrized_typesa  s"   




	


z$TestDictImpl.test_parametrized_typesN)r   )r_   r`   ra   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s      	
)7
"r   )rb   r;   r   Znumba.tests.supportr   Znumbar   r   r   r   r   Znumba.core.configr   Znumba.core.datamodel.modelsr	   Znumba.extendingr
   r   r   r,   r[   objectr   r6   tuplerm   Typert   r   r   r   r   r   <module>   s      