o
    ¯b'  ã                   @   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   ú</usr/lib/python3/dist-packages/twisted/persisted/crefutil.pyÚ__init__   s   
zNotKnown.__init__c                 C   s   | j rJ ‚| j ||f¡ d S ©N)r   r   Úappend)r
   ÚmutableObjectÚkeyr   r   r   ÚaddDependant   s   
zNotKnown.addDependantNc                 C   s(   d| _ || _| jD ]\}}|||< q	d S )Né   )r   ÚresolvedObjectr   )r
   Ú	newObjectÚmutr   r   r   r   ÚresolveDependants   s
   
ÿzNotKnown.resolveDependantsc                 C   s   J dƒ‚)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 ]}t|| t ƒs*| j 	|¡ q||  
| |¡ q| jsA|  |  | j¡¡ dS 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   sD   || j |< t|tƒs| j |¡ | js |  |  | j ¡¡ dS dS 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
   Úim_nameÚim_selfÚim_classr   r   r   r   Y   s   
z_InstanceMethod.__init__c                 O   sP   dd l }t dt | j¡› d| j› �¡ t d|›d|›�¡ |jtjd� J ‚)Nr   zinstance method Ú.zbeing called with ú )Úfile)	Ú	tracebackr   Úmsgr   Úqualr.   r/   Úprint_stackÚlogfile)r
   ÚargsÚkwr6   r   r   r   Ú__call__`   s
    z_InstanceMethod.__call__c                 C   s<   |dksJ dƒ‚t |tƒst| j| j|ƒ}|  |¡ d S d S )Nr   zonly zero index allowed)r#   r   r   r.   r/   r   )r
   r'   r(   Úmethodr   r   r   r)   h   s
   
þz_InstanceMethod.__setitem__N)r   r   r   r   r=   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   sP   |dvrt dƒ‚|r|| _n|| _t| dƒr$t| dƒr&| j| j| j< d S d S d S )N)r   r   z6DictKeyAndValue should only ever be called with 0 or 1r   Úvalue)ÚRuntimeErrorrA   r   Úhasattrr@   r&   r   r   r   r)   s   s   ÿz_DictKeyAndValue.__setitem__N)r   r   r   r   r)   r   r   r   r   r?   o   s    r?   c                   @   s   e Zd Zdd„ ZdS )Ú_Dereferencec                 C   s   t  | ¡ || _d S r   )r   r   Úid)r
   rE   r   r   r   r      s   

z_Dereference.__init__N)r   r   r   r   r   r   r   r   rD   ~   s    rD   )Ú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   )rF   r   r   Úpauser	   r   r   r   r   ˆ   s   

z_Defer.__init__r   c                 C   s*   | j rtd ||¡ƒ‚d| _ |  |¡ d S )Nz8setitem should only be called once, setting {!r} to {!r}r   )ÚwassetrB   ÚformatÚcallbackr&   r   r   r   r)   �   s   ÿÿz_Defer.__setitem__c                 C   s*   t  | ||¡ |  ¡  | j}|  |¡ d S r   )r   r   ÚunpauseÚresultr   )r
   Údepr   Úresovdr   r   r   r   š   s   z_Defer.addDependantN)r   r   r   r   rI   r)   r   r   r   r   r   rG   ‡   s
    rG   N)r*   Útwisted.pythonr   r   Útwisted.python.compatr   r   r   r+   r-   r?   rD   Útwisted.internet.deferrF   ÚobjectrG   r   r   r   r   Ú<module>   s   %