U
    wy]8                     @   s   d dl Z d dlmZmZ 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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   A/home/stadmin/Documents/SimTableSoftware/Python-3.8.0/Lib/enum.py_is_descriptor   s
    
r   c                 C   sL   t | dkoJ| dd | dd   ko.dkn  oJ| d dkoJ| d dkS )z3Returns True if a __dunder__ name, False otherwise.   N   Z___lennamer   r   r   
_is_dunder   s    &

r   c                 C   sL   t | dkoJ| d | d   ko&dkn  oJ| dd dkoJ| dd 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selfZ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	   ,   s   c                       s,   e Zd ZdZ fddZ fddZ  ZS )	_EnumDictzTrack 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   r0   :   s    
z_EnumDict.__init__c                    sP  t |r|dkrtd|dkr.t| d| nV|dkrt|trR|dd }nt|}|| _t	|t	| j
@ }|rtd|f nt|r|d	krd
}n|| j
krtd| n|| jkrn~t|s>|| krtd|| | f t|tr&|jtkr | |dt| j
| jdd |_|j}| j
| | j| t || dS )zChanges 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 user9   _generate_next_valuer;   , z-_ignore_ cannot specify already set names: %rZ	__order__r7   zAttempted to reuse key: %rz%r already defined as: %rr   N)r   
ValueErrorsetattr
isinstancestrreplacesplitlistr3   setr1   r   r    r   r	   r,   r+   r<   r   r2   appendr/   __setitem__)r"   keyr,   Zalreadyr5   r   r   rH   @   s<    	



"z_EnumDict.__setitem__)r(   r%   r)   r*   r0   rH   __classcell__r   r   r5   r   r-   3   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d.d%d&Z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 )Nr9   )r-   _get_mixins_getattr)metaclsr&   basesZ	enum_dictmember_type
first_enumr   r   r   __prepare__w   s
    zEnumMeta.__prepare__c              	      s    dg d  d }|D ]} |d  q| |\}|  |\}}}	 fdd jD }
 jD ]
} |= ql dd }t|
ddh@ }|rtdd	|d	 krd
 d	< t
 | || }g |_i |_|_dd | D }i |_d kr0tk	r0d}tfdd|D s0t|  jD ]*}|
| }t|tsX|f}n|}tkrl|f}|	s||}t|ds||_n6||f| }t|dsĈtkr||_n
| |_|j}||_||_|j|  |j D ]"\}}|j|jkr|} qq|j| ||kr0t||| ||j|< z||j|< W n tk
r^   Y nX q6dD ]H}t||}t|d }t||d }|d k	rh||krht||| qhtd k	r|r||_ tj|_|d k	r
t|t!r|"dd# }||jkr
td|S )Nr;   c                    s   i | ]}| | qS r   r   ).0k)	classdictr   r   
<dictcomp>   s      z$EnumMeta.__new__.<locals>.<dictcomp>r7   mro zInvalid enum member name: {0}r=   r*   zAn enumeration.c                 S   s.   h | ]&}|j  D ]\}}t|tr|qqS r   )__dict__itemsrA   r   )rR   crS   vr   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 r.   )rX   rR   m)rO   r   r   	<genexpr>   s     z#EnumMeta.__new__.<locals>.<genexpr>_value_)__repr____str__
__format__r$   r>   z#member order does not match _order_)$
setdefaultrG   poprK   
_find_new_r1   rF   r?   formatjoinr/   __new___member_names__member_map__member_type_rV   _value2member_map_objectanyr'   rA   tupler   rb   _name___objclass__r0   rY   r@   r    rL   r   __new_member__rB   rC   rD   )rM   r&   rN   rT   ignorerI   rP   rk   save_newuse_argsZenum_membersr   r7   Zinvalid_names
enum_classZdynamic_attributesmethodsmember_namer,   argsZenum_memberZcanonical_memberZclass_methodZ
obj_methodZenum_methodr5   )rT   rO   r   rk      s    














zEnumMeta.__new__c                 C   s   dS )z6
        classes/types should always be True.
        Tr   r4   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.

        Nr~   )rk   _create_)r&   r,   namesr   r   r   r   r   r   r   __call__  s    zEnumMeta.__call__c                 C   s:   t |ts$tdt|j| jjf t || o8|j| jkS Nz3unsupported operand type(s) for 'in': '%s' and '%s')rA   r   r    r   r)   r6   rs   rm   )r&   memberr   r   r   __contains__4  s    
 zEnumMeta.__contains__c                    s(   || j krtd| j t | d S )Nz%s: cannot delete Enum member.)rm   AttributeErrorr(   r/   __delattr__)r&   attrr5   r   r   r   ;  s
    
zEnumMeta.__delattr__c                 C   s   ddddg| j  S )Nr6   r*   __members__r%   rl   r4   r   r   r   __dir__C  s    
zEnumMeta.__dir__c                 C   s@   t |rt|z| j| W S  tk
r:   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   rm   KeyErrorr&   r   r   r   r   __getattr__G  s    	zEnumMeta.__getattr__c                 C   s
   | j | S r.   rm   r   r   r   r   __getitem__W  s    zEnumMeta.__getitem__c                    s    fdd j D S )Nc                 3   s   | ]} j | V  qd S r.   r   rR   r   r&   r   r   ra   [  s     z$EnumMeta.__iter__.<locals>.<genexpr>r   r   r   r   r   __iter__Z  s    zEnumMeta.__iter__c                 C   s
   t | jS r.   )r   rl   r   r   r   r   __len__]  s    zEnumMeta.__len__c                 C   s
   t | jS )zReturns 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   rm   r   r   r   r   r   `  s    zEnumMeta.__members__c                 C   s
   d| j  S )Nz	<enum %r>)r(   r   r   r   r   rc   j  s    zEnumMeta.__repr__c                    s    fddt  jD S )Nc                 3   s   | ]} j | V  qd S r.   r   r   r   r   r   ra   n  s     z(EnumMeta.__reversed__.<locals>.<genexpr>)reversedrl   r   r   r   r   __reversed__m  s    zEnumMeta.__reversed__c                    s0   | j di }||krtdt || dS )zBlock 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.

        rm   zCannot reassign members.N)rX   getr   r/   __setattr__)r&   r   r,   Z
member_mapr5   r   r   r   p  s    zEnumMeta.__setattr__c             
   C   s|  | j }|dkr| fn|| f}| |\}	}
|||}t|trP|dd }t|ttfr|rt|d tr|g  }}g }t	|D ]8\}}|

||||dd }|| |||f q|D ].}t|tr|||  }}n|\}}|||< q|||||}|dkrNztdjd }W n* tttfk
rL } zW 5 d}~X Y nX |dkrbt| n||_|dk	rx||_|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(   )r6   rK   rQ   rA   rB   rC   rD   rr   rE   	enumerater9   rG   rk   sys	_getframe	f_globalsr   r?   r   r'   r%   r)   )r&   Z
class_namer   r   r   r   r   rM   rN   r   rP   rT   Zoriginal_nameslast_valuescountr   r,   itemr{   member_valuery   excr   r   r   r   }  s<    
 







zEnumMeta._create_c                    s   t tj| }|rt |}n|} fdd| D }z|jdd d W n$ tk
rn   |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   )rR   r   r,   filterr   r   
<listcomp>  s   z&EnumMeta._convert_.<locals>.<listcomp>c                 S   s   | d | d fS )Nr   r   r   tr   r   r   <lambda>      z$EnumMeta._convert_.<locals>.<lambda>)rI   c                 S   s   | d S Nr   r   r   r   r   r   r     r   )r   )
varsr   modulesrY   sortr    _reduce_ex_by_namer$   updater   )r&   r   r   r   sourceZmodule_globalsmembersr   r   r   	_convert_  s     	

zEnumMeta._convert_c                 O   s$   dd l }|jdtdd | j||S )Nr   zI_convert is deprecated and will be removed in 3.9, use _convert_ instead.r   )
stacklevel)warningswarnDeprecationWarningr   )r&   r|   kwargsr   r   r   r   _convert  s     zEnumMeta._convertc                 C   sP   | st tfS dd }| d }t|ts.td|| p8t }|jrHtd||fS )zReturns the type for creating enum members, and the first inherited
        enum class.

        bases: the tuple of bases that was given to __new__

        c                 S   sH   | D ]>}|j D ]2}|tkrqqd|jkrt|tr4q|    S qqd S )Nrk   )__mro__rp   rX   
issubclassr   )rN   chainbaser   r   r   _find_data_type  s    


z.EnumMeta._get_mixins_.<locals>._find_data_typer   zZnew enumerations should be created as `EnumName([mixin_type, ...] [data_type,] enum_type)`zCannot extend enumerations)rp   r   r   r    rl   )rN   r   rP   rO   r   r   r   rK     s    
zEnumMeta._get_mixins_c           	      C   s   |  dd}|dk	}|dkrpdD ]H}||fD ].}t||d}|ddjtjtjhkr,|} q\q,|dk	r  qpq tj}|tjkrd}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__

        rk   N)ru   rk   FT)r   rL   rk   rp   r   )	rT   rO   rP   rk   rw   methodZpossibletargetrx   r   r   r   rh     s*    
zEnumMeta._find_new_)N)N)r(   r%   r)   r*   classmethodrQ   rk   r}   r   r   r   r   r   r   r   r   propertyr   rc   r   r   r   r   r   staticmethodrK   rh   rJ   r   r   r5   r   r   u   s4   
	 
	5
!
c                   @   st   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dS )r   zRGeneric enumeration.

    Derive from this class to define new enumerations.

    c              
   C   s  t || kr|S z| j| W S  tk
r0   Y n: tk
rh   | j D ]}|j|krH|   Y S qHY nX zd }| |}W n* tk
r } z|}d }W 5 d }~X Y nX t	|| r|S t
d|| jf }|d kr|d kr|n|d krtd| j|f }||_|d S )N%r is not a valid %szDerror in %s._missing_: returned %r instead of None or a valid member)r   ro   r   r    rm   valuesrb   r:   	ExceptionrA   r?   r(   __context__)r&   r,   r   r   resulteZve_excr   r   r   rk   -  s:    

zEnum.__new__c              	   C   s6   t |D ](}z|d W   S  tk
r.   Y qX q|S )Nr   )r   r    )r   r   r   r   
last_valuer   r   r   r9   U  s    zEnum._generate_next_value_c                 C   s   t d|| jf d S Nr   )r?   r(   )r&   r,   r   r   r   r:   ^  s    zEnum._missing_c                 C   s   d| j j| j| jf S )N<%s.%s: %r>)r6   r(   rs   rb   r4   r   r   r   rc   b  s
      zEnum.__repr__c                 C   s   d| j j| jf S )N%s.%s)r6   r(   rs   r4   r   r   r   rd   f  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   )rX   rm   )rR   r&   r`   r4   r   r   r   j  s     
z Enum.__dir__.<locals>.<listcomp>r6   r*   r%   )r6   rV   )r"   Zadded_behaviorr   r4   r   r   i  s    
zEnum.__dir__c                 C   s0   | j tkrt}t| }n| j }| j}|||S r.   )rn   rp   rB   rb   re   )r"   Zformat_specr&   valr   r   r   re   r  s    

zEnum.__format__c                 C   s
   t | jS r.   )hashrs   r4   r   r   r   __hash__  s    zEnum.__hash__c                 C   s   | j | jffS r.   r6   rb   r!   r   r   r   r$     s    zEnum.__reduce_ex__c                 C   s   | j S )zThe name of the Enum member.)rs   r4   r   r   r   r     s    z	Enum.namec                 C   s   | j S )zThe value of the Enum member.rb   r4   r   r   r   r,     s    z
Enum.valueN)r(   r%   r)   r*   rk   r9   r   r:   rc   rd   r   re   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 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 t |D ]:}zt|}W  qXW q tk
rT   td| dY qX qd|d  S )z
        Generate the next value when not given.

        name: the name of the member
        start: the initial 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_bitr   r    )r   r   r   r   r   Zhigh_bitr   r   r   r9     s    	
zFlag._generate_next_value_c                 C   s.   |}|dk r| }|  |}|dk r*| }|S r   )r8   )r&   r,   Zoriginal_valueZpossible_memberr   r   r   r:     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.
        Nr   )
ro   r   
_decomposer?   r(   rp   rk   rs   rb   rf   )r&   r,   pseudo_memberr   extra_flagsr   r   r   r8     s    
zFlag._create_pseudo_member_c                 C   s8   t || js&tdt|j| jjf |j| j@ |jkS r   )rA   r6   r    r   r)   rb   r"   otherr   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 )Nr   |c                 S   s   g | ]}t |jp|jqS r   rB   rs   rb   r_   r   r   r   r     s     z!Flag.__repr__.<locals>.<listcomp>)r6   rs   r(   rb   r   rj   r"   r&   r   	uncoveredr   r   r   rc     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 )Nr   r   r   z%s.%rr   c                 S   s   g | ]}t |jp|jqS r   r   r_   r   r   r   r     s     z Flag.__str__.<locals>.<listcomp>)r6   rs   r(   r   rb   r   rj   r   r   r   r   rd     s    
zFlag.__str__c                 C   s
   t | jS r.   )boolrb   r4   r   r   r   r}     s    zFlag.__bool__c                 C   s"   t || jstS | | j|jB S r.   rA   r6   NotImplementedrb   r   r   r   r   __or__  s    zFlag.__or__c                 C   s"   t || jstS | | j|j@ S r.   r   r   r   r   r   __and__  s    zFlag.__and__c                 C   s"   t || jstS | | j|jA S r.   r   r   r   r   r   __xor__   s    zFlag.__xor__c                 C   sN   t | j| j\}}| d}| jD ] }||kr"|j| j@ s"||B }q"| |S r   )r   r6   rb   )r"   r   r   Zinvertedr`   r   r   r   
__invert__  s    


zFlag.__invert__N)r(   r%   r)   r*   r9   r   r:   r8   r   rc   rd   r}   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 r   )rA   intr?   r(   r8   )r&   r,   Z
new_memberr   r   r   r:     s    

zIntFlag._missing_c                 C   s   | j |d }|d kr|g}t| |\}}|rtt|}d| }|| j krZ||krZ|| || krjd}q*||N }q*t|D ]*}t| |}d |_||_	| j 
||}q||S )Nr   r   )ro   r   r   r   rG   r   r   rk   rs   rb   rf   )r&   r,   r   Zneed_to_creater   r   ZbitZ
flag_valuer   r   r   r8     s(    



zIntFlag._create_pseudo_member_c                 C   s0   t || jtfstS | | j| |jB }|S r.   rA   r6   r   r   rb   )r"   r   r   r   r   r   r   6  s    zIntFlag.__or__c                 C   s,   t || jtfstS | | j| |j@ S 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 r.   r   r   r   r   r   r   A  s    zIntFlag.__xor__c                 C   s   |  | j }|S r.   r   )r"   r   r   r   r   r   J  s    zIntFlag.__invert__N)r(   r%   r)   r*   r   r:   r8   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   O  s    r   c                 C   s^   g }| j  D ]"\}}||jkr|||jf q|rZd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   )rR   aliasr   r   r   r   r   [  s     zunique.<locals>.<listcomp>z duplicate values found in %r: %s)r   rY   r   rG   rj   r?   )ZenumerationZ
duplicatesr   r   Zalias_detailsr   r   r   r
   S  s    
c                 C   s   |}|dk }|r*dd t | j D }ndd t | j D }g }|D ],\}}|rJ||@ |krJ|| || M }qJ|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 r.   r   rR   r[   r`   r   r   r   r   j  s   
z_decompose.<locals>.<listcomp>c                 S   s*   g | ]"\}}|j d k	st|r||fqS r.   )r   _power_of_twor   r   r   r   r   q  s   
 c                 S   s   | j S r.   r   )r`   r   r   r   r   }  r   z_decompose.<locals>.<lambda>T)rI   reverser   )rE   ro   rY   rG   r   r   r,   rg   )Zflagr,   Znot_covered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   typesr   r   __all__r   r   r   r'   rp   r+   r	   dictr-   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   <module>   s<       ?   5rnA#