
    df'                     @    d Z ddlmZ e G d d                      ZdS )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                      j        |i | d S )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      `D:\Python Project\djangoTemplates\venv\Lib\site-packages\django/contrib/gis/geos/mutable_list.pyr   zListMixin.__init__>   sm    t344 	B(,(AD%t]++ 	N#7D*.*MD'$)&)))))    c                      t          |t                    r5 fdt          |                    t	                                D             S                      |          }                     |          S )z-Get the item(s) at the specified index/slice.c                 :    g | ]}                     |          S  )r
   ).0ir   s     r   
<listcomp>z)ListMixin.__getitem__.<locals>.<listcomp>K   s4       12))!,,  r   )
isinstanceslicerangeindiceslen_checkindexr
   )r   indexs   ` r   __getitem__zListMixin.__getitem__H   s    eU## 	4   6;U]]3t99=U=U6V    $$U++E,,U333r   c                     t          |t          t          f          st          d|z            t	                     }t          |t                    r                     |          }|gnt          |                    |           |t	                    z
  } fdt          |          D             }                     ||           dS )z0Delete the item(s) at the specified index/slice.%s is not a legal indexc              3   J   K   | ]}|v                     |          V  d S N)r   )r   r   
indexRanger   s     r   	<genexpr>z(ListMixin.__delitem__.<locals>.<genexpr>`   sD       
 
-.AZDWDWD%%a((DWDWDWDW
 
r   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!! 	8$$U++EJJg 6 67J3z??*
 
 
 
 
27..
 
 
 	fh'''''r   c                     t          |t                    r|                     ||           dS |                     |          }|                     |f           |                     ||           dS )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   ss    eU## 	)OOE3'''''$$U++E'''UC(((((r   c                 4    |                      g | |          S )zadd another list-like objectr   r   others     r   __add__zListMixin.__add__p   s    ~~oouo...r   c                 4    |                     g ||           S )zadd to another list-like objectr8   r9   s     r   __radd__zListMixin.__radd__t   s    ///r   c                 0    |                      |           | S )z$add another list-like object to self)extendr9   s     r   __iadd__zListMixin.__iadd__x   s    Er   c                 L    |                      t          |           |z            S multiplyr   listr   ns     r   __mul__zListMixin.__mul__}       ~~d4jj1n---r   c                 L    |                      t          |           |z            S rB   rD   rF   s     r   __rmul__zListMixin.__rmul__   rI   r   c                     |dk    r| dd= n9t          |           }t          |dz
            D ]}|                     |           | S )rC   r   N   )rE   r   r?   )r   rG   cacher   s       r   __imul__zListMixin.__imul__   sV    66QQQJJE1q5\\ # #E""""r   c                     t          |          }t          |          D ]-}	 | |         ||         k    }n# t          $ r Y  dS w xY w|s dS .t          |           |k    S NFr    r   
IndexErrorr   r:   olenr   cs        r   __eq__zListMixin.__eq__   s    5zzt 	 	AGuQx'   uuu  uu4yyD     5
AAc                     t          |          }t          |          D ]C}	 | |         ||         k     }n# t          $ r Y  dS w xY w|r|c S ||         | |         k     r dS Dt          |           |k     S )NTFrR   rT   s        r   __lt__zListMixin.__lt__   s    5zzt 		 		AGeAh&   ttt  qDG##uu $4yy4rX   c                 *    d}| D ]}||k    r|dz  }|S )zStandard list count methodr   rM   r   )r   r5   countr   s       r   r\   zListMixin.count   s.     	 	Aaxx
r   c                     t          dt          |                     D ]}| |         |k    r|c S t          d|z            )zStandard list index methodr   z%s not found in object)r   r    
ValueError)r   r5   r   s      r   r"   zListMixin.index   sP    q#d))$$ 	 	AAw#~~ 1C7888r   c                 0    |g| t          |           d<   dS )zStandard list append methodNr    r   r5   s     r   appendzListMixin.append   s     ESYY[[r   c                 .    || t          |           d<   dS )zStandard list extend methodNr`   )r   valss     r   r?   zListMixin.extend   s     SYY[[r   c                 d    t          |t                    st          d|z            |g| ||<   dS )zStandard list insert methodr%   N)r   r*   r+   r4   s      r   insertzListMixin.insert   s>    %%% 	?5=>>> EU5[r   c                     | |         }| |= |S )zStandard list pop methodr   )r   r"   results      r   popzListMixin.pop   s    eKr   c                 2    | |                      |          = dS )zStandard list remove methodN)r"   ra   s     r   removezListMixin.remove   s    C!!!r   c                 &    | ddd         | dd<   dS )zStandard list reverse methodrg   Nr   )r   s    r   reversezListMixin.reverse   s    rv2v,QQQr   Fc                 4    t          | ||          | dd<   dS )zStandard list sort method)keyrn   N)sorted)r   rp   rn   s      r   sortzListMixin.sort   s"    3888QQQr   c                     |r"|| j         k     rt          d| j         z            | j        "|| j        k    rt          d| j        z            |                     ||           d S )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   sq     	Nft..:T_LMMM?&6DO+C+C=OPPPvx(((((r   c                 X    |                      t          ||dz   d          |g           d S NrM   )r2   r   )r   r"   values      r   r   zListMixin._set_single_rebuild   s.    eUQY22UG<<<<<r   c                     t          |           }d|cxk    r|k     rn n|S | |cxk    rdk     rn n||z   S t          d|z            )Nr   zinvalid index: %s)r    rS   )r   r"   lengths      r   r!   zListMixin._checkindex   sv    TL7ea6>!,u4555r   c                 j     t           d          rd fd|D             v rt          d          d S d S )N_allowedFc                 :    g | ]}t          |j                  S r   )r   r}   )r   r5   r   s     r   r   z,ListMixin._check_allowed.<locals>.<listcomp>   s%    IIICC77IIIr   z*Invalid type encountered in the arguments.)r	   r+   )r   itemss   ` r   r3   zListMixin._check_allowed   sW    4$$ 	NIIII5IIIII LMMM	N 	NIIr   c                 L   	 t          |          }n# t          $ r t          d          w xY w|                     |           t          |           }|                    |          \  }}}|j        |                     |||           dS |                     ||||           dS )z&Assign values to a slice of the objectz&can only assign an iterable to a sliceN)rE   r+   r3   r    r   step_assign_simple_slicer   )r   r"   values	valueListr-   startstopr   s           r   r2   zListMixin._set_slice   s    	FVII 	F 	F 	FDEEE	F 	I&&&d))!MM'22tT :%%eT9=====''tT9EEEEEs    ,c                 l    t          |||          }t          |          t          |          k    r.t          dt          |          t          |          fz            t                     t          t	          ||                     fd}                      |                       dS )z2Assign an extended slice by rebuilding entire listBattempt to assign sequence of size %d to extended slice of size %dc               3   |   K   t                    D ](} | v r|          V                      |           V  )d S r'   r   r   )r   r.   newValsr   s    r   r/   z:ListMixin._assign_extended_slice_rebuild.<locals>.newItems  s_      6]] 7 7<<!!*$$$$33A666666	7 7r   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011	7 	7 	7 	7 	7 	7 	7 	fhhjj)))))r   c                    t          |||          }t          |          t          |          k    r.t          dt          |          t          |          fz            t          ||          D ]\  }}|                     ||           dS )z9Assign an extended slice by re-assigning individual itemsr   N)r   r    r^   r   r   )r   r   r   r   r   r   r   r5   s           r   r   z ListMixin._assign_extended_slice  s    %t,,	y>>S^^++/25i..#i..1QR  
 )Y// 	% 	%FAsQ$$$$	% 	%r   c                      t                     t                    z
  z   t                    z   } fd}                     | |                       dS )z5Assign a simple slice; Can assign slice of any lengthc               3      K   t          dz             D ]9} | k    rE d {V  | k     r#| k     s| k    r                    |           V  :d S rx   r   )r   r-   r   r   r   r   s    r   r/   z0ListMixin._assign_simple_slice.<locals>.newItems1  s      7Q;'' ; ;::((((((((w;;5yyAII"77:::::; ;r   N)r    maxr,   )r   r   r   r   r.   r/   r-   s   ````  @r   r   zListMixin._assign_simple_slice+  s    d))5$4%'#i..8	; 	; 	; 	; 	; 	; 	; 	; 	; 	fhhjj)))))r   )rg   rQ   )$__name__
__module____qualname____doc__rt   ru   r   r#   r0   r6   r;   r=   r@   rH   rK   rO   rW   rZ   r\   r"   rb   r?   rf   rj   rl   rn   rr   r,   r   r!   r3   r2   r   r   r   __classcell__r8   s   @r   r   r      s       ' 'R JJ* * * * *4 4 4( ( (() ) )/ / /0 0 0  
. . .. . .  
! 
! 
!        9 9 9" " "! ! !" " "   " " "  9 9 9 9
) ) )= = =6 6 6N N N
F F F&* * *.% % %* * * * * * *r   r   N)r   	functoolsr   r   r   r   r   <module>r      sk     % $ $ $ $ $ k* k* k* k* k* k* k* k* k* k*r   