summaryrefslogtreecommitdiff
path: root/src/lxml/xmlid.pxi
diff options
context:
space:
mode:
authorscoder <none@none>2006-10-23 10:28:10 +0200
committerscoder <none@none>2006-10-23 10:28:10 +0200
commit29e99f0f43c3b2f93c6be77ce339bb23ca7b1718 (patch)
tree537cf4649f4134721ca9f85264299dc5186b3c71 /src/lxml/xmlid.pxi
parentb1b6db94aa6eeec22370009a563609f1cc46af01 (diff)
downloadpython-lxml-29e99f0f43c3b2f93c6be77ce339bb23ca7b1718.tar.gz
[svn r1972] more cleanup in xmlid.pyx
--HG-- branch : trunk
Diffstat (limited to 'src/lxml/xmlid.pxi')
-rw-r--r--src/lxml/xmlid.pxi60
1 files changed, 28 insertions, 32 deletions
diff --git a/src/lxml/xmlid.pxi b/src/lxml/xmlid.pxi
index dd27bb52..917a0562 100644
--- a/src/lxml/xmlid.pxi
+++ b/src/lxml/xmlid.pxi
@@ -47,7 +47,7 @@ cdef class _IDDict:
The dictionary must be instantiated with the root element of a parsed XML
document, otherwise the behaviour is undefined. Elements and XML trees
- that were created or modified through the API are not supported.
+ that were created or modified 'by hand' are not supported.
"""
cdef _Document _doc
cdef object _keys
@@ -89,7 +89,7 @@ cdef class _IDDict:
return c_id is not NULL
def has_key(self, id_name):
- return self.__contains__(id_name)
+ return id_name in self
def __cmp__(self, other):
if other is None:
@@ -118,25 +118,17 @@ cdef class _IDDict:
return self._keys[:]
def __iter__(self):
- keys = self._keys
- if keys is None:
- keys = self.keys()
- return iter(keys)
+ if self._keys is None:
+ self._keys = self._build_keys()
+ return iter(self._keys)
def iterkeys(self):
- return self.__iter__()
+ return self
def __len__(self):
- keys = self._keys
- if keys is None:
- keys = self.keys()
- return len(keys)
-
- cdef object _build_keys(self):
- keys = []
- tree.xmlHashScan(<tree.xmlHashTable*>self._doc._c_doc.ids,
- _collectIdHashKeys, <python.PyObject*>keys)
- return keys
+ if self._keys is None:
+ self._keys = self._build_keys()
+ return len(self._keys)
def items(self):
if self._items is None:
@@ -144,24 +136,15 @@ cdef class _IDDict:
return self._items[:]
def iteritems(self):
- items = self._items
- if items is None:
- items = self.items()
- return iter(items)
-
- cdef object _build_items(self):
- items = []
- context = (items, self._doc)
- tree.xmlHashScan(<tree.xmlHashTable*>self._doc._c_doc.ids,
- _collectIdHashItemList, <python.PyObject*>context)
- return items
+ if self._items is None:
+ self._items = self._build_items()
+ return iter(self._items)
def values(self):
- items = self._items
- if items is None:
- items = self.items()
+ if self._items is None:
+ self._items = self._build_items()
values = []
- for item in items:
+ for item in self._items:
value = python.PyTuple_GET_ITEM(item, 1)
python.Py_INCREF(value)
python.PyList_Append(values, value)
@@ -170,6 +153,19 @@ cdef class _IDDict:
def itervalues(self):
return iter(self.values())
+ cdef object _build_keys(self):
+ keys = []
+ tree.xmlHashScan(<tree.xmlHashTable*>self._doc._c_doc.ids,
+ _collectIdHashKeys, <python.PyObject*>keys)
+ return keys
+
+ cdef object _build_items(self):
+ items = []
+ context = (items, self._doc)
+ tree.xmlHashScan(<tree.xmlHashTable*>self._doc._c_doc.ids,
+ _collectIdHashItemList, <python.PyObject*>context)
+ return items
+
cdef void _collectIdHashItemDict(void* payload, void* context, char* name):
# collect elements from ID attribute hash table
cdef tree.xmlID* c_id