
    \d'                         d Z ddlmZmZ ddlmZ  G d d          Z G d de          Z G d d	e          Z G d
 de          Z	 G d d          Z
 G d de          ZddlmZ  G d dee         e          ZdS )z7
Utility classes for dealing with circular references.
    )logreflect)_constructMethodc                   *    e Zd Zd Zd ZdZd Zd ZdS )NotKnownc                 "    g | _         d| _        d S Nr   )
dependantsresolvedselfs    :lib/python3.11/site-packages/twisted/persisted/crefutil.py__init__zNotKnown.__init__   s        c                 P    | j         rJ | j                            ||f           d S N)r   r
   append)r   mutableObjectkeys      r   addDependantzNotKnown.addDependant   s1    =   s344444r   Nc                 F    d| _         || _        | j        D ]
\  }}|||<   d S )N   )r   resolvedObjectr
   )r   	newObjectmutr   s       r   resolveDependantszNotKnown.resolveDependants   s;    ' 	! 	!HC CHH	! 	!r   c                     J d            )Nr   z(I am not to be used as a dictionary key. r   s    r   __hash__zNotKnown.__hash__!   s    <<<<<r   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r      sW          5 5 5 N! ! != = = = =r   r   c                       e Zd ZdZd Zd ZdS )
_ContainerzK
    Helper class to resolve circular references on container objects.
    c                     t                               |            || _        || _        t	          t          t          |                              | _        t          t          |                    D ]T}t          ||         t                     s| j        	                    |           8||         
                    | |           U| j        s/|                     |                     | 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&   idxs       r   r   z_Container.__init__*   s     	$*s1vv''	Q== 	/ 	/Cafh// /	  %%%%###D#....y 	?""4#5#5df#=#=>>>>>	? 	?r   c                     || j         |<   t          |t                    sP| j                            |           | j        s1|                     |                     | 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objs      r   __setitem__z_Container.__setitem__>   s    
 q	#x(( 	CIQ9 C&&t'9'9$&'A'ABBBBB	C 	CC Cr   N)r    r!   r"   __doc__r   r3   r   r   r   r$   r$   %   sA         ? ? ?(	C 	C 	C 	C 	Cr   r$   c                       e Zd ZdZd ZdS )_Tupleza
    Manage tuple containing circular references. Deprecated: use C{_Container}
    instead.
    c                 H    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'   s     r   r   z_Tuple.__init__P   s"    
 	D!U+++++r   N)r    r!   r"   r4   r   r   r   r   r6   r6   J   s-         
, , , , ,r   r6   c                        e Zd Zd Zd Zd ZdS )_InstanceMethodc                     t                               |            || _        || _        |                    | d           d S r	   )r   r   my_classnamer   )r   im_nameim_selfim_classs       r   r   z_InstanceMethod.__init__Y   s@    $ 	T1%%%%%r   c                     dd l }t          j        dt          j        | j                   d| j                    t          j        d|d|           |                    t          j                   J )Nr   zinstance method .zbeing called with  )file)		tracebackr   msgr   qualr<   r=   print_stacklogfile)r   argskwrE   s       r   __call__z_InstanceMethod.__call__`   s|    L7<#>#>LLLLMMM4T44b445553;///r   c                     |dk    s
J d            t          |t                    s2t          | j        | j        |          }|                     |           d S d S )Nr   zonly zero index allowed)r,   r   r   r<   r=   r   )r   r1   r2   methods       r   r3   z_InstanceMethod.__setitem__h   sa    Avvv0vvv#x(( 	+%dmTYDDF""6*****	+ 	+r   N)r    r!   r"   r   rL   r3   r   r   r   r:   r:   X   sA        & & &  + + + + +r   r:   c                       e Zd Zd Zd ZdS )_DictKeyAndValuec                     || _         d S r   )dict)r   rR   s     r   r   z_DictKeyAndValue.__init__p   s    			r   c                     |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)RuntimeErrorrT   r   hasattrrR   r0   s      r   r3   z_DictKeyAndValue.__setitem__s   s    F??WXXX 	DJJDH4 	-GD'$:$: 	-"&*DIdh	- 	- 	- 	-r   N)r    r!   r"   r   r3   r   r   r   rP   rP   o   s2          - - - - -r   rP   c                       e Zd Zd ZdS )_Dereferencec                 H    t                               |            || _        d S r   )r   r   id)r   rZ   s     r   r   z_Dereference.__init__   s!    $r   N)r    r!   r"   r   r   r   r   rX   rX   ~   s#            r   rX   )Deferredc                   $    e Zd Zd ZdZd Zd ZdS )_Deferc                     t          j        |            t                              |            |                                  d S r   )r[   r   r   pauser   s    r   r   z_Defer.__init__   s8    $$

r   r   c                     | j         r#t          d                    ||                    d| _         |                     |           d S )Nz8setitem should only be called once, setting {!r} to {!r}r   )wassetrU   formatcallbackr0   s      r   r3   z_Defer.__setitem__   sW    ; 	JQQs    DKcr   c                     t                               | ||           |                                  | j        }|                     |           d S r   )r   r   unpauseresultr   )r   depr   resovds       r   r   z_Defer.addDependant   sJ     	dC---v&&&&&r   N)r    r!   r"   r   ra   r3   r   r   r   r   r]   r]      sH          
 F	 	 	' ' ' ' 'r   r]   N)r4   twisted.pythonr   r   twisted.python.compatr   r   r$   r6   r:   rP   rX   twisted.internet.deferr[   objectr]   r   r   r   <module>rm      s   
 ( ' ' ' ' ' ' ' 2 2 2 2 2 2= = = = = = = =*"C "C "C "C "C "C "C "CJ, , , , ,Z , , ,+ + + + +h + + +.- - - - - - - -    8    , + + + + +' ' ' ' 'Xfx ' ' ' ' 'r   