o
    ۾i"                     @   s6   d Z ddlZG dd dejZedkre  dS dS )z
This test is used by `docs/source/extending/interval-example.rst`.

The "magictoken" comments are used as markers for the beginning and ending of
example code.
    Nc                   @      e Zd Zdd ZdS )IntervalExampleTestc                    s  G dd dt ddlm G fdddj ddlm} |fdd	}dd
lm} | ddlm} |fdd}ddlm	m
} |G fdddj}ddlm} |dd |dd ddlm}	 |	ddd }
ddlm} ddlm |jjfdd}ddlm}m ddlm  | fdd}dd lm} | fd!d"}dd#lm} |d$d% }|d&d' }|fd(d)}fd*d+}d,d-}d.d/}d0d1}|d2d3 }|||| |j|| G d4d5 d5}t |d,|  W d    n	1 s1w   Y  d6d,}|`t || W d    n	1 sRw   Y  ||d/ ||||| d S )7Nc                   @   s,   e Zd ZdZdd Zdd Zedd ZdS )	z?IntervalExampleTest.test_interval_class_usage.<locals>.IntervalzG
            A half-open interval on the real number line.
            c                 S   s   || _ || _d S Nlohi)selfr   r    r	   b/home/ubuntu/.local/lib/python3.10/site-packages/numba/tests/doc_examples/test_interval_example.py__init__   s   
zHIntervalExampleTest.test_interval_class_usage.<locals>.Interval.__init__c                 S   s   d| j | jf S )NzInterval(%f, %f)r   r   r	   r	   r
   __repr__   s   zHIntervalExampleTest.test_interval_class_usage.<locals>.Interval.__repr__c                 S      | j | j S r   r   r   r   r	   r	   r
   width   s   zEIntervalExampleTest.test_interval_class_usage.<locals>.Interval.widthN)__name__
__module____qualname____doc__r   r   propertyr   r	   r	   r	   r
   Interval   s    r   r   )typesc                       s   e Zd Z fddZ  ZS )zCIntervalExampleTest.test_interval_class_usage.<locals>.IntervalTypec                    s   t  | jdd d S )Nr   )name)superr   r   )IntervalType	__class__r	   r
   r   "   s   zLIntervalExampleTest.test_interval_class_usage.<locals>.IntervalType.__init__)r   r   r   r   __classcell__r	   )r   )r   r
   r   !   s    r   )typeof_implc                    s    S r   r	   )valc)interval_typer	   r
   typeof_index+   s   zCIntervalExampleTest.test_interval_class_usage.<locals>.typeof_index)as_numba_type)type_callablec                    s    fdd}|S )Nc                    s$   t | jrt |jr S d S d S r   )
isinstanceFloatr   r    r   r	   r
   typer;   s   zSIntervalExampleTest.test_interval_class_usage.<locals>.type_interval.<locals>.typerr	   )contextr'   r&   r	   r
   type_interval9   s   zDIntervalExampleTest.test_interval_class_usage.<locals>.type_interval)modelsregister_modelc                       s   e Zd Z fddZdS )zDIntervalExampleTest.test_interval_class_usage.<locals>.IntervalModelc                    s*   dj fdj fg} j| ||| d S )Nr   r   )float64StructModelr   )r   dmmfe_typemembersr*   r   r	   r
   r   F   s   zMIntervalExampleTest.test_interval_class_usage.<locals>.IntervalModel.__init__N)r   r   r   r   r	   r1   r	   r
   IntervalModelD   s    r2   )make_attribute_wrapperr   r   )overload_attributer   c                 S   s   dd }|S )Nc                 S   r   r   r   intervalr	   r	   r
   getterX   s   zPIntervalExampleTest.test_interval_class_usage.<locals>.get_width.<locals>.getterr	   )r6   r7   r	   r	   r
   	get_widthV   s   z@IntervalExampleTest.test_interval_class_usage.<locals>.get_width)lower_builtincgutilsc                    s2   |j }|\}} || |}||_||_| S r   )return_typecreate_struct_proxyr   r   	_getvalue)r(   buildersigargstypr   r   r6   r:   r	   r
   impl_intervala   s   zDIntervalExampleTest.test_interval_class_usage.<locals>.impl_interval)unboxNativeValue)	ExitStackc           
   	      s   |jj}| |j|j}  }|j|d}|j|| |jj	| W d   n1 s8w   Y  |
j|}|j| |j||j |jj	| W d   n1 sfw   Y  |j|d}|j|| |jj	| W d   n1 sw   Y  |
j|}	|j| |j||	j |jj	| W d   n1 sw   Y  |j|_|	j|_W d   n1 sw   Y  | |j|dS )zS
            Convert a Interval object to a native interval structure.
            r   Nr   )is_error)alloca_once_valuer?   	false_bitr=   r(   pyapiobject_getattr_stringearly_exit_if_nullstoretrue_bitrD   r,   decrefearly_exit_ifrG   valuer   r   r>   load)
rB   objr   is_error_ptrr6   stacklo_obj	lo_nativehi_obj	hi_native)rF   rE   r;   r   r	   r
   unbox_intervalo   s2   
zEIntervalExampleTest.test_interval_class_usage.<locals>.unbox_interval)boxc              	      s   |j|jj}|j }  }| |j|j|d}|j|j	}
|j|| |j|| W d   n1 s@w   Y  |j|j}
|j|| |j| |j|| W d   n1 smw   Y  |j|j}	
|j||	 |j| |j| |j|| W d   n1 sw   Y  |j|	||f}
|j| |j| |j|	 |j|
| W d   n1 sw   Y  |j|S )zT
            Convert a native interval structure to an Interval object.
            )rQ   N)alloca_oncer?   rJ   pyobjget_null_objectr=   r(   r[   r,   r   rL   rM   r   rO   unserializeserialize_objectcall_function_objargsrR   )rB   r   r   ret_ptrfail_objrU   r6   rV   rX   	class_objres)rF   r   r;   r   r	   r
   box_interval   s4   
zCIntervalExampleTest.test_interval_class_usage.<locals>.box_interval)njitc                 S   s   | j |  ko| jk S   S r   r   )r6   xr	   r	   r
   inside_interval   s   zFIntervalExampleTest.test_interval_class_usage.<locals>.inside_intervalc                 S   s   | j S r   )r   r5   r	   r	   r
   interval_width   s   zEIntervalExampleTest.test_interval_class_usage.<locals>.interval_widthc                    s    | j |j  | j|j S r   r   )ij)r   r	   r
   sum_intervals   s   zDIntervalExampleTest.test_interval_class_usage.<locals>.sum_intervalsc                    s<    |    |  | j|j | j|j d S r   )assertIsInstanceassertEqualr   r   )rh   y)r   r   r	   r
   check_equal_intervals   s   zLIntervalExampleTest.test_interval_class_usage.<locals>.check_equal_intervals                  c                 S   s   | S r   r	   )rh   r	   r	   r
   <lambda>   s    z?IntervalExampleTest.test_interval_class_usage.<locals>.<lambda>c                   @   r   )z@IntervalExampleTest.test_interval_class_usage.<locals>.NotAFloatc                 S   s   t d)NzI am not a float)RuntimeErrorr   r	   r	   r
   	__float__   s   zJIntervalExampleTest.test_interval_class_usage.<locals>.NotAFloat.__float__N)r   r   r   rz   r	   r	   r	   r
   	NotAFloat   s    r{      )objectnumbar   Typenumba.extendingr   registerr"   r#   r*   r+   r-   r3   r4   r9   
numba.corer;   r%   rD   rE   
contextlibrF   r[   rg   ro   r   assertRaises	TypeErrorr   AttributeErrorassertFalse)r   r   r!   r"   r#   r)   r+   r2   r3   r4   r8   r9   rC   rD   rZ   r[   rf   rg   ri   rj   rm   rq   abr   return_funcr{   bad_intervalr	   )	rF   r   r   rE   r;   r    r*   r   r   r
   test_interval_class_usage   sr   

%




	

z-IntervalExampleTest.test_interval_class_usageN)r   r   r   r   r	   r	   r	   r
   r   
   s    r   __main__)r   unittestTestCaser   r   mainr	   r	   r	   r
   <module>   s     h