Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
Public Member Functions | Private Attributes | List of all members
miasm2.core.utils.BoundedDict Class Reference
+ Inheritance diagram for miasm2.core.utils.BoundedDict:
+ Collaboration diagram for miasm2.core.utils.BoundedDict:

Public Member Functions

def __init__
 
def __setitem__
 
def __contains__
 
def has_key
 
def keys
 
def data
 
def __getitem__
 
def __delitem__
 
def __del__
 

Private Attributes

 _data
 
 _min_size
 
 _max_size
 
 _size
 
 _counter
 
 _delete_cb
 

Detailed Description

Limited in size dictionnary.

To reduce combinatory cost, once an upper limit @max_size is reached,
@max_size - @min_size elements are suppressed.
The targeted elements are the less accessed.

One can define a callback called when an element is removed

Definition at line 55 of file utils.py.

Constructor & Destructor Documentation

def miasm2.core.utils.BoundedDict.__init__ (   self,
  max_size,
  min_size = None,
  initialdata = None,
  delete_cb = None 
)
Create a BoundedDict
@max_size: maximum size of the dictionnary
@min_size: (optional) number of most used element to keep when resizing
@initialdata: (optional) dict instance with initial data
@delete_cb: (optional) callback called when an element is removed

Definition at line 66 of file utils.py.

66 
67  delete_cb=None):
68  """Create a BoundedDict
69  @max_size: maximum size of the dictionnary
70  @min_size: (optional) number of most used element to keep when resizing
71  @initialdata: (optional) dict instance with initial data
72  @delete_cb: (optional) callback called when an element is removed
73  """
74  self._data = initialdata.copy() if initialdata else {}
75  self._min_size = min_size if min_size else max_size / 3
76  self._max_size = max_size
77  self._size = len(self._data)
78  # Do not use collections.Counter as it is quite slow
79  self._counter = {k: 1 for k in self._data}
80  self._delete_cb = delete_cb
def miasm2.core.utils.BoundedDict.__del__ (   self)
Ensure the callback is called when last reference is lost

Definition at line 141 of file utils.py.

142  def __del__(self):
143  """Ensure the callback is called when last reference is lost"""
144  if self._delete_cb:
145  for key in self._data:
146  self._delete_cb(key)

Member Function Documentation

def miasm2.core.utils.BoundedDict.__contains__ (   self,
  key 
)

Definition at line 111 of file utils.py.

112  def __contains__(self, key):
113  # Do not call has_key to avoid adding function call overhead
114  return key in self._data
def miasm2.core.utils.BoundedDict.__delitem__ (   self,
  key 
)

Definition at line 134 of file utils.py.

135  def __delitem__(self, key):
136  if self._delete_cb is not None:
137  self._delete_cb(key)
138  del self._data[key]
139  self._size -= 1
140  del self._counter[key]
def miasm2.core.utils.BoundedDict.__getitem__ (   self,
  key 
)

Definition at line 127 of file utils.py.

128  def __getitem__(self, key):
129  # Retrieve data first to raise the proper exception on error
130  data = self._data[key]
131  # Should never raise, since the key is in self._data
132  self._counter[key] += 1
133  return data
def miasm2.core.utils.BoundedDict.__setitem__ (   self,
  asked_key,
  value 
)

Definition at line 81 of file utils.py.

81 
82  def __setitem__(self, asked_key, value):
83  if asked_key not in self._data:
84  # Update internal size and use's counter
85  self._size += 1
86 
87  # Bound can only be reached on a new element
88  if (self._size >= self._max_size):
89  most_common = sorted(self._counter.iteritems(),
90  key=itemgetter(1), reverse=True)
91 
92  # Handle callback
93  if self._delete_cb is not None:
94  for key, _ in most_common[self._min_size - 1:]:
95  self._delete_cb(key)
96 
97  # Keep only the most @_min_size used
98  self._data = {key:self._data[key]
99  for key, _ in most_common[:self._min_size - 1]}
100  self._size = self._min_size
101 
102  # Reset use's counter
103  self._counter = {k: 1 for k in self._data}
104 
105  # Avoid rechecking in dict: set to 1 here, add 1 otherwise
106  self._counter[asked_key] = 1
107  else:
108  self._counter[asked_key] += 1
109 
110  self._data[asked_key] = value
def miasm2.core.utils.BoundedDict.data (   self)

Definition at line 123 of file utils.py.

124  def data(self):
125  "Return the current instance as a dictionnary"
126  return self._data

+ Here is the caller graph for this function:

def miasm2.core.utils.BoundedDict.has_key (   self,
  key 
)

Definition at line 115 of file utils.py.

116  def has_key(self, key):
117  return key in self._data
def miasm2.core.utils.BoundedDict.keys (   self)

Definition at line 118 of file utils.py.

119  def keys(self):
120  "Return the list of dict's keys"
121  return self._data.keys()

Member Data Documentation

miasm2.core.utils.BoundedDict._counter
private

Definition at line 78 of file utils.py.

miasm2.core.utils.BoundedDict._data
private

Definition at line 73 of file utils.py.

miasm2.core.utils.BoundedDict._delete_cb
private

Definition at line 79 of file utils.py.

miasm2.core.utils.BoundedDict._max_size
private

Definition at line 75 of file utils.py.

miasm2.core.utils.BoundedDict._min_size
private

Definition at line 74 of file utils.py.

miasm2.core.utils.BoundedDict._size
private

Definition at line 76 of file utils.py.


The documentation for this class was generated from the following file: