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   %