
    a                         d Z ddlmZ  G d de      Z G d de      Z G d de      Z G d	 d
e      Z G d de      Zy)z
This module contains multithread-safe cache implementations.

All Caches have

    getorbuild(key, builder)
    delentry(key)

methods and allow configuration when instantiating the cache class.
    )timec                   :    e Zd Zd	dZd Zd Zd Zd
dZd Zd Z	y)
BasicCachec                 L    || _         t        ||dz  z
        | _        i | _        y )N   )
maxentriesintprunenum_dict)selfr   s     4/usr/lib/python3/dist-packages/py/_path/cacheutil.py__init__zBasicCache.__init__   s%    $JA56
    c                 8    | j                   j                          y N)r   clearr   s    r   r   zBasicCache.clear   s    

r   c                      | j                   |   S r   )r   )r   keys     r   	_getentryzBasicCache._getentry   s    zz#r   c                 B    | j                          || j                  |<   y r   )_prunelowestweightr   r   r   entrys      r   	_putentryzBasicCache._putentry   s    !

3r   c                 D    	 | j                   |= y # t        $ r |r Y y w xY wr   )r   KeyError)r   r   raisings      r   delentryzBasicCache.delentry   s,    	

3 	 	s    c                     	 | j                  |      }|j                  S # t        $ r2 | j                  ||      }| j                  ||       Y |j                  S w xY wr   )r   r   _buildr   value)r   r   builderr   s       r   
getorbuildzBasicCache.getorbuild$   sZ    	'NN3'E {{  	'KKW-ENN3&{{	's    -AAc                 T   t        | j                        }|| j                  k\  r~| j                  j                         D cg c]  \  }}|j                  |f }}}|j                          || j                  z
  }|dkD  r!|d| D ]  \  }}| j                  |d        yyyc c}}w )z' prune out entries with lowest weight. r   NF)r   )lenr   r   itemsweightsortr
   r   )r   
numentriesr   r   r'   indexr(   s          r   r   zBasicCache._prunelowestweight,   s    _
( +/***:*:*<>&C llC( >E >JJL.Eqy#(%= 6KFCMM#uM56  )>s   B$N)   )F)
__name__
__module____qualname__r   r   r   r   r   r$   r    r   r   r   r      s%    
 6r   r   c                       e Zd ZdZd Zy)BuildcostAccessCachea   A BuildTime/Access-counting cache implementation.
        the weight of a value is computed as the product of

            num-accesses-of-a-value * time-to-build-the-value

        The values with the least such weights are evicted
        if the cache maxentries threshold is superceded.
        For implementation flexibility more than one object
        might be evicted at a time.
    c                 V    t               } |       }t               }t        |||z
        S r   )gettimeWeightedCountingEntry)r   r   r#   startvalends         r   r!   zBuildcostAccessCache._buildG   s(    	ii$S#e)44r   N)r-   r.   r/   __doc__r!   r0   r   r   r2   r2   :   s    	5r   r2   c                   (    e Zd Zd Zd Z ee      Zy)r5   c                 .    || _         |x| _        | _        y r   )_valuer(   
_oneweight)r   r"   	oneweights      r   r   zWeightedCountingEntry.__init__O   s    (11dor   c                 X    | xj                   | j                  z  c_         | j                  S r   )r(   r=   r<   r   s    r   r"   zWeightedCountingEntry.valueS   s    t&{{r   N)r-   r.   r/   r   r"   propertyr0   r   r   r5   r5   N   s    2 UOEr   r5   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )
AgingCachez; This cache prunes out cache entries that are too old.
    c                 :    t         t        |   |       || _        y r   )superrB   r   
maxseconds)r   r   rE   	__class__s      r   r   zAgingCache.__init__[   s    j$(4$r   c                 |    | j                   |   }|j                         r| j                  |       t        |      |S r   )r   	isexpiredr   r   r   s      r   r   zAgingCache._getentry_   s4    

3??MM#3-r   c                 V     |       }t        |t               | j                  z         }|S r   )
AgingEntryr4   rE   )r   r   r#   r7   r   s        r   r!   zAgingCache._buildf   s%    i3	DOO ;<r   )r,   g      $@)r-   r.   r/   r9   r   r   r!   __classcell__)rF   s   @r   rB   rB   X   s    %r   rB   c                       e Zd Zd Zd Zy)rJ   c                      || _         || _        y r   )r"   r(   )r   r"   expirationtimes      r   r   zAgingEntry.__init__l   s    
$r   c                 4    t               }|| j                  k\  S r   )r4   r(   )r   ts     r   rH   zAgingEntry.isexpiredp   s    IDKKr   N)r-   r.   r/   r   rH   r0   r   r   rJ   rJ   k   s    % r   rJ   N)	r9   r   r4   objectr   r2   r5   rB   rJ   r0   r   r   <module>rR      sL   	 !+6 +6Z5: 5(F  &   r   