B
    #=6\N                 @   s   d dl mZ d dl mZ d dl mZ d dl mZ d dlZd dlZG dd deZG dd	 d	eZ	e	 a
d
d Zdd Zdd Zdd ZedddZG dd deZdddZdS )    )absolute_import)division)print_function)unicode_literalsNc               @   s:   e Zd Zdd Zedd Zdd Zdd Zdd
dZdS )_ContextInfoc             C   s    || _ || _|| _t | _d S )N)clsallow_defaultarg_name	threadinglocal_local_stack)selfr   r   r	    r   8/tmp/pip-install-l3r2oljg/torch/caffe2/python/context.py__init__   s    z_ContextInfo.__init__c             C   s   t | jdsg | j_| jjS )Nobj)hasattrr   r   )r   r   r   r   _stack   s    z_ContextInfo._stackc             C   s   | j | d S )N)r   append)r   valuer   r   r   enter   s    z_ContextInfo.enterc             C   s2   t | jdkstd| j | j |ks.td S )Nr   zContext %s is empty.)lenr   AssertionErrorr   pop)r   r   r   r   r   exit   s    z_ContextInfo.exitTc             C   sB   t | jdkr8|sd S | js*td| j | |   | jd S )Nr   z*Context %s is required but none is active.)r   r   r   r   r   r   )r   requiredr   r   r   
get_active    s    z_ContextInfo.get_activeN)T)	__name__
__module____qualname__r   propertyr   r   r   r   r   r   r   r   r      s
   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_ContextRegistryc             C   s
   i | _ d S )N)_ctxs)r   r   r   r   r   +   s    z_ContextRegistry.__init__c             C   s8   t |tst|j| jks(td|j || j|j< d S )NzContext %s already registered)
isinstancer   r   r   r#   )r   ctx_infor   r   r   register.   s    z_ContextRegistry.registerc             C   s    || j kstd| | j | S )NzContext %s not registered.)r#   r   )r   r   r   r   r   get4   s    z_ContextRegistry.getN)r   r   r    r   r&   r'   r   r   r   r   r"   *   s   r"   c               C   s   t S )N)_CONTEXT_REGISTRYr   r   r   r   _context_registry<   s    r)   c             C   s*   | j d k	r|    t | j|  | S )N)_prev_enterr)   r'   
_ctx_classr   )r   r   r   r   	__enter__A   s    
r,   c             G   s,   t  | j|  | jd k	r(| j|  d S )N)r)   r'   r+   r   
_prev_exit)r   argsr   r   r   __exit__H   s    
r/   c                s   t   fdd}|S )Nc           	      s     | |S Q R X d S )Nr   )r.   kwargs)funcr   r   r   wrapperO   s    z__call__.<locals>.wrapper)sixwraps)r   r1   r2   r   )r1   r   r   __call__N   s    r5   Tc             C   s   t | ||S )N)_get_active_context)r   r   r   r   r   r   _currentV   s    r7   c               @   s   e Zd ZdddZdd ZdS )define_contextNFc             C   s   || _ || _d S )N)r	   r   )r   r	   r   r   r   r   r   \   s    zdefine_context.__init__c             C   s   t |drtd||jf ||_t t|| j| j t |drJ|jnd |_	t |dr`|j
nd |_t|_t
|_
t|_t|_|S )Nr+   z-%s parent class (%s) already defines context.r,   r/   )r   r   r+   r)   r&   r   r   r	   r,   r*   r/   r-   r5   r7   current)r   r   r   r   r   r5   `   s    zdefine_context.__call__)NF)r   r   r    r   r5   r   r   r   r   r8   [   s   
r8   c             C   sB   t  | }|d k	r6t|| s2td| t|f |S |j|dS )Nz)Wrong context type. Expected: %s, got %s.)r   )r)   r'   r$   r   typer   )r   valr   r%   r   r   r   r6   u   s    r6   )NT)NT)
__future__r   r   r   r   r
   r3   objectr   r"   r(   r)   r,   r/   r5   classmethodr7   r8   r6   r   r   r   r   <module>   s    