17
17
"""Implementation of Graph algorithms when we have already loaded everything.
20
from __future__ import absolute_import
22
20
cdef extern from "python-compat.h":
25
cdef extern from "Python.h":
26
ctypedef int Py_ssize_t
27
ctypedef struct PyObject:
30
int PyString_CheckExact(object)
32
int PyObject_RichCompareBool(object, object, int)
35
int PyTuple_CheckExact(object)
36
object PyTuple_New(Py_ssize_t n)
37
Py_ssize_t PyTuple_GET_SIZE(object t)
38
PyObject * PyTuple_GET_ITEM(object t, Py_ssize_t o)
39
void PyTuple_SET_ITEM(object t, Py_ssize_t o, object v)
41
int PyList_CheckExact(object)
42
Py_ssize_t PyList_GET_SIZE(object l)
43
PyObject * PyList_GET_ITEM(object l, Py_ssize_t o)
44
int PyList_SetItem(object l, Py_ssize_t o, object l) except -1
45
int PyList_Append(object l, object v) except -1
47
int PyDict_CheckExact(object d)
48
Py_ssize_t PyDict_Size(object d) except -1
49
PyObject * PyDict_GetItem(object d, object k)
50
int PyDict_SetItem(object d, object k, object v) except -1
51
int PyDict_DelItem(object d, object k) except -1
52
int PyDict_Next(object d, Py_ssize_t *pos, PyObject **k, PyObject **v)
54
void Py_INCREF(object)
23
from cpython.bytes cimport (
26
from cpython.dict cimport (
34
from cpython.list cimport (
41
from cpython.object cimport (
44
PyObject_RichCompareBool,
46
from cpython.ref cimport (
49
from cpython.tuple cimport (
96
97
if self.parents is None:
99
100
cdef _KnownGraphNode parent
102
103
for parent in self.parents:
103
104
PyList_Append(keys, parent.key)
106
107
cdef clear_references(self):
107
108
self.parents = None
108
109
self.children = None
266
267
- all nodes found will also have child_keys populated with all known
269
cdef PyObject *temp_key, *temp_parent_keys, *temp_node
270
cdef PyObject *temp_key
271
cdef PyObject *temp_parent_keys
272
cdef PyObject *temp_node
270
273
cdef Py_ssize_t pos
271
274
cdef _KnownGraphNode node
272
275
cdef _KnownGraphNode parent_node
580
583
for pos from 0 <= pos < PyList_GET_SIZE(tips):
581
584
node = _get_list_node(tips, pos)
582
if PyString_CheckExact(node.key) or len(node.key) == 1:
585
if PyBytes_CheckExact(node.key) or len(node.key) == 1:
585
588
prefix = node.key[0]
640
643
# shown a specific impact, yet.
641
644
sorter = _MergeSorter(self, tip_key)
642
645
return sorter.topo_order()
644
647
def get_parent_keys(self, key):
645
648
"""Get the parents for a key
647
Returns a list containg the parents keys. If the key is a ghost,
650
Returns a list containing the parents keys. If the key is a ghost,
648
651
None is returned. A KeyError will be raised if the key is not in
651
654
:param keys: Key to check (eg revision_id)
652
655
:return: A list of parents
654
return self._nodes[key].parent_keys
657
return self._nodes[key].parent_keys
656
659
def get_child_keys(self, key):
657
660
"""Get the children for a key
659
Returns a list containg the children keys. A KeyError will be raised
662
Returns a list containing the children keys. A KeyError will be raised
660
663
if the key is not in the graph.
662
665
:param keys: Key to check (eg revision_id)
663
666
:return: A list of children
665
return self._nodes[key].child_keys
668
return self._nodes[key].child_keys
668
671
cdef class _MergeSortNode:
929
932
cdef _MergeSortNode ms_node
930
933
cdef _KnownGraphNode node
931
934
cdef Py_ssize_t pos
932
cdef PyObject *temp_key, *temp_node
935
cdef PyObject *temp_key
936
cdef PyObject *temp_node
934
938
# Note: allocating a _MergeSortNode and deallocating it for all nodes
935
939
# costs approx 8.52ms (21%) of the total runtime