U
    ?h"                     @   s2   d Z ddlZG dd dejZedkr.e  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                   @   s   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 5 Q R X d6d,}|`t || W 5 Q R X ||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   `/var/www/html/venv/lib/python3.8/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   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 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   ZdmmZfe_typemembersr(   r   r   r	   r
   F   s    zMIntervalExampleTest.test_interval_class_usage.<locals>.IntervalModel.__init__N)r   r   r   r
   r   r-   r   r	   IntervalModelD   s   r.   )make_attribute_wrapperr   r   )overload_attributer   c                 S   s   dd }|S )Nc                 S   s   | j | j S r   r   intervalr   r   r	   getterX   s    zPIntervalExampleTest.test_interval_class_usage.<locals>.get_width.<locals>.getterr   )r2   r3   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   r2   r6   r   r	   impl_intervala   s    zDIntervalExampleTest.test_interval_class_usage.<locals>.impl_interval)unboxNativeValue)	ExitStackc           
   
      sd   |jj}| |j|j}  }|j|d}|j|| |jj	| W 5 Q R X |
j|}|j| |j||j |jj	| W 5 Q R X |j|d}|j|| |jj	| W 5 Q R X |
j|}	|j| |j||	j |jj	| W 5 Q R X |j|_|	j|_W 5 Q R X | |j|dS )zS
            Convert a Interval object to a native interval structure.
            r   r   )is_error)Zalloca_once_valuer;   Z	false_bitr9   r&   pyapiZobject_getattr_stringearly_exit_if_nullstoreZtrue_bitr@   r*   decrefZearly_exit_ifrC   valuer   r   r:   load)
r>   objr   Zis_error_ptrr2   stacklo_objZ	lo_nativehi_objZ	hi_native)rB   rA   r7   r   r   r	   unbox_intervalo   s(    
zEIntervalExampleTest.test_interval_class_usage.<locals>.unbox_interval)boxc              
      sn   |j|jj}|j }  8}| |j|j|d}|j|j	}
|j|| |j|| W 5 Q R X |j|j}
|j||  |j| |j|| W 5 Q R X |j|j}	
|j||	, |j| |j| |j|| W 5 Q R X |j|	||f}
|j| |j| |j|	 |j|
| W 5 Q R X |j|S )zT
            Convert a native interval structure to an Interval object.
            )rH   )Zalloca_oncer;   rD   ZpyobjZget_null_objectr9   r&   rO   r*   r   rE   rF   r   rG   ZunserializeZserialize_objectZcall_function_objargsrI   )r>   r   r   Zret_ptrZfail_objrK   r2   rL   rM   Z	class_objres)rB   r   r7   r   r   r	   box_interval   s,    

zCIntervalExampleTest.test_interval_class_usage.<locals>.box_interval)njitc                 S   s   | j |  ko| jk S   S r   r   )r2   xr   r   r	   inside_interval   s    zFIntervalExampleTest.test_interval_class_usage.<locals>.inside_intervalc                 S   s   | j S r   )r   r1   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   )ZassertIsInstanceZassertEqualsr   r   )rS   y)r   r   r   r	   check_equal_intervals   s    zLIntervalExampleTest.test_interval_class_usage.<locals>.check_equal_intervals                  c                 S   s   | S r   r   )rS   r   r   r	   <lambda>       z?IntervalExampleTest.test_interval_class_usage.<locals>.<lambda>c                   @   s   e Zd Zdd ZdS )z@IntervalExampleTest.test_interval_class_usage.<locals>.NotAFloatc                 S   s   t dd S )NzI am not a float)RuntimeErrorr   r   r   r	   	__float__   s    zJIntervalExampleTest.test_interval_class_usage.<locals>.NotAFloat.__float__N)r   r   r   rd   r   r   r   r	   	NotAFloat   s   re      )objectZnumbar   TypeZnumba.extendingr   registerr    r!   r(   r)   r+   r/   r0   r5   Z
numba.corer7   r#   r@   rA   
contextlibrB   rO   rR   ZassertEqualr   ZassertRaises	TypeErrorr   AttributeErrorZassertFalse)r   r   r   r    r!   r'   r)   r.   r/   r0   r4   r5   r?   r@   rN   rO   rQ   rR   rT   rU   rX   rZ   abr   Zreturn_funcre   Zbad_intervalr   )	rB   r   r   rA   r7   r   r(   r   r   r	   test_interval_class_usage   sn    

%




	
z-IntervalExampleTest.test_interval_class_usageN)r   r   r   ro   r   r   r   r	   r   
   s   r   __main__)r   ZunittestZTestCaser   r   mainr   r   r   r	   <module>   s
    h