~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_simple_set_pyx.pyx

Remove 2 more mallocs per line by using a fixed-width StaticTuple for reflists.

Note that 'ref_list' is arbitrary width (think parent pointers), so we can't pre-allocate that.
I suppose we *could* count the occurences of the separator in the memory buffer, though.
That may be more efficient...

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
    ctypedef unsigned long size_t
21
21
    ctypedef long (*hashfunc)(PyObject*)
22
22
    ctypedef PyObject *(*richcmpfunc)(PyObject *, PyObject *, int)
 
23
    ctypedef int (*visitproc)(PyObject *, void *)
 
24
    ctypedef int (*traverseproc)(PyObject *, visitproc, void *)
23
25
    int Py_EQ
24
26
    PyObject *Py_True
25
27
    PyObject *Py_NotImplemented
28
30
    ctypedef struct PyTypeObject:
29
31
        hashfunc tp_hash
30
32
        richcmpfunc tp_richcompare
 
33
        traverseproc tp_traverse
31
34
 
32
35
    PyTypeObject *Py_TYPE(PyObject *)
33
36
        
112
115
        def __get__(self):
113
116
            return self._mask
114
117
 
 
118
    def _memory_size(self):
 
119
        """Return the number of bytes of memory consumed by this class."""
 
120
        return sizeof(self) + (sizeof(PyObject*)*(self._mask + 1))
 
121
 
115
122
    def __len__(self):
116
123
        return self._used
117
124
 
451
458
    raise AssertionError('should never get here')
452
459
 
453
460
 
454
 
cdef api PyObject **_SimpleSet_Lookup(object self,
455
 
                                                object key) except NULL:
 
461
cdef api PyObject **_SimpleSet_Lookup(object self, object key) except NULL:
456
462
    """Find the slot where 'key' would fit.
457
463
 
458
464
    This is the same as a dicts 'lookup' function. This is a private
515
521
 
516
522
 
517
523
# TODO: this should probably have direct tests, since it isn't used by __iter__
518
 
cdef api int SimpleSet_Next(object self, Py_ssize_t *pos,
519
 
                                      PyObject **key):
 
524
cdef api int SimpleSet_Next(object self, Py_ssize_t *pos, PyObject **key):
520
525
    """Walk over items in a SimpleSet.
521
526
 
522
527
    :param pos: should be initialized to 0 by the caller, and will be updated
542
547
        key[0] = table[i]
543
548
    return 1
544
549
 
 
550
 
 
551
cdef int SimpleSet_traverse(SimpleSet self, visitproc visit, void *arg):
 
552
    """This is an implementation of 'tp_traverse' that hits the whole table.
 
553
 
 
554
    Cython/Pyrex don't seem to let you define a tp_traverse, and they only
 
555
    define one for you if you have an 'object' attribute. Since they don't
 
556
    support C arrays of objects, we access the PyObject * directly.
 
557
    """
 
558
    cdef Py_ssize_t pos
 
559
    cdef PyObject *next_key
 
560
    cdef int ret
 
561
 
 
562
    pos = 0
 
563
    while SimpleSet_Next(self, &pos, &next_key):
 
564
        ret = visit(next_key, arg)
 
565
        if ret:
 
566
            return ret
 
567
 
 
568
    return 0;
 
569
 
 
570
# It is a little bit ugly to do this, but it works, and means that Meliae can
 
571
# dump the total memory consumed by all child objects.
 
572
(<PyTypeObject *>SimpleSet).tp_traverse = <traverseproc>SimpleSet_traverse