
    c                     h    d Z dZddlmZ ddlmZ ddlmZmZ  e	       Z
 ed      Z G d de      Zy	)
zfCache module, with a least recently used algorithm for the management of the
deletion of entries.




zrestructuredtext en    )Lock)locked)TypeVarList_KeyTypec                   J    e Zd ZdZddeddf fdZddZddZdeddf fd	Z	def fd
Z
  eee      e
      Z
def fdZ  eee      e      Zdef fdZ  eee      e      Z fdZ  eee      e      Zefdef fdZ  eee      e      Zd ZddZd Z xZS )CachezqA dictionary like cache.

    inv:
        len(self._usage) <= self.size
        len(self.data) <= self.size
    sizereturnNc                 |    |dk\  sJ d       || _         g | _        t               | _        t        t
        |           y)ztWarning : Cache.__init__() != dict.__init__().
        Constructor does not take any arguments beside size.
        r   z.cache size must be >= 0 (0 meaning no caching)N)r
   _usager   _locksuperr	   __init__)selfr
   	__class__s     6/usr/lib/python3/dist-packages/logilab/common/cache.pyr   zCache.__init__.   s;     qyJJJy	V
eT#%    c                 8    | j                   j                          y N)r   acquirer   s    r   _acquirezCache._acquire8       

r   c                 8    | j                   j                          y r   )r   releaser   s    r   _releasezCache._release;   r   r   keyc                    | j                   s| j                   j                  |       y | j                   d   |k7  r8	 | j                   j                  |       | j                   j                  |       y y # t        $ r^ | j                  rOt        | j                         | j                  k\  r-t        t        | #  | j                   d          | j                   d= Y w xY w)Nr   )	r   appendremove
ValueErrorr
   lenr   r	   __delitem__r   r   r   s     r   _update_usagezCache._update_usage>   s    {{KKs#[[_#'""3' KKs#  ' 99T[[!1TYY!>%24;;q>BA's   A5 5A$CCc                 P    t         t        |   |      }| j                  |       |S r   )r   r	   __getitem__r'   )r   r   valuer   s      r   r)   zCache.__getitem__O   s'    eT.s33r   c                 p    | j                   dkD  r&t        t        |   ||       | j	                  |       y y )Nr   )r
   r   r	   __setitem__r'   )r   r   itemr   s      r   r,   zCache.__setitem__V   s2    99q=%*35s# r   c                 b    t         t        |   |       | j                  j	                  |       y r   )r   r	   r%   r   r"   r&   s     r   r%   zCache.__delitem__^   s$    eT&s+3r   c                 8    t         t        |           g | _        y r   )r   r	   clearr   )r   r   s    r   r0   zCache.cleard   s    eT "r   c                 j    || v r| j                   j                  |       t        t        |   ||      S r   )r   r"   r   r	   pop)r   r   defaultr   s      r   r2   z	Cache.popj   s2    $;KKs# UD%c733r   c                     t               r   NotImplementedErrorr   s    r   popitemzCache.popitems       !##r   c                     t               r   r5   )r   r   r3   s      r   
setdefaultzCache.setdefaultv   r8   r   c                     t               r   r5   )r   others     r   updatezCache.updatey   r8   r   )d   )r   Nr   )__name__
__module____qualname____doc__intr   r   r   r   r'   r)   r   r,   r%   r0   _markerr2   r7   r:   r=   __classcell__)r   s   @r   r	   r	   &   s    &S &4 & d "x 
 -&8,[9K$x $ -&8,[9K x   -&8,[9K 'F8X&u-E)0 4x 4 %&8
$S
)C$$$r   r	   N)rB   __docformat__	threadingr   logilab.common.decoratorsr   typingr   r   objectrD   r   dictr	    r   r   <module>rM      s;   $ &  ,  
( :T$D T$r   