ó
ûR‹_c           @   sÂ  d  Z  d d l Z d Z d Z d Z d Z d e f d „  ƒ  YZ e j e f Z	 e e
 ƒ Z e e ƒ Z d	 e f d
 „  ƒ  YZ e d k r¾e d d f d ƒ Z e d d f ƒ Z e d d f d d d f d d d d ƒZ e GHe d @GHe d BGHe d d f AGHe d GHd e k GHe j e ƒ GHe j e ƒ GHe j e ƒ GHe j e ƒ GHx e D] Z e GHqTWe j ƒ  GHe e k GHe e k GHe e k GHe e ƒ GHe e ƒ GHe e ƒ GHe j ƒ  GHn  d S(   st   Immutable integer set type.

Integer set class.

Copyright (C) 2006, Heiko Wundram.
Released under the MIT license.
iÿÿÿÿNs    Heiko Wundram <me@modelnine.org>s   0.2t   6s
   2006-01-20t	   _Infinityc           B   s_   e  Z d  Z d g Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z RS(
   s0   Internal type used to represent infinity values.t   _negc         C   s   | |  _  d  S(   N(   R   (   t   selft   neg(    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __init__   s    c         C   s3   t  | t ƒ s t S|  j o2 t  | t ƒ o1 | j S(   N(   t
   isinstancet   _VALID_TYPESt   NotImplementedR   R   (   R   t   value(    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __lt__   s    	c         C   s   t  | t ƒ s t S|  j S(   N(   R   R   R   R   (   R   R	   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __le__%   s    c         C   s4   t  | t ƒ s t S|  j p2 t  | t ƒ o2 | j S(   N(   R   R   R   R   R   (   R   R	   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __gt__*   s    	c         C   s   t  | t ƒ s t S|  j S(   N(   R   R   R   R   (   R   R	   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __ge__0   s    c         C   s2   t  | t ƒ s t St  | t ƒ o1 |  j | j k S(   N(   R   R   R   R   R   (   R   R	   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __eq__5   s    c         C   s3   t  | t ƒ s t St  | t ƒ p2 |  j | j k S(   N(   R   R   R   R   R   (   R   R	   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __ne__:   s    c         C   s   d S(   Nt   None(    (   R   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __repr__?   s    (   t   __name__t
   __module__t   __doc__t	   __slots__R   R
   R   R   R   R   R   R   (    (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyR      s   								t   IntSetc           B   s–  e  Z d  Z d d d d g Z d „  Z e e d „ Z d „  Z d „  Z	 dJ d	 „ Z e d
 d d d „  ƒ Z e d d d d „  ƒ Z e d d d d „  ƒ Z e d d d d „  ƒ Z e d d d d „  ƒ Z e d d d d „  ƒ Z e d d d d „  ƒ Z e d d d d „  ƒ Z e d d d d „  ƒ Z e d  d d! d" „  ƒ Z e d# d d! d$ „  ƒ Z e d% d d! d& „  ƒ Z e d' d( d) d* „  ƒ Z e d+ d( d, d- „  ƒ Z e d. d( d/ d0 „  d1 „  ƒ Z e d2 d( d) d3 „  ƒ Z e d4 d( d5 d6 „  d7 „  ƒ Z e d8 d( d9 d: „  d; „  ƒ Z e d< d( d= d> „  ƒ Z e d? d( d@ dA „  dB „  ƒ Z [ dC „  Z  e  Z! dD „  Z" dE „  Z# dF „  Z$ dG „  Z% dH „  Z& dI „  Z' RS(K   sv   Integer set class with efficient storage in a RLE format of ranges.
    Supports minus and plus infinity in the range.t   _rangest   _mint   _maxt   _hashc         O   s¡  t  | ƒ d k r~ t | d t ƒ r~ | r: t d ƒ ‚ n  | d j |  _ | d j |  _ | d j |  _ | d j |  _ d Sg  |  _ | j d t	 ƒ |  _ | j d t
 ƒ |  _ |  j d k rÌ t	 |  _ n  |  j d k rç t
 |  _ n  | rü t d ƒ ‚ n  t |  j t j ƒ p|  j t	 k s/t d ƒ ‚ n  t |  j t j ƒ pP|  j t
 k sbt d	 ƒ ‚ n  |  j t	 k	 r¡|  j t
 k	 r¡|  j |  j k r¡t d
 ƒ ‚ n  t |  j t j ƒ rÈ|  j d 7_ n  xÈ| D]À} t | t j ƒ rû| | d } } nt | t ƒ rt  | ƒ d k r+t d ƒ ‚ n  | \ } } | d k rO|  j } n  | d k rg|  j } n  t | t j ƒ p‚| t	 k s”t d ƒ ‚ n  t | t j ƒ p¯| t
 k sÁt d ƒ ‚ n  | t	 k	 rë| t
 k	 rë| | k rëqÏn  t | t j ƒ r| d 7} qn t d ƒ ‚ | |  j k r.qÏn | |  j k  rI|  j } n  | |  j k  r^qÏn | |  j k ry|  j } n  |  j j | | f ƒ qÏW|  j ƒ  d S(   sŽ  Initialize an integer set. The constructor accepts an unlimited
        number of arguments that may either be tuples in the form of
        (start,stop) where either start or stop may be a number or None to
        represent maximum/minimum in that direction. The range specified by
        (start,stop) is always inclusive (differing from the builtin range
        operator).

        Keyword arguments that can be passed to an integer set are min and
        max, which specify the minimum and maximum number in the set,
        respectively. You can also pass None here to represent minus or plus
        infinity, which is also the default.
        i   i    s*   No keyword arguments for copy constructor.Nt   mint   maxs   Invalid keyword argument.s   Invalid type of min argument.s   Invalid type of max argument.s$   Minimum is not smaller than maximum.i   s$   Invalid tuple, must be (start,stop).s   Invalid type of tuple start.s   Invalid type of tuple stop.s   Invalid argument.(   t   lenR   R   t
   ValueErrorR   R   R   R   t   popt   _MININFt   _MAXINFR   t   sixt   integer_typest	   TypeErrort   tuplet   appendt
   _normalize(   R   t   argst   kwargst   argt   startt   stop(    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyR   V   sr    %	$$c         c   sƒ  | } i t  d 6t  d 6} d t | ƒ d t | ƒ } } d \ }	 }
 x|	 | k  sb |
 | k  r^|	 | k  rè |
 | k  r¦ | |	 d ?|	 d @| |
 d ?|
 d @k  s² |
 | k rè | |	 d ?|	 d @d |	 d @} } } |	 d 7}	 n3 | |
 d ?|
 d @d |
 d @} } } |
 d 7}
 | | k  rQ| | k r7Pn  | | | f f V| } n  | | | <qJ W| | k  r| | | f f Vn  d  S(   Nt   r1t   r2i   i    i   (   i    i    (   t   FalseR   (   R   R-   R.   t   minvalt   maxvalt   curvalt	   curstatest   imaxt   jmaxt   it   jt   cur_rt   newnamet   newstate(    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   _iterranges²   s(    !,))
	c         C   sÝ   |  j  j ƒ  d } xŸ | t |  j  ƒ k  r´ |  j  | d |  j  | d d k  r§ |  j  | d d t |  j  | d d |  j  | d ƒ f |  j  | d <|  j  | =q | d 7} q Wt |  j  ƒ |  _  t |  j  ƒ |  _ d  S(   Ni   i    (   R   t   sortR   R   R%   t   hashR   (   R   R6   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyR'   É   s    &"c         C   s£   t  | t ƒ r |  | f St  | t j t f ƒ ra y |  |  j | ƒ f SWqŸ t k
 r] t SXn> t  | t ƒ rŸ y |  |  j | Œ  f SWqŸ t k
 r› t SXn  t S(   N(	   R   R   R"   R#   R%   t	   __class__R$   R   t   list(   R   t   other(    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt
   __coerce__×   s    
c            sy   | d k r ‡  f d †  } n- | d k r? ‡  ‡ f d †  } n t  d ƒ ‚ y |  | _ Wn t k
 rk n X| | _ | S(   sK  Makes a function to match two ranges. Accepts two types: either
        'set', which defines a function which returns a set with all ranges
        matching pall (pany is ignored), or 'bool', which returns True if pall
        matches for all ranges and pany matches for any one range. doc is the
        dostring to give this function. pany may be none to ignore the any
        match.

        The predicates get a dict with two keys, 'r1', 'r2', which denote
        whether the current range is present in range1 (self) and/or range2
        (other) or none of the two, respectively.t   setc            s@  |  j  | ƒ } | t k r t S| d } |  j j |  j ƒ } t |  j | j ƒ | _ t |  j | j ƒ | _ g  | _ xž |  j	 |  j | j | j | j ƒ D]x \ } \ } } ˆ  | ƒ rœ | j rû | j d d | k rû | j d d | f | j d <q| j j
 | | f ƒ qœ qœ Wt | j ƒ | _ t |  j ƒ | _ | S(   Ni   iÿÿÿÿi    (   RA   R   R>   t   __new__R   R   R   R   R   R;   R&   R%   R=   R   (   R   R@   t   coercedt   newsett   statesR+   R,   (   t   pall(    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   fü   s$    
	" !t   boolc   	         sµ   |  j  | ƒ } | t k r t S| d } t |  j | j ƒ } t |  j | j ƒ } ˆ } xT |  j |  j | j | | ƒ D]4 \ } \ } } ˆ  | ƒ s› t S| pª ˆ | ƒ } qy W| S(   Ni   (	   RA   R   R   R   R   R   R;   R   R/   (	   R   R@   RD   R   R   t   foundRF   R+   R,   (   RG   t   pany(    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRH     s    
.s#   Invalid type of function to create.(   R   t	   func_nameR$   t   func_doc(   t   namet   typet   docRG   RK   RH   (    (   RG   RK   sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   _make_functionï   s    	t   __and__RB   s&   Intersection of two sets as a new set.c         C   s   |  d o |  d S(   NR-   R.   (    (   t   s(    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   <lambda>+  t    t   __rand__c         C   s   |  d o |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   .  RU   t   intersectionc         C   s   |  d o |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   1  RU   t   __or__s   Union of two sets as a new set.c         C   s   |  d p |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   6  RU   t   __ror__c         C   s   |  d p |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   9  RU   t   unionc         C   s   |  d p |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   <  RU   t   __sub__s$   Difference of two sets as a new set.c         C   s   |  d o |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   A  RU   t   __rsub__c         C   s   |  d o |  d S(   NR.   R-   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   D  RU   t
   differencec         C   s   |  d o |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   G  RU   t   __xor__s.   Symmetric difference of two sets as a new set.c         C   s   |  d |  d AS(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   L  RU   t   __rxor__c         C   s   |  d |  d AS(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   O  RU   t   symmetric_differencec         C   s   |  d |  d AS(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   R  RU   t   __contains__RI   s*   Returns true if self is superset of other.c         C   s   |  d p |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   W  RU   t   issubsets(   Returns true if self is subset of other.c         C   s   |  d p |  d S(   NR.   R-   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   Z  RU   t   istruesubsets-   Returns true if self is true subset of other.c         C   s   |  d p |  d S(   NR.   R-   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   ]  RU   c         C   s   |  d o |  d S(   NR.   R-   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   ^  RU   t
   issupersetc         C   s   |  d p |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   a  RU   t   istruesupersets/   Returns true if self is true superset of other.c         C   s   |  d p |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   d  RU   c         C   s   |  d o |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   e  RU   t   overlapss)   Returns true if self overlaps with other.c         C   s   t  S(   N(   t   True(   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   h  RU   c         C   s   |  d o |  d S(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   i  RU   R   s'   Returns true if self is equal to other.c         C   s   |  d |  d AS(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   n  RU   R   s+   Returns true if self is different to other.c         C   s   t  S(   N(   Rg   (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   q  RU   c         C   s   |  d |  d AS(   NR-   R.   (    (   RS   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyRT   r  RU   c         C   s¹   |  j  j |  j  ƒ } |  j | _ |  j | _ g  | _ |  j } xH |  j D]= } | | d k  rI | j j | | d f ƒ | d } qI qI W| |  j k  rµ | j j | |  j f ƒ n  | S(   s   Inverse of set as a new set.i    i   (   R>   RC   R   R   R   R&   (   R   RE   t   laststopt   r(    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   inversex  s    		c         C   s   |  j  S(   s¦   Returns a hash value representing this integer set. As the set is
        always stored normalized, the hash value is guaranteed to match for
        matching ranges.(   R   (   R   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __hash__  s    c         C   s™   |  j  s d S|  j  d d t k s; |  j  d d t k rJ t d ƒ ‚ n  d } x' |  j  D] } | | d | d 7} qZ W| d k r• t d ƒ ‚ n  | S(	   så   Get length of this integer set. In case the length is larger than
        2**31 (including infinitely sized integer sets), it raises an
        OverflowError. This is due to len() restricting the size to
        0 <= len < 2**31.i    iÿÿÿÿi   s   Infinitely sized integer set.i   i   s   Integer set bigger than 2**31.I   €    (   R   R    R!   t   OverflowError(   R   t   rlenRi   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __len__—  s    	.c         C   ss   |  j  s d S|  j  d d t k s; |  j  d d t k r? d Sd } x' |  j  D] } | | d | d 7} qO W| S(   s<  Returns the length of this integer set as an integer. In case the
        length is infinite, returns -1. This function exists because of a
        limitation of the builtin len() function which expects values in
        the range 0 <= len < 2**31. Use this function in case your integer
        set might be larger.i    iÿÿÿÿi   (   R   R    R!   (   R   Rm   Ri   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyR   ¨  s    	.c         C   s   t  |  j ƒ S(   s<   Returns true if this integer set contains at least one item.(   RI   R   (   R   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __nonzero__¸  s    c         c   s  g  } xÂ |  j  D]· } | d t k rv | d t k rX | j d d g d d g f ƒ qÇ | j | d d d g ƒ q | d t k r  | j | d d g ƒ q x$ t | d | d ƒ D] } | Vq¸ Wq W| rx; t rx+ | D]# } | d V| d c | d 7<qá WqÔ Wn  d S(   sü   Iterate over all values in this integer set. Iteration always starts
        by iterating from lowest to highest over the ranges that are bounded.
        After processing these, all ranges that are unbounded (maximum 2) are
        yielded intermixed.i    i   iÿÿÿÿN(   R   R    R!   t   extendR&   t   xrangeRg   (   R   t   ubrangesRi   t   valt   ubrange(    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   __iter__½  s    "		c         C   s  g  } x¦ |  j  D]› \ } } t | t j ƒ rd t | t j ƒ rd | | d k rd | j d | ƒ q t | t j ƒ r” | j d | | d f ƒ q | j d | | f ƒ q W|  j t k	 rÕ | j d |  j ƒ n  |  j t k	 rû | j d |  j ƒ n  d |  j	 j
 d j | ƒ f S(   sr   Return a representation of this integer set. The representation is
        executable to get an equal integer set.i   s   %rs   (%r,%r)s   min=%rs   max=%rs   %s(%s)s   ,(   R   R   R"   R#   R&   R   R    R   R!   R>   R   t   join(   R   t   rvR+   R,   (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyR   Ø  s    $N((   R   R   R   R   R   R    R!   R;   R'   RA   R   RQ   RR   RV   RW   RX   RY   RZ   R[   R\   R]   R^   R_   R`   Ra   Rb   Rc   Rd   Re   Rf   R   R   Rj   t
   __invert__Rk   Rn   R   Ro   Ru   R   (    (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyR   P   s    	\		:																						
				t   __main__i
   i   i   i   i   R   i    R   i(   in   i   i   (   R   R"   t
   __author__t   __version__t   __revision__t   __date__t   objectR   R#   R   Rg   R    R/   R!   R   R   t   xt   yt   zRb   Rc   Rs   Rj   R=   R   (    (    (    sJ   /var/www/syncserver/local/lib/python2.7/site-packages/paste/util/intset.pyt   <module>   sF   +ÿ œ*				