(value, 2 ** idx)
for idx, value in enumerate(self.values)
)
+ self._bitmap.update(
+ (2 ** idx, value)
+ for idx, value in enumerate(self.values)
+ )
kw.setdefault('length', length)
super(SET, self).__init__(**kw)
def process(value):
if value is not None:
value = int(value)
+
return set(
- [
- elem
- for idx, elem in enumerate(self.values)
- if value & (2 ** idx)
- ]
+ util.map_bits(self._bitmap.__getitem__, value)
)
else:
return None
generic_repr, counter, PluginLoader, hybridproperty, hybridmethod, \
safe_reraise,\
get_callable_argspec, only_once, attrsetter, ellipses_string, \
- warn_limited
+ warn_limited, map_bits
from .deprecations import warn_deprecated, warn_pending_deprecation, \
deprecated, pending_deprecation, inject_docstring_text
raise NameError("exhausted namespace for symbol base %s" % base)
+def map_bits(fn, n):
+ """Call the given function given each nonzero bit from n."""
+
+ while n:
+ b = n & (~n + 1)
+ yield fn(b)
+ n ^= b
+
+
def decorator(target):
"""A signature-matching decorator factory."""