U
    P|j'  ã                   @   s¢   d Z ddlmZmZ ddlmZ G dd„ dƒZG dd„ deƒZG dd	„ d	eƒZG d
d„ deƒZ	G dd„ dƒZ
G dd„ deƒZddlmZ G dd„ dee eƒZdS )z7
Utility classes for dealing with circular references.
é    )ÚlogÚreflect)Ú_constructMethodc                   @   s0   e Zd Zdd„ Zdd„ ZdZdd„ Zdd	„ ZdS )
ÚNotKnownc                 C   s   g | _ d| _d S ©Nr   )Ú
dependantsÚresolved©Úself© r   ú>/tmp/pip-unpacked-wheel-audpp6lv/twisted/persisted/crefutil.pyÚ__init__   s    zNotKnown.__init__c                 C   s   | j r
t‚| j ||f¡ d S ©N)r   ÚAssertionErrorr   Úappend)r
   ZmutableObjectÚkeyr   r   r   ÚaddDependant   s    
zNotKnown.addDependantNc                 C   s(   d| _ || _| jD ]\}}|||< qd S )Né   )r   ÚresolvedObjectr   )r
   Z	newObjectZmutr   r   r   r   ÚresolveDependants   s    zNotKnown.resolveDependantsc                 C   s   dst dƒ‚d S )Nr   z(I am not to be used as a dictionary key.)r   r	   r   r   r   Ú__hash__!   s    zNotKnown.__hash__)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r      s
   r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
_ContainerzK
    Helper class to resolve circular references on container objects.
    c                 C   s‚   t  | ¡ || _|| _ttt|ƒƒƒ| _tt|ƒƒD ]0}t|| t ƒsT| j 	|¡ q4||  
| |¡ q4| js~|  |  | j¡¡ dS )zÌ
        @param l: The list of object which may contain some not yet referenced
        objects.

        @param containerType: A type of container objects (e.g., C{tuple} or
            C{set}).
        N)r   r   ÚcontainerTypeÚlÚlistÚrangeÚlenÚlocsÚ
isinstanceÚremover   r   )r
   r   r   Úidxr   r   r   r   *   s    
z_Container.__init__c                 C   s<   || j |< t|tƒs8| j |¡ | js8|  |  | j ¡¡ dS )z€
        Change the value of one contained objects, and resolve references if
        all objects have been referenced.
        N)r   r!   r   r    r"   r   r   ©r
   ÚnÚobjr   r   r   Ú__setitem__>   s
    

z_Container.__setitem__N)r   r   r   Ú__doc__r   r'   r   r   r   r   r   %   s   r   c                   @   s   e Zd ZdZdd„ ZdS )Ú_Tupleza
    Manage tuple containing circular references. Deprecated: use C{_Container}
    instead.
    c                 C   s   t  | |t¡ dS )zi
        @param l: The list of object which may contain some not yet referenced
        objects.
        N)r   r   Útuple)r
   r   r   r   r   r   P   s    z_Tuple.__init__N)r   r   r   r(   r   r   r   r   r   r)   J   s   r)   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_InstanceMethodc                 C   s&   t  | ¡ || _|| _| | d¡ d S r   )r   r   Úmy_classÚnamer   )r
   Zim_nameZim_selfZim_classr   r   r   r   Y   s    
z_InstanceMethod.__init__c                 O   sX   dd l }t dt | j¡› d| j› �¡ t d|›d|›�¡ |jtjd� dsTt	‚d S )Nr   zinstance method Ú.zbeing called with ú )Úfile)
Ú	tracebackr   Úmsgr   Zqualr,   r-   Úprint_stackÚlogfiler   )r
   ÚargsÚkwr1   r   r   r   Ú__call__`   s
     z_InstanceMethod.__call__c                 C   s8   |dkst dƒ‚t|tƒs4t| j| j|ƒ}|  |¡ d S )Nr   zonly zero index allowed)r   r!   r   r   r,   r-   r   )r
   r%   r&   Úmethodr   r   r   r'   h   s    
z_InstanceMethod.__setitem__N)r   r   r   r   r7   r'   r   r   r   r   r+   X   s   r+   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_DictKeyAndValuec                 C   s
   || _ d S r   )Údict)r
   r:   r   r   r   r   p   s    z_DictKeyAndValue.__init__c                 C   sH   |dkrt dƒ‚|r|| _n|| _t| dƒrDt| dƒrD| j| j| j< d S )N)r   r   z6DictKeyAndValue should only ever be called with 0 or 1r   Úvalue)ÚRuntimeErrorr;   r   Úhasattrr:   r$   r   r   r   r'   s   s    z_DictKeyAndValue.__setitem__N)r   r   r   r   r'   r   r   r   r   r9   o   s   r9   c                   @   s   e Zd Zdd„ ZdS )Ú_Dereferencec                 C   s   t  | ¡ || _d S r   )r   r   Úid)r
   r?   r   r   r   r      s    
z_Dereference.__init__N)r   r   r   r   r   r   r   r   r>   ~   s   r>   )ÚDeferredc                   @   s(   e Zd Zdd„ ZdZdd„ Zdd„ ZdS )	Ú_Deferc                 C   s    t  | ¡ t | ¡ |  ¡  d S r   )r@   r   r   Úpauser	   r   r   r   r   ˆ   s    

z_Defer.__init__r   c                 C   s,   | j rtd ||¡ƒ‚nd| _ |  |¡ d S )Nz8setitem should only be called once, setting {!r} to {!r}r   )Úwassetr<   ÚformatÚcallbackr$   r   r   r   r'   �   s     ÿÿz_Defer.__setitem__c                 C   s*   t  | ||¡ |  ¡  | j}|  |¡ d S r   )r   r   ZunpauseÚresultr   )r
   Údepr   Zresovdr   r   r   r   š   s    z_Defer.addDependantN)r   r   r   r   rC   r'   r   r   r   r   r   rA   ‡   s   rA   N)r(   Ztwisted.pythonr   r   Ztwisted.python.compatr   r   r   r)   r+   r9   r>   Ztwisted.internet.deferr@   ÚobjectrA   r   r   r   r   Ú<module>   s   %