B
    ¦�2[†Š  ã               @   s&  d dl Z d dlmZmZ yd dlmZ W n  ek
rH   d dlmZ Y nX dddddd	d
gZdd„ Z	dd„ Z
dd„ Zdd„ Zeƒ ZG dd	„ d	ƒZG dd„ deƒZdZG dd„ deƒZG dd„ ded�ZG dd„ deeƒZdd„ ZG dd„ deƒZG dd„ deeƒZdd„ Zd d
„ Zd!d"„ Zd#d$„ ZdS )%é    N)ÚMappingProxyTypeÚDynamicClassAttribute)ÚOrderedDictÚEnumMetaÚEnumÚIntEnumÚFlagÚIntFlagÚautoÚuniquec             C   s   t | dƒpt | dƒpt | dƒS )z5Returns True if obj is a descriptor, False otherwise.Ú__get__Ú__set__Ú
__delete__)Úhasattr)Úobj© r   ú#C:\python_env\checklist\lib\enum.pyÚ_is_descriptor   s    

r   c             C   sT   | dd… | dd…   ko"dkn  oR| dd… dkoR| dd… dkoRt | ƒdkS )	z3Returns True if a __dunder__ name, False otherwise.Né   éþÿÿÿZ__é   Ú_éýÿÿÿé   )Úlen)Únamer   r   r   Ú
_is_dunder   s    (r   c             C   sL   | d | d   kodkn  oJ| dd… dkoJ| dd… dkoJt | ƒdkS )z1Returns True if a _sunder_ name, False otherwise.r   éÿÿÿÿr   é   r   r   )r   )r   r   r   r   Ú
_is_sunder"   s     r   c             C   s   dd„ }|| _ d| _dS )z"Make the given class un-picklable.c             S   s   t d|  ƒ‚d S )Nz%r cannot be pickled)Ú	TypeError)ÚselfÚprotor   r   r   Ú_break_on_call_reduce+   s    z6_make_class_unpicklable.<locals>._break_on_call_reducez	<unknown>N)Ú__reduce_ex__Ú
__module__)Úclsr#   r   r   r   Ú_make_class_unpicklable)   s    r'   c               @   s   e Zd ZdZeZdS )r
   zP
    Instances are replaced with an appropriate value in Enum class suites.
    N)Ú__name__r%   Ú__qualname__Ú__doc__Ú
_auto_nullÚvaluer   r   r   r   r
   1   s   c                   s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )Ú	_EnumDictz§Track enum member order and ensure member names are not reused.

    EnumMeta will use the names found in self._member_names as the
    enumeration member names.

    c                s    t ƒ  ¡  g | _g | _g | _d S )N)ÚsuperÚ__init__Ú_member_namesÚ_last_valuesÚ_ignore)r!   )Ú	__class__r   r   r/   ?   s    
z_EnumDict.__init__c                sP  t |ƒr†|dkrtdƒ‚|dkr.t| d|ƒ nV|dkr„t|tƒrR| dd¡ ¡ }nt|ƒ}|| _t	|ƒt	| j
ƒ@ }|r„td|f ƒ‚n¸t|ƒrœ|d	kršd
}n¢|| j
kr´td| ƒ‚nŠ|| jkrÀn~t|ƒ�s>|| krætd|| | f ƒ‚t|tƒ�r&|jtk�r |  |dt| j
ƒ| jdd… ¡|_|j}| j
 |¡ | j |¡ tƒ  ||¡ dS )zåChanges anything not dundered or not a descriptor.

        If an enum member name is used twice, an error is raised; duplicate
        values are not checked for.

        Single underscore (sunder) names are reserved.

        )Ú_order_Ú_create_pseudo_member_Ú_generate_next_value_Ú	_missing_Ú_ignore_z(_names_ are reserved for future Enum user6   Ú_generate_next_valuer8   ú,ú z-_ignore_ cannot specify already set names: %rZ	__order__r4   zAttempted to reuse key: %rz%r already defined as: %rr   N)r   Ú
ValueErrorÚsetattrÚ
isinstanceÚstrÚreplaceÚsplitÚlistr2   Úsetr0   r   r    r   r
   r,   r+   r9   r   r1   Úappendr.   Ú__setitem__)r!   Úkeyr,   Zalready)r3   r   r   rE   E   s>    	



"z_EnumDict.__setitem__)r(   r%   r)   r*   r/   rE   Ú__classcell__r   r   )r3   r   r-   8   s   r-   c                   sÚ   e Zd ZdZedd„ ƒZ‡ fdd„Zdd„ Zd)dddd	d
œdd„Zdd„ Z	‡ fdd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdd„ Zdd „ Z‡ fd!d"„Zdddd	d
œd#d$„Zed%d&„ ƒZed'd(„ ƒZ‡  ZS )*r   zMetaclass for Enumc             C   s0   t ƒ }|  |¡\}}|d k	r,t|dd ƒ|d< |S )Nr6   )r-   Ú_get_mixins_Úgetattr)Úmetaclsr&   ÚbasesZ	enum_dictÚmember_typeÚ
first_enumr   r   r   Ú__prepare__|   s
    zEnumMeta.__prepare__c          	      s   ˆ   dg ¡ d¡ ˆ d }x|D ]}ˆ  |d ¡ q W |  |¡\‰}|  ˆ ˆ|¡\}}}	‡ fdd„ˆ jD ƒ}
xˆ jD ]
}ˆ |= qrW ˆ  dd ¡}t|
ƒdh@ }|r²td d 	|¡¡ƒ‚dˆ krÂd	ˆ d< t
ƒ  | ||ˆ ¡}g |_tƒ |_ˆ|_d
d„ | ¡ D ƒ}i |_dˆ k�r8ˆtk	�r8d}t‡fdd„|D ƒƒ�s8t|ƒ �x6ˆ jD �]*}|
| }t|tƒ�sd|f}n|}ˆtk�rx|f}|	�sš||ƒ}t|dƒ�sÐ||_n6||f|žŽ }t|dƒ�sÐˆtk�rÆ||_n
ˆ|Ž |_|j}||_||_|j|Ž  x8|j ¡ D ]\}}|j|jk�rø|}P �qøW |j |¡ ||k�r<t|||ƒ ||j|< y||j|< W n tk
�rj   Y nX �qBW xPdD ]H}t||ƒ}tˆ|d ƒ}t||d ƒ}|d k	�rx||k�rxt|||ƒ �qxW t d k	�râ|�rÚ||_!t j|_|d k	�rt|t"ƒ�r| #dd¡ $¡ }||jk�rtdƒ‚|S )Nr8   c                s   i | ]}ˆ | |“qS r   r   )Ú.0Úk)Ú	classdictr   r   ú
<dictcomp>—   s    z$EnumMeta.__new__.<locals>.<dictcomp>r4   ÚmrozInvalid enum member name: {0}r:   r*   zAn enumeration.c             S   s   h | ]}|j D ]}|’qqS r   )Ú__dict__)rO   ÚbÚar   r   r   ú	<setcomp>°   s    z#EnumMeta.__new__.<locals>.<setcomp>r$   )Z__getnewargs_ex__Ú__getnewargs__r$   Ú
__reduce__c             3   s   | ]}|ˆ j kV  qd S )N)rT   )rO   Úm)rL   r   r   ú	<genexpr>Ã   s    z#EnumMeta.__new__.<locals>.<genexpr>Ú_value_)Ú__repr__Ú__str__Ú
__format__r$   r;   z#member order does not match _order_)%Ú
setdefaultrD   ÚpoprH   Ú
_find_new_r0   rC   r<   ÚformatÚjoinr.   Ú__new__Ú_member_names_r   Ú_member_map_Ú_member_type_rS   Ú_value2member_map_ÚobjectÚanyr'   r>   Útupler   r\   Ú_name_Ú__objclass__r/   Úitemsr=   r    rI   r   Ú__new_member__r?   r@   rA   )rJ   r&   rK   rQ   ÚignorerF   rM   re   Úsave_newÚuse_argsZenum_membersr   r4   Zinvalid_namesÚ
enum_classZbase_attributesÚmethodsÚmember_namer,   ÚargsZenum_memberZcanonical_memberZclass_methodZ
obj_methodZenum_method)r3   )rQ   rL   r   re   †   s˜    













zEnumMeta.__new__c             C   s   dS )z6
        classes/types should always be True.
        Tr   )r!   r   r   r   Ú__bool__  s    zEnumMeta.__bool__Nr   )ÚmoduleÚqualnameÚtypeÚstartc            C   s*   |dkr|   | |¡S | j||||||d�S )a  Either returns an existing member, or creates a new enum class.

        This method is used both when an enum class is given a value to match
        to an enumeration member (i.e. Color(3)) and for the functional API
        (i.e. Color = Enum('Color', names='RED GREEN BLUE')).

        When used for the functional API:

        `value` will be the name of the new class.

        `names` should be either a string of white-space/comma delimited names
        (values will start at `start`), or an iterator/mapping of name, value pairs.

        `module` should be set to the module this class is being created in;
        if it is not set, an attempt to find that module will be made, but if
        it fails the class will not be picklable.

        `qualname` should be set to the actual location this class can be found
        at in its module; by default it is set to the global scope.  If this is
        not correct, unpickling will fail in some circumstances.

        `type`, if set, will be mixed in as the first base class.

        N)ry   rz   r{   r|   )re   Ú_create_)r&   r,   Únamesry   rz   r{   r|   r   r   r   Ú__call__  s    zEnumMeta.__call__c             C   s6   t |tƒs dd l}| dtd¡ t || ƒo4|j| jkS )Nr   zHusing non-Enums in containment checks will raise TypeError in Python 3.8r   )r>   r   ÚwarningsÚwarnÚDeprecationWarningrm   rg   )r&   Úmemberr€   r   r   r   Ú__contains__7  s    
zEnumMeta.__contains__c                s(   || j krtd| j ƒ‚tƒ  |¡ d S )Nz%s: cannot delete Enum member.)rg   ÚAttributeErrorr(   r.   Ú__delattr__)r&   Zattr)r3   r   r   r†   @  s    
zEnumMeta.__delattr__c             C   s   ddddg| j  S )Nr3   r*   Ú__members__r%   )rf   )r!   r   r   r   Ú__dir__H  s    
zEnumMeta.__dir__c             C   s>   t |ƒrt|ƒ‚y
| j| S  tk
r8   t|ƒd‚Y nX dS )a5  Return the enum member matching `name`

        We use __getattr__ instead of descriptors or inserting into the enum
        class' __dict__ in order to support `name` and `value` being both
        properties for enum members (which live in the class' __dict__) and
        enum members themselves.

        N)r   r…   rg   ÚKeyError)r&   r   r   r   r   Ú__getattr__L  s    	
zEnumMeta.__getattr__c             C   s
   | j | S )N)rg   )r&   r   r   r   r   Ú__getitem__\  s    zEnumMeta.__getitem__c                s   ‡ fdd„ˆ j D ƒS )Nc             3   s   | ]}ˆ j | V  qd S )N)rg   )rO   r   )r&   r   r   r[   `  s    z$EnumMeta.__iter__.<locals>.<genexpr>)rf   )r&   r   )r&   r   Ú__iter___  s    zEnumMeta.__iter__c             C   s
   t | jƒS )N)r   rf   )r&   r   r   r   Ú__len__b  s    zEnumMeta.__len__c             C   s
   t | jƒS )z·Returns a mapping of member name->value.

        This mapping lists all enum members, including aliases. Note that this
        is a read-only view of the internal mapping.

        )r   rg   )r&   r   r   r   r‡   e  s    zEnumMeta.__members__c             C   s
   d| j  S )Nz	<enum %r>)r(   )r&   r   r   r   r]   o  s    zEnumMeta.__repr__c                s   ‡ fdd„t ˆ jƒD ƒS )Nc             3   s   | ]}ˆ j | V  qd S )N)rg   )rO   r   )r&   r   r   r[   s  s    z(EnumMeta.__reversed__.<locals>.<genexpr>)Úreversedrf   )r&   r   )r&   r   Ú__reversed__r  s    zEnumMeta.__reversed__c                s0   | j  di ¡}||krtdƒ‚tƒ  ||¡ dS )zùBlock attempts to reassign Enum members.

        A simple assignment to the class namespace only changes one of the
        several possible ways to get an Enum member from the Enum class,
        resulting in an inconsistent Enumeration.

        rg   zCannot reassign members.N)rT   Úgetr…   r.   Ú__setattr__)r&   r   r,   Z
member_map)r3   r   r   r‘   u  s    zEnumMeta.__setattr__c         
   C   s‚  | j }|dkr| fn|| f}|  |¡\}	}
| ||¡}t|tƒrP| dd¡ ¡ }t|ttfƒrÄ|rÄt|d tƒrÄ|g  }}g }xDt	|ƒD ]8\}}|
 
||||dd… ¡}| |¡ | ||f¡ qˆW x6|D ].}t|tƒrè|||  }}n|\}}|||< qÊW | ||||¡}|dk�rTyt d¡jd }W n( ttfk
�rR } zW dd}~X Y nX |dk�rht|ƒ n||_|dk	�r~||_|S )a•  Convenience method to create a new Enum class.

        `names` can be:

        * A string containing member names, separated either with spaces or
          commas.  Values are incremented by 1 from `start`.
        * An iterable of member names.  Values are incremented by 1 from `start`.
        * An iterable of (member name, value) pairs.
        * A mapping of member name -> value pairs.

        Nr:   r;   r   r   r(   )r3   rH   rN   r>   r?   r@   rA   rl   rB   Ú	enumerater6   rD   re   ÚsysÚ	_getframeÚ	f_globalsr…   r<   r'   r%   r)   )r&   Z
class_namer~   ry   rz   r{   r|   rJ   rK   r   rM   rQ   Zoriginal_namesÚlast_valuesÚcountr   r,   Úitemrv   Úmember_valuert   Úexcr   r   r   r}   ‚  s<    
 







zEnumMeta._create_c             C   s´   | st tfS d }}x,| D ]$}|tk	rt|tƒr|jrtdƒ‚qW t|tƒsTtdƒ‚t| d tƒst| d }| d }n8x6| d jD ](}t|tƒrœ|dkr¨|}q€|dkr€|}q€W ||fS )zžReturns the type for creating enum members, and the first inherited
        enum class.

        bases: the tuple of bases that was given to __new__

        NzCannot extend enumerationszHnew enumerations must be created as `ClassName([mixin_type,] enum_type)`r   r   )rj   r   Ú
issubclassrf   r    Ú__mro__)rK   rL   rM   Úbaser   r   r   rH   ·  s(    




zEnumMeta._get_mixins_c       	      C   s’   |   dd¡}|dk	}|dkrtxVdD ]H}x8||fD ],}t||dƒ}|ddjtjtjhkr0|}P q0W |dk	r"P q"W tj}|tjkr„d}nd}|||fS )a  Returns the __new__ to be used for creating the enum members.

        classdict: the class dictionary given to __new__
        member_type: the data type whose __new__ will be used by default
        first_enum: enumeration to check for an overriding __new__

        re   N)rp   re   FT)r�   rI   re   rj   r   )	rQ   rL   rM   re   rr   ÚmethodZpossibleÚtargetrs   r   r   r   rb   ä  s(    


zEnumMeta._find_new_)N)r(   r%   r)   r*   ÚclassmethodrN   re   rx   r   r„   r†   rˆ   rŠ   r‹   rŒ   r�   Úpropertyr‡   r]   r�   r‘   r}   ÚstaticmethodrH   rb   rG   r   r   )r3   r   r   z   s(   
 	
5-c               @   s‚   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZeddd„ƒZdS )r   zRGeneric enumeration.

    Derive from this class to define new enumerations.

    c             C   sj   t |ƒ| kr|S y|| jkr&| j| S W n6 tk
r^   x | j ¡ D ]}|j|krD|S qDW Y nX |  |¡S )N)r{   ri   r    rg   Úvaluesr\   r7   )r&   r,   rƒ   r   r   r   re     s    

zEnum.__new__c          	   C   s8   x2t |ƒD ]"}y|d S  tk
r*   Y q
X q
W |S d S )Nr   )rŽ   r    )r   r|   r—   r–   Ú
last_valuer   r   r   r6   -  s    
zEnum._generate_next_value_c             C   s   t d|| jf ƒ‚d S )Nz%r is not a valid %s)r<   r(   )r&   r,   r   r   r   r7   6  s    zEnum._missing_c             C   s   d| j j| j| jf S )Nz<%s.%s: %r>)r3   r(   rm   r\   )r!   r   r   r   r]   :  s    zEnum.__repr__c             C   s   d| j j| jf S )Nz%s.%s)r3   r(   rm   )r!   r   r   r   r^   >  s    zEnum.__str__c                s&   ‡ fdd„ˆ j  ¡ D ƒ}dddg| S )Nc                s2   g | ]*}|j D ]}|d  dkr|ˆ jkr|‘qqS )r   r   )rT   rg   )rO   r&   rZ   )r!   r   r   ú
<listcomp>C  s   
z Enum.__dir__.<locals>.<listcomp>r3   r*   r%   )r3   rS   )r!   Zadded_behaviorr   )r!   r   rˆ   A  s    
zEnum.__dir__c             C   s0   | j tkrt}t| ƒ}n| j }| j}| ||¡S )N)rh   rj   r?   r\   r_   )r!   Zformat_specr&   Úvalr   r   r   r_   J  s    

zEnum.__format__c             C   s
   t | jƒS )N)Úhashrm   )r!   r   r   r   Ú__hash__Y  s    zEnum.__hash__c             C   s   | j | jffS )N)r3   r\   )r!   r"   r   r   r   r$   \  s    zEnum.__reduce_ex__c             C   s   | j S )zThe name of the Enum member.)rm   )r!   r   r   r   r   f  s    z	Enum.namec             C   s   | j S )zThe value of the Enum member.)r\   )r!   r   r   r   r,   k  s    z
Enum.valueNc                sž   t tj| ƒ}ˆrt ˆƒ‰n|‰‡ ‡fdd„ˆ ¡ D ƒ}y|jdd„ d� W n$ tk
rp   |jdd„ d� Y nX | |||d�} t| _| | j	¡ | ||< | S )z[
        Create a new Enum subclass that replaces a collection of global constants
        c                s    g | ]}ˆ |ƒr|ˆ| f‘qS r   r   )rO   r   )ÚfilterÚsourcer   r   r¥   …  s   z!Enum._convert.<locals>.<listcomp>c             S   s   | d | d fS )Nr   r   r   )Útr   r   r   Ú<lambda>Š  s    zEnum._convert.<locals>.<lambda>)rF   c             S   s   | d S )Nr   r   )r«   r   r   r   r¬   �  s    )ry   )
Úvarsr“   ÚmodulesÚkeysÚsortr    Ú_reduce_ex_by_namer$   Úupdater‡   )r&   r   ry   r©   rª   Zmodule_globalsÚmembersr   )r©   rª   r   Ú_convertp  s    

zEnum._convert)N)r(   r%   r)   r*   re   r6   r    r7   r]   r^   rˆ   r_   r¨   r$   r   r   r,   r´   r   r   r   r   r     s   		
)Ú	metaclassc               @   s   e Zd ZdZdS )r   z.Enum where members are also (and must be) intsN)r(   r%   r)   r*   r   r   r   r   r   •  s   c             C   s   | j S )N)r   )r!   r"   r   r   r   r±   ™  s    r±   c               @   sp   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r   zSupport for flagsc          	   C   sd   |s|dk	r|S dS xBt |ƒD ]6}yt|ƒ}P W q tk
rR   td| ƒd‚Y qX qW d|d  S )zñ
        Generate the next value when not given.

        name: the name of the member
        start: the initital start value or None
        count: the number of existing members
        last_value: the last value assigned or None
        Nr   zInvalid Flag value: %rr   )rŽ   Ú	_high_bitÚ	Exceptionr    )r   r|   r—   r–   r¤   Zhigh_bitr   r   r   r6   Ÿ  s    	zFlag._generate_next_value_c             C   s.   |}|dk r| }|   |¡}|dk r*| }|S )Nr   )r5   )r&   r,   Zoriginal_valueZpossible_memberr   r   r   r7   ²  s    
zFlag._missing_c             C   sb   | j  |d¡}|dkr^t| |ƒ\}}|r:td|| jf ƒ‚t | ¡}d|_||_| j  	||¡}|S )zL
        Create a composite member iff value contains only members.
        Nz%r is not a valid %s)
ri   r�   Ú
_decomposer<   r(   rj   re   rm   r\   r`   )r&   r,   Úpseudo_memberr   Úextra_flagsr   r   r   r5   ¼  s    
zFlag._create_pseudo_member_c             C   s8   t || jƒs&dd l}| dtd¡ dS |j| j@ |jkS )Nr   zHusing non-Flags in containment checks will raise TypeError in Python 3.8r   F)r>   r3   r€   r�   r‚   r\   )r!   Úotherr€   r   r   r   r„   Ð  s    zFlag.__contains__c             C   sV   | j }| jd k	r$d|j| j| jf S t|| jƒ\}}d|jd dd„ |D ƒ¡| jf S )Nz<%s.%s: %r>ú|c             S   s   g | ]}t |jp|jƒ‘qS r   )r?   rm   r\   )rO   rZ   r   r   r   r¥   á  s    z!Flag.__repr__.<locals>.<listcomp>)r3   rm   r(   r\   r¸   rd   )r!   r&   r³   Ú	uncoveredr   r   r   r]   Ú  s    
zFlag.__repr__c             C   s€   | j }| jd k	r d|j| jf S t|| jƒ\}}t|ƒdkr^|d jd kr^d|j|d jf S d|jd dd„ |D ƒ¡f S d S )Nz%s.%sr   r   z%s.%rr¼   c             S   s   g | ]}t |jp|jƒ‘qS r   )r?   rm   r\   )rO   rZ   r   r   r   r¥   ï  s    z Flag.__str__.<locals>.<listcomp>)r3   rm   r(   r¸   r\   r   rd   )r!   r&   r³   r½   r   r   r   r^   å  s    
zFlag.__str__c             C   s
   t | jƒS )N)Úboolr\   )r!   r   r   r   rx   ò  s    zFlag.__bool__c             C   s"   t || jƒstS |  | j|jB ¡S )N)r>   r3   ÚNotImplementedr\   )r!   r»   r   r   r   Ú__or__õ  s    zFlag.__or__c             C   s"   t || jƒstS |  | j|j@ ¡S )N)r>   r3   r¿   r\   )r!   r»   r   r   r   Ú__and__ú  s    zFlag.__and__c             C   s"   t || jƒstS |  | j|jA ¡S )N)r>   r3   r¿   r\   )r!   r»   r   r   r   Ú__xor__ÿ  s    zFlag.__xor__c             C   sR   t | j| jƒ\}}|  d¡}x*| jD ] }||kr$|j| j@ s$||B }q$W |  |¡S )Nr   )r¸   r3   r\   )r!   r³   r½   ZinvertedrZ   r   r   r   Ú
__invert__  s    
zFlag.__invert__N)r(   r%   r)   r*   r6   r    r7   r5   r„   r]   r^   rx   rÀ   rÁ   rÂ   rÃ   r   r   r   r   r   œ  s   

c               @   sT   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zdd	„ Zd
d„ Z	eZ
eZe	Zdd„ ZdS )r	   zSupport for integer-based Flagsc             C   s*   t |tƒstd|| jf ƒ‚|  |¡}|S )Nz%r is not a valid %s)r>   Úintr<   r(   r5   )r&   r,   Z
new_memberr   r   r   r7     s    

zIntFlag._missing_c             C   s´   | j  |d ¡}|d kr°|g}t| |ƒ\}}xL|rvt|ƒ}d| }|| j kr\||kr\| |¡ || krld}q,||N }q,W x6t|ƒD ]*}t | |¡}d |_||_	| j  
||¡}q‚W |S )Nr   r   )ri   r�   r¸   r¶   rD   rŽ   rÄ   re   rm   r\   r`   )r&   r,   r¹   Zneed_to_creater   rº   ZbitZ
flag_valuer   r   r   r5     s&    


zIntFlag._create_pseudo_member_c             C   s0   t || jtfƒstS |  | j|  |¡jB ¡}|S )N)r>   r3   rÄ   r¿   r\   )r!   r»   Úresultr   r   r   rÀ   5  s    zIntFlag.__or__c             C   s,   t || jtfƒstS |  | j|  |¡j@ ¡S )N)r>   r3   rÄ   r¿   r\   )r!   r»   r   r   r   rÁ   ;  s    zIntFlag.__and__c             C   s,   t || jtfƒstS |  | j|  |¡jA ¡S )N)r>   r3   rÄ   r¿   r\   )r!   r»   r   r   r   rÂ   @  s    zIntFlag.__xor__c             C   s   |   | j ¡}|S )N)r3   r\   )r!   rÅ   r   r   r   rÃ   I  s    zIntFlag.__invert__N)r(   r%   r)   r*   r    r7   r5   rÀ   rÁ   rÂ   Ú__ror__Ú__rand__Ú__rxor__rÃ   r   r   r   r   r	     s   c             C   s   |   ¡ d S )z@returns index of highest bit, or -1 if value is zero or negativer   )Ú
bit_length)r,   r   r   r   r¶   N  s    r¶   c             C   sb   g }x0| j  ¡ D ]"\}}||jkr| ||jf¡ qW |r^d dd„ |D ƒ¡}td| |f ƒ‚| S )z?Class decorator for enumerations ensuring unique member values.z, c             S   s   g | ]\}}d ||f ‘qS )z%s -> %sr   )rO   Úaliasr   r   r   r   r¥   Z  s    zunique.<locals>.<listcomp>z duplicate values found in %r: %s)r‡   ro   r   rD   rd   r<   )ZenumerationZ
duplicatesr   rƒ   Zalias_detailsr   r   r   r   R  s    
c             C   sØ   |}|dk }|r*dd„ t | j ¡ ƒD ƒ}ndd„ t | j ¡ ƒD ƒ}g }x4|D ],\}}|rL||@ |krL| |¡ || M }qLW |sš|| jkrš| | j| ¡ |jdd„ dd� t|ƒd	krÐ|d j|krÐ| d¡ ||fS )
z#Extract all members from the value.r   c             S   s"   g | ]\}}|j d k	r||f‘qS )N)r   )rO   ÚvrZ   r   r   r   r¥   j  s   z_decompose.<locals>.<listcomp>c             S   s*   g | ]"\}}|j d k	st|ƒr||f‘qS )N)r   Ú_power_of_two)rO   rË   rZ   r   r   r   r¥   q  s   c             S   s   | j S )N)r\   )rZ   r   r   r   r¬   |  s    z_decompose.<locals>.<lambda>T)rF   Úreverser   )rB   ri   ro   rD   r°   r   r,   ra   )Zflagr,   Znot_coveredZnegativeZflags_to_checkr³   rƒ   r™   r   r   r   r¸   _  s$    

r¸   c             C   s   | dk rdS | dt | ƒ kS )Nr   Fr   )r¶   )r,   r   r   r   rÌ   ‚  s    rÌ   )r“   Ztypesr   r   Z_collectionsr   ÚImportErrorZcollectionsÚ__all__r   r   r   r'   rj   r+   r
   Údictr-   r   r{   r   rÄ   r   r±   r   r	   r¶   r   r¸   rÌ   r   r   r   r   Ú<module>   s<   ?    qA#