Launchpad automatic translations update.
[odoo/odoo.git] / addons / document_webdav / cache.py
1 import time
2 import heapq
3
4 def memoize(maxsize):
5         """decorator to 'memoize' a function - caching its results"""
6         def decorating_function(f):
7                 cache = {}  # map from key to value
8                 heap = []   # list of keys, in LRU heap
9                 cursize = 0 # because len() is slow
10                 def wrapper(*args):
11                         key = repr(args)
12                         # performance crap
13                         _cache=cache
14                         _heap=heap
15                         _heappop = heapq.heappop
16                         _heappush = heapq.heappush
17                         _time = time.time
18                         _cursize = cursize
19                         _maxsize = maxsize
20                         if not _cache.has_key(key):
21                                 if _cursize == _maxsize:
22                                         # pop oldest element
23                                         (_,oldkey) = _heappop(_heap)
24                                         _cache.pop(oldkey)
25                                 else:
26                                         _cursize += 1
27                                 # insert this element
28                                 _cache[key] = f(*args)
29                                 _heappush(_heap,(_time(),key))
30                                 wrapper.misses += 1
31                         else:
32                                 wrapper.hits += 1
33                         return cache[key]
34                 wrapper.__doc__ = f.__doc__
35                 wrapper.__name__ = f.__name__
36                 wrapper.hits = wrapper.misses = 0
37                 return wrapper 
38         return decorating_function
39