
    Vh'                     2    d Z ddlmZ e G d d             Zy)z
This module contains a base type which provides list-style mutations
without specific data storage methods.

See also http://static.aryehleib.com/oldsite/MutableLists.html

Author: Aryeh Leib Taurog.
    )total_orderingc                        e Zd ZdZdZdZ fdZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd!dZd Zd Zd"dZd Zd Zd Zd Zd Zd Z d Z!d  Z" xZ#S )#	ListMixinay  
    A base class which provides complete list interface.
    Derived classes must call ListMixin's __init__() function
    and implement the following:

    function _get_single_external(self, i):
        Return single item with index i for general use.
        The index i will always satisfy 0 <= i < len(self).

    function _get_single_internal(self, i):
        Same as above, but for use within the class [Optional]
        Note that if _get_single_internal and _get_single_internal return
        different types of objects, _set_list must distinguish
        between the two and handle each appropriately.

    function _set_list(self, length, items):
        Recreate the entire object.

        NOTE: items may be a generator which calls _get_single_internal.
        Therefore, it is necessary to cache the values in a temporary:
            temp = list(items)
        before clobbering the original storage.

    function _set_single(self, i, value):
        Set the single item at index i to value [Optional]
        If left undefined, all mutations will result in rebuilding
        the object using _set_list.

    function __len__(self):
        Return the length

    int _minlength:
        The minimum legal length [Optional]

    int _maxlength:
        The maximum legal length [Optional]

    type or tuple _allowed:
        A type or tuple of allowed item types [Optional]
    r   Nc                     t        | d      s| j                  | _        t        | d      s"| j                  | _        | j
                  | _        t        |    |i | y )N_get_single_internal_set_single)	hasattr_get_single_externalr   _set_single_rebuildr   _assign_extended_slice_rebuild_assign_extended_slicesuper__init__)selfargskwargs	__class__s      T/home/dcms/DCMS/lib/python3.12/site-packages/django/contrib/gis/geos/mutable_list.pyr   zListMixin.__init__>   sT    t34(,(A(AD%t]+#77D*.*M*MD'$)&)    c                     t        |t              r=t        |j                  t	        |              D cg c]  }| j                  |       c}S | j                  |      }| j                  |      S c c}w )z-Get the item(s) at the specified index/slice.)
isinstanceslicerangeindiceslenr
   _checkindex)r   indexis      r   __getitem__zListMixin.__getitem__H   si    eU#6;U]]3t9=U6V12))!,  $$U+E,,U33s   A0c                 H    t        |t        t        f      st        d|z        t	               }t        |t              r j                  |      }|gnt        |j                  |       |t	              z
  } fdt        |      D        } j                  ||       y)z0Delete the item(s) at the specified index/slice.%s is not a legal indexc              3   J   K   | ]  }|vsj                  |        y wN)r   ).0r   
indexRanger   s     r   	<genexpr>z(ListMixin.__delitem__.<locals>.<genexpr>`   s(      
-.AZDWD%%a(
s   	##N)	r   intr   	TypeErrorr   r   r   r   _rebuild)r   r   origLennewLennewItemsr%   s   `    @r   __delitem__zListMixin.__delitem__R   s    %#u.5=>> d)eS!$$U+EJg 67J3z?*
27.
 	fh'r   c                     t        |t              r| j                  ||       y| j                  |      }| j	                  |f       | j                  ||       y)z-Set the item(s) at the specified index/slice.N)r   r   
_set_slicer   _check_allowedr   r   r   vals      r   __setitem__zListMixin.__setitem__f   sJ    eU#OOE3'$$U+E'UC(r   c                 ,    | j                  g | |      S )zadd another list-like objectr   r   others     r   __add__zListMixin.__add__p   s    ~~oouo..r   c                 ,    |j                  g ||       S )zadd to another list-like objectr5   r6   s     r   __radd__zListMixin.__radd__t   s    //r   c                 (    | j                  |       | S )z$add another list-like object to self)extendr6   s     r   __iadd__zListMixin.__iadd__x   s    Er   c                 <    | j                  t        |       |z        S multiplyr   listr   ns     r   __mul__zListMixin.__mul__}       ~~d4j1n--r   c                 <    | j                  t        |       |z        S r?   rA   rC   s     r   __rmul__zListMixin.__rmul__   rF   r   c                 |    |dk  r| dd= | S t        |       }t        |dz
        D ]  }| j                  |        | S )r@   r   N   )rB   r   r<   )r   rD   cacher   s       r   __imul__zListMixin.__imul__   sJ    6Q
  JE1q5\ #E"#r   c                     t        |      }t        |      D ]  }	 | |   ||   k(  }|r y t        |       |k(  S # t        $ r Y  yw xY wNFr   r   
IndexErrorr   r7   olenr   cs        r   __eq__zListMixin.__eq__   sb    5zt 	AGuQx' 	 4yD    s   :	AAc                     t        |      }t        |      D ]!  }	 | |   ||   k  }|r|c S ||   | |   k  s! y t        |       |k  S # t        $ r Y  yw xY w)NTFrO   rQ   s        r   __lt__zListMixin.__lt__   sw    5zt 		AGeAh& qDG#		 4y4  s   A			AAc                 .    d}| D ]  }||k(  s	|dz  } |S )zStandard list count methodr   rJ    )r   r2   countr   s       r   rY   zListMixin.count   s-     	Aax
	 r   c                 j    t        dt        |             D ]  }| |   |k(  s|c S  t        d|z        )zStandard list index methodr   z%s not found in object)r   r   
ValueError)r   r2   r   s      r   r   zListMixin.index   s?    q#d)$ 	AAw#~	 1C788r   c                 "    |g| t        |       d y)zStandard list append methodNr   r   r2   s     r   appendzListMixin.append   s     ESY[r   c                      || t        |       d y)zStandard list extend methodNr]   )r   valss     r   r<   zListMixin.extend   s     SY[r   c                 L    t        |t              st        d|z        |g| || y)zStandard list insert methodr!   N)r   r'   r(   r1   s      r   insertzListMixin.insert   s+    %%5=>> EU5r   c                     | |   }| |= |S )zStandard list pop methodrX   )r   r   results      r   popzListMixin.pop   s    eKr   c                 (    | | j                  |      = y)zStandard list remove methodN)r   r^   s     r   removezListMixin.remove   s    C!r   c                     | ddd   | dd y)zStandard list reverse methodNrX   )r   s    r   reversezListMixin.reverse   s    rv2v,Qr   c                 &    t        | ||      | dd y)zStandard list sort method)keyrk   N)sorted)r   rm   rk   s      r   sortzListMixin.sort   s    38Qr   c                     |r'|| j                   k  rt        d| j                   z        | j                  '|| j                  kD  rt        d| j                  z        | j                  ||       y )NzMust have at least %d itemszCannot have more than %d items)
_minlengthr[   
_maxlength	_set_list)r   r+   r,   s      r   r)   zListMixin._rebuild   s]    ft.:T__LMM??&6DOO+C=OPPvx(r   c                 F    | j                  t        ||dz   d      |g       y NrJ   )r/   r   )r   r   values      r   r   zListMixin._set_single_rebuild   s    eUQY2UG<r   c                 t    t        |       }d|cxk  r|k  r|S  | |cxk  r	dk  r||z   S  t        d|z        )Nr   zinvalid index: %s)r   rP   )r   r   lengths      r   r   zListMixin._checkindex   sQ    TL 7ea6>!  ,u455r   c                     t        | d      r2d|D cg c]  }t        || j                         c}v rt        d      y y c c}w )N_allowedFz*Invalid type encountered in the arguments.)r	   r   rz   r(   )r   itemsr2   s      r   r0   zListMixin._check_allowed   sD    4$5ICC7II LMM J %Is   A c                    	 t        |      }| j                  |       t        |       }|j	                  |      \  }}}|j
                  | j                  |||       y| j                  ||||       y# t        $ r t        d      w xY w)z&Assign values to a slice of the objectz&can only assign an iterable to a sliceN)rB   r(   r0   r   r   step_assign_simple_slicer   )r   r   values	valueListr*   startstopr}   s           r   r/   zListMixin._set_slice   s    	FVI 	I&d)!MM'2tT ::%%eT9=''tT9E  	FDEE	Fs   A3 3Bc                     t        |||      }t        |      t        |      k7  r"t        dt        |      t        |      fz        t               t        t	        ||             fd} j                   |              y)z2Assign an extended slice by rebuilding entire listBattempt to assign sequence of size %d to extended slice of size %dc               3   l   K   t              D ]!  } | v r|     j                  |        # y wr#   r   r   )r   r+   newValsr   s    r   r,   z:ListMixin._assign_extended_slice_rebuild.<locals>.newItems  s<     6] 7<!!*$33A66	7s   14N)r   r   r[   dictzipr)   )	r   r   r   r}   r   	indexListr,   r+   r   s	   `      @@r   r   z(ListMixin._assign_extended_slice_rebuild  s|    %t,	y>S^+/25i.#i.1QR  Ts9i01	7 	fhj)r   c                     t        |||      }t        |      t        |      k7  r"t        dt        |      t        |      fz        t        ||      D ]  \  }}| j	                  ||        y)z9Assign an extended slice by re-assigning individual itemsr   N)r   r   r[   r   r   )r   r   r   r}   r   r   r   r2   s           r   r   z ListMixin._assign_extended_slice  st    %t,	y>S^+/25i.#i.1QR 
 )Y/ 	%FAsQ$	%r   c                      t               t              z
  z   t              z   } fd} j                  | |              y)z5Assign a simple slice; Can assign slice of any lengthc               3      K   t        dz         D ]5  } | k(  r
E d {    | k  s| k  s| k\  s#j                  |        7 y 7 +wru   r   )r   r*   r   r   r   r   s    r   r,   z0ListMixin._assign_simple_slice.<locals>.newItems1  sW     7Q;' ;:(((w;5yAI"77::;(s   AA	A
AAN)r   maxr)   )r   r   r   r   r+   r,   r*   s   ````  @r   r~   zListMixin._assign_simple_slice+  sK    d)5$4%'#i.8	; 	; 	fhj)r   )rj   rN   )$__name__
__module____qualname____doc__rq   rr   r   r   r-   r3   r8   r:   r=   rE   rH   rL   rT   rV   rY   r   r_   r<   rc   rf   rh   rk   ro   r)   r   r   r0   r/   r   r   r~   __classcell__r5   s   @r   r   r      s    'R JJ*4(()/0
..
!  9"!""9
)=6N
F&*.%*r   r   N)r   	functoolsr   r   rX   r   r   <module>r      s+    % k* k* k*r   