U
    
W[                     @   s   d Z ddlmZmZ ddlmZmZ ddlmZ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
ZdS )z7
Utility classes for dealing with circular references.
    )divisionabsolute_import)logreflect)range_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
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listr   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__B   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   U   s    z_Tuple.__init__N)r   r   r   r*   r   r   r   r   r   r+   O   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   _   s    
z_InstanceMethod.__init__c                 O   sP   dd l }tdt| j| jf  td||f  |jtjd dsLt	d S )Nr   zinstance method %s.%szbeing called with %r %r)file)
	tracebackr   msgr   Zqualr.   r/   print_stackZlogfiler   )r   argskwr1   r   r   r   __call__f   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)   m   s    
z_InstanceMethod.__setitem__N)r   r   r   r   r6   r)   r   r   r   r   r-   ^   s   r-   c                   @   s   e Zd Zdd Zdd ZdS )_DictKeyAndValuec                 C   s
   || _ d S r   )dict)r   r9   r   r   r   r   t   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   hasattrr9   r&   r   r   r   r)   v   s    z_DictKeyAndValue.__setitem__N)r   r   r   r   r)   r   r   r   r   r8   s   s   r8   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||f nd| _ | | d S )Nz4setitem should only be called once, setting %r to %rr   )wassetr;   callbackr&   r   r   r   r)      s    z_Defer.__setitem__c                 C   s*   t | || |   | j}| | d S r   )r   r   Zunpauseresultr   )r   Zdepr   Zresovdr   r   r   r      s    z_Defer.addDependantN)r   r   r   r   rB   r)   r   r   r   r   r   r@      s   r@   N)r*   Z
__future__r   r   Ztwisted.pythonr   r   Ztwisted.python.compatr   r   r   r   r+   r-   r8   r=   Ztwisted.internet.deferr?   r@   r   r   r   r   <module>   s   '