1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-04 18:06:22 +03:00
occt/src/LDOM/LDOM_Element.cxx
abv e8862cf41a 0024870: Provide OCCT RTTI test cases
Test commands for checking performance and functionality of OCCT handles and RTTI added.
New test case added for that: test perf fclasses handle.

Implementation of opencascade::handle improved to enable compile-time error if two handles of incompatible types are compared.
Comparison of handle to NULL is not possible any more; method IsNull() should be used instead.

Method LDOM_MemManager::Doc() is removed to avoid cyclic dependency of headers; constructor of LDOM_Document(LDOM_MemManager&) is used directly instead.

Inclusion of headers corrected for compilation after previous patch.
2015-07-12 12:30:27 +03:00

247 lines
8.6 KiB
C++

// Created on: 2001-06-27
// Created by: Alexander GRIGORIEV
// Copyright (c) 2001-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <LDOM_MemManager.hxx>
#include <LDOM_BasicElement.hxx>
#include <LDOM_BasicAttribute.hxx>
#include <LDOM_Element.hxx>
#include <Standard_ProgramError.hxx>
#include <stdio.h>
//=======================================================================
//function : LDOM_Element
//purpose :
//=======================================================================
LDOM_Element::LDOM_Element (const LDOM_BasicElement& anElem,
const Handle(LDOM_MemManager)& aDoc)
: LDOM_Node (anElem, aDoc) {}
//=======================================================================
//function : getAttribute
//purpose :
//=======================================================================
LDOMString LDOM_Element::getAttribute (const LDOMString& aName) const
{
const LDOM_BasicElement& anElem = (const LDOM_BasicElement&) Origin();
if (anElem.isNull()) return LDOMString ();
if (myLastChild == NULL) {
const LDOM_BasicNode * aNode = anElem.GetFirstChild();
if (aNode && aNode -> getNodeType () != LDOM_Node::ATTRIBUTE_NODE)
for(;;) {
const LDOM_BasicNode * aSibling = aNode -> GetSibling();
if (aSibling == NULL)
return LDOMString ();
if (aSibling -> getNodeType () == LDOM_Node::ATTRIBUTE_NODE) {
(const LDOM_BasicNode *&) myLastChild = aNode;
break;
}
aNode = aSibling;
}
}
const LDOM_BasicAttribute& anAttr = anElem.GetAttribute (aName, myLastChild);
if (anAttr.isNull())
return LDOMString ();
return LDOMString (anAttr.GetValue(), myDocument -> Self());
}
//=======================================================================
//function : getAttributeNode
//purpose :
//=======================================================================
LDOM_Attr LDOM_Element::getAttributeNode (const LDOMString& aName) const
{
const LDOM_BasicElement& anElem = (const LDOM_BasicElement&) Origin();
if (anElem.isNull()) return LDOM_Attr ();
if (myLastChild == NULL) {
const LDOM_BasicNode * aNode = anElem.GetFirstChild();
if (aNode && aNode -> getNodeType () != LDOM_Node::ATTRIBUTE_NODE)
for(;;) {
const LDOM_BasicNode * aSibling = aNode -> GetSibling();
if (aSibling == NULL)
return LDOM_Attr ();
if (aSibling -> getNodeType () == LDOM_Node::ATTRIBUTE_NODE) {
(const LDOM_BasicNode *&) myLastChild = aSibling;
break;
}
aNode = aSibling;
}
}
const LDOM_BasicAttribute& anAttr = anElem.GetAttribute (aName, myLastChild);
return LDOM_Attr (anAttr, myDocument);
}
//=======================================================================
//function : getElementsByTagName
//purpose :
//=======================================================================
LDOM_NodeList LDOM_Element::getElementsByTagName
(const LDOMString& theTagName) const
{
LDOM_NodeList aList (myDocument);
if (isNull() == Standard_False) {
const LDOM_BasicElement& anElem = (const LDOM_BasicElement&) Origin();
// if (anElem.GetTagName().equals(theTagName))
if (strcmp (anElem.GetTagName(), theTagName.GetString()) == 0)
aList.Append (anElem);
anElem.AddElementsByTagName (aList, theTagName);
}
return aList;
}
//=======================================================================
//function : setAttribute
//purpose :
//=======================================================================
void LDOM_Element::setAttribute (const LDOMString& aName,const LDOMString& aVal)
{
LDOM_BasicElement& anElem = (LDOM_BasicElement&) Origin();
if (anElem.isNull()) return;
myLastChild = anElem.AddAttribute (aName, LDOMString (aVal, myDocument),
myDocument, myLastChild);
}
//=======================================================================
//function : setAttributeNode
//purpose :
//=======================================================================
void LDOM_Element::setAttributeNode (const LDOM_Attr& aNewAttr)
{
setAttribute (aNewAttr.getName(), aNewAttr.getValue());
}
//=======================================================================
//function : removeAttribute
//purpose :
//=======================================================================
void LDOM_Element::removeAttribute (const LDOMString& aName)
{
const LDOM_BasicElement& anElem = (const LDOM_BasicElement&) Origin();
if (anElem.isNull()) return;
anElem.RemoveAttribute (aName, myLastChild);
}
//=======================================================================
//function : GetChildByTagName
//purpose :
//=======================================================================
LDOM_Element LDOM_Element::GetChildByTagName (const LDOMString& aTagName) const
{
// Verify preconditions
LDOM_Element aVoidElement;
if (isNull() || aTagName == NULL)
return aVoidElement;
// Take the first child. If it doesn't match look for other ones in a loop
LDOM_Node aChildNode = getFirstChild();
while (aChildNode != NULL)
{
const LDOM_Node::NodeType aNodeType = aChildNode.getNodeType();
if (aNodeType == LDOM_Node::ATTRIBUTE_NODE)
break;
if (aNodeType == LDOM_Node::ELEMENT_NODE)
{
LDOMString
#ifdef DOM2_MODEL
aNodeName = aChildNode.getLocalName(); // try DOM2/namespaces
if (aNodeName == NULL)
#endif
aNodeName = aChildNode.getNodeName(); // use DOM1
if (aNodeName.equals(aTagName))
return (LDOM_Element&) aChildNode; // a match has been found
}
aChildNode = aChildNode.getNextSibling();
}
return aVoidElement;
}
//=======================================================================
//function : GetSiblingByTagName
//purpose :
//=======================================================================
LDOM_Element LDOM_Element::GetSiblingByTagName () const
{
// Verify preconditions
LDOM_Element aVoidElement;
if (isNull()) return aVoidElement;
LDOMString aTagName = getTagName();
// Take the first child. If it doesn't match look for other ones in a loop
LDOM_Node aNextNode = getNextSibling();
while (aNextNode != NULL)
{
const LDOM_Node::NodeType aNodeType = aNextNode.getNodeType();
if (aNodeType == LDOM_Node::ATTRIBUTE_NODE)
break;
if (aNodeType == LDOM_Node::ELEMENT_NODE)
{
LDOM_Element aNextElement = (LDOM_Element&) aNextNode;
if (aNextElement.getTagName().equals(aTagName))
return aNextElement; // a match has been found
}
aNextNode = aNextNode.getNextSibling();
}
return aVoidElement;
}
//=======================================================================
//function : ReplaceElement
//purpose : Permanently replace the element erasing the old data though the
// children are not erased.
// If anOther belongs to different Document, full copy of all its
// children is performed.
//=======================================================================
void LDOM_Element::ReplaceElement (const LDOM_Element& anOther)
{
LDOM_BasicElement& anElem = (LDOM_BasicElement&) Origin();
const LDOM_BasicElement& anOtherElem =
(const LDOM_BasicElement&) anOther.Origin();
if (myDocument == anOther.myDocument) {
anElem.myTagName = anOtherElem.myTagName;
anElem.myAttributeMask = anOtherElem.myAttributeMask;
anElem.myFirstChild = anOtherElem.myFirstChild;
(const LDOM_BasicNode *&) myLastChild = anOther.myLastChild;
} else {
anElem.ReplaceElement (anOtherElem, myDocument);
(const LDOM_BasicNode *&) myLastChild = NULL;
}
}
//=======================================================================
//function : GetAttributesList
//purpose :
//=======================================================================
LDOM_NodeList LDOM_Element::GetAttributesList () const
{
LDOM_NodeList aList (myDocument);
const LDOM_BasicElement& anElem = (const LDOM_BasicElement&) Origin();
anElem.AddAttributes (aList, myLastChild);
return aList;
}