Inheritance diagram for ParentNode:
Public Methods | |
ParentNode (DocumentImpl *ownerDocument) | |
ParentNode (const ParentNode &other) | |
virtual DocumentImpl * | getOwnerDocument () |
virtual void | setOwnerDocument (DocumentImpl *doc) |
virtual NodeListImpl * | getChildNodes () |
virtual NodeImpl * | getFirstChild () |
virtual NodeImpl * | getLastChild () |
virtual unsigned int | getLength () |
virtual bool | hasChildNodes () |
virtual NodeImpl * | insertBefore (NodeImpl *newChild, NodeImpl *refChild) |
virtual NodeImpl * | item (unsigned int index) |
virtual NodeImpl * | removeChild (NodeImpl *oldChild) |
virtual NodeImpl * | replaceChild (NodeImpl *newChild, NodeImpl *oldChild) |
virtual void | setReadOnly (bool isReadOnly, bool deep) |
virtual void | normalize () |
virtual DocumentImpl * | getDocument () |
Public Attributes | |
DocumentImpl * | ownerDocument |
ChildNode * | firstChild |
Protected Methods | |
void | cloneChildren (const NodeImpl &other) |
ChildNode * | lastChild () |
void | lastChild (ChildNode *) |
Protected Attributes | |
int | fCachedLength |
ChildNode * | fCachedChild |
int | fCachedChildIndex |
ParentNode, just like NodeImpl, also implements NodeList, so it can return itself in response to the getChildNodes() query. This eliminiates the need for a separate ChildNodeList object. Note that this is an IMPLEMENTATION DETAIL; applications should _never_ assume that this identity exists.
While we have a direct reference to the first child, the last child is stored as the previous sibling of the first child. First child nodes are marked as being so, and getNextSibling hides this fact.
Note: Not all parent nodes actually need to also be a child. At some point we used to have ParentNode inheriting from NodeImpl and another class called ChildAndParentNode that inherited from ChildNode. But due to the lack of multiple inheritance a lot of code had to be duplicated which led to a maintenance nightmare. At the same time only a few nodes (Document, DocumentFragment, Entity, and Attribute) cannot be a child so the gain is memory wasn't really worth it. The only type for which this would be the case is Attribute, but we deal with there in another special way, so this is not applicable.
WARNING: Some of the code here is partially duplicated in AttrImpl, be careful to keep these two classes in sync!
|
Last requested child. |
|
Last requested child index. |
|
Cached node list length. |