
    xKgFN                         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	 ddl
mZ ddlmZ ddlmZmZmZmZ dZerd	nd
Z G d de      Z G d de      Z G d de      Z G d de	j4                        Z G d de      Zy)z2
Testing C implementation of the numba dictionary
    N)TestCase)
_helperlibjittypedtypes)	IS_32BITS)UniTupleModel)register_modeltypeof_implunboxoverload      c                   v    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)DictzWA wrapper around the C-API to provide a minimal dictionary object for
    testing.
    c                 \    || _         || _        || _        | j                  ||      | _        y)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   s       ]/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/numba/tests/test_dictimpl.py__init__zDict.__init__   s-     ''9    c                 N    | j                   j                  | j                         y N)r   numba_dict_freer   r   s    r   __del__zDict.__del__(   s    (r   c                 "    | j                         S r   )dict_lengthr    s    r   __len__zDict.__len__+   s    !!r   c                 H   t        |j                               }t        |j                               }| j                  j                  t	        |      | j
                         | j                  j                  t	        |      | j                         | j                  ||       y r   )bytesencoder   assertEquallenr   r   dict_insert)r   kvbkbvs        r   __setitem__zDict.__setitem__.   sj    188:188:CGT\\2CGT\\2R r   c                     t        |j                               }| j                  j                  t	        |      | j
                         | j                  |      \  }}|t        k(  rt        |j                         S r   )
r&   r'   r   r(   r)   r   dict_lookup
DKIX_EMPTYKeyErrordecode)r   r+   r-   ixolds        r   __getitem__zDict.__getitem__5   s[    188:CGT\\2""2&CN::<r   c                     t        |j                               }| j                  j                  t	        |      | j
                         | j                  |      st        |      y r   )r&   r'   r   r(   r)   r   dict_delitemr3   )r   r+   r-   s      r   __delitem__zDict.__delitem__>   sK    188:CGT\\2  $1+ %r   c                 ,    	 | |   S # t         $ r Y y w xY wr   )r3   )r   r+   s     r   getzDict.getD   s"    	7N 		s    	c                     t        |       S r   )DictIterr    s    r   itemsz
Dict.itemsJ   s    ~r   c                 h    | j                         \  }}|j                         |j                         fS r   )dict_popitemr4   )r   r+   r,   s      r   popitemzDict.popitemM   s+      "1xxz188:%%r   c                     t        j                         }| j                  j                  t        j                  |      d||      }| j                  j                  |d       |S Nr   )ctypesc_void_pr   numba_dict_new_sizedbyrefr(   )r   key_sizeval_sizer   statuss        r   r   zDict.dict_new_minsizeU   sO    __--LLa8
 	FA&	r   c                 L    | j                   j                  | j                        S r   )r   numba_dict_lengthr   r    s    r   r#   zDict.dict_length]   s    ww((11r   c                     t        |      }| j                  j                  | j                  |||      }| j                  j	                  |d       y rD   )hashr   numba_dict_insert_ezr   assertGreaterEqual)r   	key_bytes	val_byteshashvalrK   s        r   r*   zDict.dict_insert`   sB    y/--GGY
 	""61-r   c                    t        |      }t        j                  | j                        }| j                  j                  | j                  |||      }| j                  j                  |t               ||j                  fS r   )
rO   rE   create_string_bufferr   r   numba_dict_lookupr   rQ   r2   value)r   rR   rT   oldval_bytesr5   s        r   r1   zDict.dict_lookupg   sg    y/224<<@WW&&GGY
 	""2z2<%%%%r   c                     | j                  |      \  }}|t        k(  ryt        |      }| j                  j	                  | j
                  ||      }| j                  j                  |d       y)NFr   T)r1   r2   rO   r   numba_dict_delitemr   r(   )r   rR   r5   oldvalrT   rK   s         r   r9   zDict.dict_delitemp   s]    %%i0
Fy/++DGGWbAFA&r   c                 \   t        j                  | j                        }t        j                  | j                        }| j                  j                  | j                  ||      }|dk7  r+|dk(  rt        d      | j                  j                  d       |j                  |j                  fS )Nr   popitem(): dictionary is emptyUnknown)
rE   rV   r   r   r   numba_dict_popitemr   r3   _failrX   )r   rR   rS   rK   s       r   rA   zDict.dict_popitemy   s    //=	//=	++DGGY	JQ;|?@@i(	//r   c                 P    | j                   j                  || j                         y r   )r   numba_dict_iterr   )r   itptrs     r   	dict_iterzDict.dict_iter   s    tww/r   c                    t        j                  d      }t        j                  d      }| j                  j                  |t        j                  |      t        j                  |            }|dk(  rt        d      |dk(  ry | j                  j                  |d       | j                  j                  |j                  t        z  dd       | j                  j                  |j                  t        z  dd       t         j                  | j                  z  j                  |j                        }t         j                  | j                  z  j                  |j                        }|j                  |j                  fS )Nr   zdictionary mutatedzkey not aligned)msgzval not aligned)rE   rF   r   numba_dict_iter_nextrH   
ValueErrorrQ   r(   rX   ALIGNc_charr   from_addressr   )r   re   r-   r.   rK   keyvals          r   dict_iter_nextzDict.dict_iter_next   s   __Q__Q--6<<#V\\"%5
 R<122r\GG&&vq1
 GG5 0!9JKGG5 0!9JK==4<</==bhhGC==4<</==bhhGC99cii''r   N)__name__
__module____qualname____doc__r   r!   r$   r/   r7   r:   r<   r?   rB   r   r#   r*   r1   r9   rA   rf   rr    r   r   r   r      s\    :)"! &2.&	00(r   r   c                   &    e Zd ZdZd Zd Zd ZeZy)r>   zA iterator for the `Dict.items()`.

    Only the `.items()` is needed.  `.keys` and `.values` can be trivially
    implemented on the `.items` iterator.
    c                 D   || _         | j                   j                  j                         }t        j                  |z  d      | _        t        j                  | j
                  t        j                        | _        | j                   j                  | j                         y rD   )
parentr   numba_dict_iter_sizeofrE   c_char_pit_state_bufcastrF   itrf   )r   rz   itsizes      r   r   zDictIter.__init__   sg    668#__v5q9++d//Adgg&r   c                     | S r   rw   r    s    r   __iter__zDictIter.__iter__   s    r   c                     | j                   j                  | j                        }|t        |\  }}|j	                         |j	                         fS r   )rz   rr   r   StopIterationr4   )r   outr+   r,   s       r   __next__zDictIter.__next__   sE    kk((1;DAq88:qxxz))r   N)rs   rt   ru   rv   r   r   r   nextrw   r   r   r>   r>      s    
'* Dr   r>   c                       e Zd ZdZd Zy)Parametrizedz_supporting type for TestDictImpl.test_parametrized_types
    needs to be global to be cacheablec                 ,    t        d |D              sJ y )Nc              3   <   K   | ]  }t        |t                y wr   )
isinstancestr).0r,   s     r   	<genexpr>z(Parametrized.__init__.<locals>.<genexpr>   s     3s!:a%ss   )all)r   tups     r   r   zParametrized.__init__   s    3s3333r   N)rs   rt   ru   rv   r   rw   r   r   r   r      s    *4r   r   c                   8     e Zd ZdZ fdZed        Zd Z xZS )ParametrizedTypezUthis is essentially UniTuple(unicode_type, n)
    BUT type name is the same for all nc                 v    t         t        |   d       t        j                  | _        t        |      | _        y )Nr   )superr   r   r   unicode_typedtyper)   n)r   rX   	__class__s     r   r   zParametrizedType.__init__   s,    ./AB''
Ur   c                     | j                   S r   r   r    s    r   rp   zParametrizedType.key   s    vvr   c                     | j                   S r   r   r    s    r   r$   zParametrizedType.__len__   s    vvr   )	rs   rt   ru   rv   r   propertyrp   r$   __classcell__)r   s   @r   r   r      s&    +
  r   r   c                   b    e Zd Zd Zd Zd Zd Zd Zd ZddZ	d Z
d	 Zd
 Zd Zd Zd Zd Zy)TestDictImplc           	         t         j                  }t         j                  }t         j                  }dd} |dt         j                        | _         |dt         j                  t        j
                  |      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        j
                  t         j                        t        j
                  t         j                        g      | _        y)zEBind to the c_helper library and provide the ctypes wrapper.
        c                 `    t        j                  |g| } |t        j                  |          S r   )rE   	CFUNCTYPEr   	c_helpers)namerestypeargtypesprotos       r   wrapz TestDictImpl.setUp.<locals>.wrap   s-    $$W8x8E--d344r   	test_dictdict_new_sized	dict_freeNr#   dict_insert_ezr1   r9   rA   dict_iter_sizeofrf   rr   )rw   )rE   rF   	c_ssize_tc_intnumba_test_dictPOINTERrG   r   rM   r|   rP   rW   r[   ra   c_size_tr{   rd   rk   )r   dict_titer_thash_tr   s        r   setUpzTestDictImpl.setUp   s    !!	5
  $LL 
 %)LLv&      		%
!  $H 
 "&H"
 %)LL		%
!  "&		"
 #'LL  #
 #'LL#
 '+OO'
#  $ 
 %)LLv/v/%
!r   c                 H    | j                         }| j                  |d       y rD   )r   r(   )r   rets     r   test_simple_c_testzTestDictImpl.test_simple_c_test[  s     ""$a r   c                    t        | dd      }| j                  t        |      d       | j                  |j	                  d             d|d<   | j                  t        |      d       | j                  |j	                  d             | j                  |d   d       d|d<   | j                  t        |      d       | j                  |d   d       d|d	<   | j                  t        |      d
       | j                  |d   d       | j                  |d	   d       d|d<   | j                  t        |      d       | j                  |d   d       | j                  |d	   d       | j                  |d   d       y )Nr   r   r   abcdbeefcafe   cafe0000cafe0001abce   cafe0002abcf   )r   r(   r)   assertIsNoner<   assertIsNotNoner   ds     r   test_insertion_smallz!TestDictImpl.test_insertion_small`  sX   q!Q#!%%-( &	Q#QUU6]+6J/ &	Q#6J/ &	Q#6J/6J/ &	Q#6J/6J/6J/r   c                 
   t        | dd      }d }d }t        |      D ]1  } ||      | ||      <   | j                  t        |      |dz          3 t        |      D ]#  }| j                  | ||          ||             % y )Nr   c                 $    dj                  |       S )Nz	key_{:04}formatr,   s    r   make_keyz3TestDictImpl.check_insertion_many.<locals>.make_key      %%a((r   c                 $    dj                  |       S )Nz	val_{:04}r   r   s    r   make_valz3TestDictImpl.check_insertion_many.<locals>.make_val  r   r   r   )r   ranger(   r)   )r   nmaxr   r   r   is         r   check_insertion_manyz!TestDictImpl.check_insertion_many~  s    q!	)	) tA%a[AhqkNSVQU+ 
 tAQx{^Xa[9 r   c                    | j                  d       | j                  d       | j                  d       | j                  d       | j                  d       | j                  d       | j                  d       | j                  d	       | j                  d
       | j                  d       | j                  d       | j                  d       y )N   )r   r   	          !   i     i  i  i   i  )r   r    s    r   test_insertion_manyz TestDictImpl.test_insertion_many  s     	!!q!)!!q!)!!q!)!!r!*!!r!*!!r!*!!t!,!!t!,!!t!,!!t!,!!t!,!!t!,r   c                    t        | dd      }| j                  t        |      d       | j                  |j	                  d             d|d<   d|d<   d|d	<   | j                  t        |      d
       | j                  |d   d       | j                  |d   d       | j                  |d	   d       | j                  t        |      d
       |d= | j                  |j	                  d             | j                  |d   d       | j                  |d	   d       | j                  t        |      d       | j                  t              5  |d= d d d        |d	= | j                  |j	                  d             | j                  |d   d       | j                  |j	                  d	             | j                  t        |      d       |d= | j                  |j	                  d             | j                  |j	                  d             | j                  |j	                  d	             | j                  t        |      d       y # 1 sw Y   xY w)Nr   r   r   r   r   r   r   r   r   r   r   r   )r   r(   r)   r   r<   assertRaisesr3   r   s     r   test_deletion_smallz TestDictImpl.test_deletion_small  s   q!Q#!%%-(&	&	&	Q#6J/6J/6J/Q# fI!%%-(6J/6J/Q# x(&	 ) fI!%%-(6J/!%%-(Q# fI!%%-(!%%-(!%%-(Q# )(s   
IIc                    t        j                  |       t        | dd      }i }d }d }t        |      D ]  }	 ||	      | ||	      <    t        |      D ],  }	 ||	      }
 ||	      }|||
<   | j	                  ||
   |       . | j	                  t        |      |       t        j                  t        |      |      }|j                         }t        |d      D ])  \  }	}
||
= ||
= | j	                  t        |      ||	z
         + | j	                  t        |      ||z
         |D ]"  }
| j                  |j                  |
             $ |D ]  }
| j	                  ||
   ||
           t        |      D ]"  }	 |||	z         }
 |||	z         }|||
<   |||
<   $ | j	                  t        |      t        |             |D ]  }
| j	                  ||
   ||
           y )Nr   c                 $    dj                  |       S Nzk_{:06x}r   r   s    r   r   z4TestDictImpl.check_delete_randomly.<locals>.make_key      $$Q''r   c                 $    dj                  |       S Nzv_{:06x}r   r   s    r   r   z4TestDictImpl.check_delete_randomly.<locals>.make_val  r   r   r   )start)randomseedr   r   r(   r)   samplelistcopy	enumerater   r<   )r   r   ndropnrefillr   r   keysr   r   r   r+   r,   droplistremains                 r   check_delete_randomlyz"TestDictImpl.check_delete_randomly  s   Dq!	(	( tA%a[AhqkN  tAAADGQqT1%	  	Q& ==dU3ha0DAq!q	SVTAX. 1 	Q. AaeeAh'  AQqT6!9-  wA"A"AF1IAaD	   	Vc!f- AQqT6!9- r   c                    | j                  ddd       | j                  ddd       | j                  ddd	       | j                  dd
d       | j                  ddd       | j                  ddd       | j                  ddd       y )Nr   r   r   r   r      
   r   d   2      c   r   i  r   i   r   r    s    r   test_delete_randomlyz!TestDictImpl.test_delete_randomly  s    ""A">"""b"A""2s"C""2s"C""3"D""C"C""C"Fr   c                 ,    | j                  ddd       y )Ni   i   r   r   r   r    s    r   test_delete_randomly_largez'TestDictImpl.test_delete_randomly_large  s    
 	""UE"Jr   c                    d}t        | dd      }d }d }t        |      D ]  } ||      | ||      <    | j                  t        |      |       |j	                         \  }}| j                  t        |      |dz
         | j                  | |t        |                   | j                  | |t        |                   t        |      rt        |      }|j	                         \  }}| j                  t        |      |dz
         | j                  | |t        |                   | j                  | |t        |                   t        |      r| j                  t        |      d       | j                  t              5 }	|j	                          d d d        | j                  dt        	j                               y # 1 sw Y   /xY w)Nr   r   c                 $    dj                  |       S r   r   r   s    r   r   z+TestDictImpl.test_popitem.<locals>.make_key  r   r   c                 $    dj                  |       S r   r   r   s    r   r   z+TestDictImpl.test_popitem.<locals>.make_val  r   r   r   r   r_   )
r   r   r(   r)   rB   r   r3   assertInr   	exception)
r   r   r   r   r   r   r+   r,   r   raisess
             r   test_popitemzTestDictImpl.test_popitem  s{   q!	(	( tA%a[AhqkN  	Q&yy{1Q*HSV,-HSV,-!fAA99;DAqSVQU+QQ 01QQ 01 !f 	Q#x(FIIK ),  !	
 )(s   
G		Gc                    t        | dd      }dd }fd}t              D ]  } ||      | ||      <    t        |j                               D ]8  \  }\  }}| j	                   ||      |       | j	                   ||      |       : y )Nr   i  c                 $    dj                  |       S Nz{:04}r   r   s    r   r   z.TestDictImpl.test_iter_items.<locals>.make_key<  s    >>!$$r   c                 ,    dj                  | z         S r  r   )r,   r   s    r   r   z.TestDictImpl.test_iter_items.<locals>.make_val?  s    >>!d(++r   r   r   r   r?   r(   )r   r   r   r   r   r+   r,   r   s          @r   test_iter_itemszTestDictImpl.test_iter_items7  s    q!	%	, tA%a[AhqkN  #1779-IAv1Xa[!,Xa[!, .r   c                 $   t        |       }fd}fd}t              D ]  } ||      | ||      <    t        |j                               D ]8  \  }\  }}	| j	                   ||      |       | j	                   ||      |	       : y )Nc                 .    dj                  |       d  S )N{:0{}}r   )r,   rI   s    r   r   z+TestDictImpl.check_sizing.<locals>.make_keyN  s    ??1h/	::r   c                 :    dj                  | z
  dz
        d  S )Nr  r   r   )r,   r   rJ   s    r   r   z+TestDictImpl.check_sizing.<locals>.make_valQ  s#    ??4!8a<:9HEEr   r  )
r   rI   rJ   r   r   r   r   r   r+   r,   s
    ```      r   check_sizingzTestDictImpl.check_sizingJ  s    x*	;	F tA%a[AhqkN  #1779-IAv1Xa[!,Xa[!, .r   c                 T    t        dd      D ]  }| j                  ||d|z          y )Nr   r   r   )rI   rJ   r   )r   r  )r   r   s     r   test_sizingzTestDictImpl.test_sizing\  s+    q!Aq11a4@ r   c                     t        t              t               t        j                  t
              d        }t        t              d        }d t              d        }t        dd      fd       }t        d      t        d	      }} |||        |j                                 |j                          |j                  j                          t        d
      D ]  }| j                   |||              y)z*https://github.com/numba/numba/issues/6401c                     t        |       S r   )r   )rq   cs     r   typeof_unitz:TestDictImpl.test_parameterized_types.<locals>.typeof_unitf  s    #C((r   c                 t    |j                  t        j                  | j                  t	        |             |      S r   )r   r   UniTupler   r)   )typobjcontexts      r   unbox_parametrizedzATestDictImpl.test_parameterized_types.<locals>.unbox_parametrizedj  s&    ==		3s8!DcJJr   c                     J r   rw   r   s    r   dict_vs_cache_vs_parametrizedzLTestDictImpl.test_parameterized_types.<locals>.dict_vs_cache_vs_parametrizedn  s    1r   c                     | fd}|S )Nc                 l    t         j                  j                  t        j                        }| |d<   y )Ndata)r   r   emptyr   r   )r,   r   r  s     r   %objmode_vs_cache_vs_parametrized_implz~TestDictImpl.test_parameterized_types.<locals>.ol_dict_vs_cache_vs_parametrized.<locals>.objmode_vs_cache_vs_parametrized_implu  s(    JJ$$U%7%7=&	r   rw   )r,   r&  r  s     @r    ol_dict_vs_cache_vs_parametrizedzOTestDictImpl.test_parameterized_types.<locals>.ol_dict_vs_cache_vs_parametrizedq  s    C
 98r   T)nopythoncachec                 &     |         |       y r   rw   )xyr!  s     r   set_parametrized_datazDTestDictImpl.test_parameterized_types.<locals>.set_parametrized_data|  s     *!,)!,r   )ab)r.  r   N)r
   r   r	   r   registerr   r   r   r   _make_finalizer_reset_overloads	targetctxinitr   r   )	r   r  r  r'  r-  r+  r,  iir!  s	           @r   test_parameterized_typesz%TestDictImpl.test_parameterized_typesa  s     	)'(7			l	+	) 
,	) 
	 	K 
!	K	 
/	0	9 
1	9 
d$	'	- 
(	- J'f)=1a# 	0--/1..0'',,.)B3Aq9: r   N)r   )rs   rt   ru   r   r   r   r   r   r   r   r   r  r  r  r  r  r6  rw   r   r   r   r      sP    F
P!
0<:&-&'$R5.nGK 
D-&-$A
/;r   r   )rv   rE   r   numba.tests.supportr   numbar   r   r   r   numba.core.configr   numba.core.datamodel.modelsr	   numba.extendingr
   r   r   r   r2   rm   objectr   r>   tupler   Typer   r   rw   r   r   <module>r?     s~      ( / / ' 5 H H 
 AG(6 G(Tv 645 4uzz "~;8 ~;r   