6.28.2011

Glancing at the code of 'bitarray'

Python: bitarray パッケージ

bitarray のメインモジュールは以下の2つ。

・__init__.py

インポート

from _bitarray import _bitarray, bits2bytes, _sysinfo
ローカルな関数の定義
def _btree_insert(tree, sym, ba):
def _mk_tree(codedict):
def _check_codedict(codedict):
クラス定義
class bitarray(_bitarray):
クラス関数(一部)
    def decode(self, codedict):
        """decode(code)

Given a prefix code (a dict mapping symbols to bitarrays),
decode the content of the bitarray and return the list of symbols."""
        _check_codedict(codedict)
        return self._decode(_mk_tree(codedict))

    def encode(self, codedict, iterable):
        """encode(code, iterable)

Given a prefix code (a dict mapping symbols to bitarrays),
iterates over iterable object with symbols, and extends the bitarray
with the corresponding bitarray for each symbols."""
        _check_codedict(codedict)
        return self._encode(codedict, iterable)

    def search(self, x, limit=-1):
        """search(x[, limit])

Given a bitarray x (or an object which can be converted to a bitarray),
returns the start positions of x matching self as a list.
The optional argument limits the number of search results to the integer
specified.  By default, all search results are returned."""
        return self._search(bitarray(x), limit)

・bitarray.c

Python.hのインクルード

#include "Python.h"
グローバル変数
typedef struct {
    PyObject_VAR_HEAD
    char *ob_item;
    Py_ssize_t allocated;
    idx_t nbits;
    int endian;
    PyObject *weakreflist;   /* List of weak references */
} bitarrayobject;

static PyTypeObject Bitarraytype;
スタティックな関数(ごくごく一部)
static void
setbit(bitarrayobject *self, idx_t i, int bit)
{
    char *cp, mask;

    mask = BITMASK(self->endian, i);
    cp = self->ob_item + i / 8;
    if (bit)
        *cp |= mask;
    else
        *cp &= ~mask;
}
インストール
/*********************** Install Module **************************/

PyMODINIT_FUNC
init_bitarray(void)
{
    PyObject *m;

    Bitarraytype.ob_type = &PyType_Type;
    BitarrayIter_Type.ob_type = &PyType_Type;
    m = Py_InitModule3("_bitarray", module_functions, 0);
    if (m == NULL)
        return;

    Py_INCREF((PyObject *) &Bitarraytype);
    PyModule_AddObject(m, "_bitarray", (PyObject *) &Bitarraytype);
}

http://pypi.python.org/pypi/bitarray

0 件のコメント:

コメントを投稿