pypy / pypy / rlib / bitmanipulation.py

The branch 'arm-backed-float' does not exist.
from pypy.rlib import unroll

class BitSplitter(dict):
    def __getitem__(self, lengths):
        if isinstance(lengths, int):
            lengths = (lengths, )
        if lengths in self:
            return dict.__getitem__(self, lengths)
        unrolling_lenghts = unroll.unrolling_iterable(lengths)
        def splitbits(integer):
            result = ()
            sum = 0
            for length in unrolling_lenghts:
                sum += length
                n = integer & ((1<<length) - 1)
                assert n >= 0
                result += (n, )
                integer = integer >> length
            assert sum <= 32
            return result
        splitbits.func_name += "_" + "_".join([str(i) for i in lengths])
        self[lengths] = splitbits
        return splitbits

    def _freeze_(self):
        # as this class is not in __builtin__, we need to explicitly tell
        # the flow space that the object is frozen and the accesses can
        # be constant-folded.
        return True

splitter = BitSplitter()
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.