Index: core/src/fxcrt/fx_xml_parser.cpp |
diff --git a/core/src/fxcrt/fx_xml_parser.cpp b/core/src/fxcrt/fx_xml_parser.cpp |
index 0b71836ef9cfd057184f08d192d5521e0c0e8a64..fb8b1db39a741c5c6c6e8672a8a24d6c55046629 100644 |
--- a/core/src/fxcrt/fx_xml_parser.cpp |
+++ b/core/src/fxcrt/fx_xml_parser.cpp |
@@ -467,8 +467,8 @@ CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, |
break; |
} |
pSubElement->m_pParent = pElement; |
- pElement->m_Children.Add((void*)CXML_Element::Element); |
- pElement->m_Children.Add(pSubElement); |
+ pElement->m_Children.push_back( |
+ {CXML_Element::Element, pSubElement}); |
SkipWhiteSpaces(); |
} |
break; |
@@ -514,8 +514,7 @@ void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, |
} |
CXML_Content* pContent = new CXML_Content; |
pContent->Set(bCDATA, content); |
- pElement->m_Children.Add((void*)CXML_Element::Content); |
- pElement->m_Children.Add(pContent); |
+ pElement->m_Children.push_back({CXML_Element::Content, pContent}); |
} |
static CXML_Element* XML_ContinueParse(CXML_Parser& parser, |
FX_BOOL bSaveSpaceChars, |
@@ -573,18 +572,16 @@ void CXML_Element::Empty() { |
RemoveChildren(); |
} |
void CXML_Element::RemoveChildren() { |
- for (int i = 0; i < m_Children.GetSize(); i += 2) { |
- ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i); |
- if (type == Content) { |
- CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1); |
- delete content; |
- } else if (type == Element) { |
- CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1); |
+ for (const ChildRecord& record : m_Children) { |
+ if (record.type == Content) { |
+ delete static_cast<CXML_Content*>(record.child); |
+ } else if (record.type == Element) { |
+ CXML_Element* child = static_cast<CXML_Element*>(record.child); |
child->RemoveChildren(); |
delete child; |
} |
} |
- m_Children.RemoveAll(); |
+ m_Children.clear(); |
} |
CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const { |
if (!bQualified || m_QSpaceName.IsEmpty()) { |
@@ -688,45 +685,32 @@ FX_BOOL CXML_Element::GetAttrFloat(const CFX_ByteStringC& space, |
} |
return FALSE; |
} |
-FX_DWORD CXML_Element::CountChildren() const { |
- return m_Children.GetSize() / 2; |
-} |
CXML_Element::ChildType CXML_Element::GetChildType(FX_DWORD index) const { |
- index <<= 1; |
- if (index >= (FX_DWORD)m_Children.GetSize()) { |
- return Invalid; |
- } |
- return (ChildType)(uintptr_t)m_Children.GetAt(index); |
+ return index < m_Children.size() ? m_Children[index].type : Invalid; |
} |
CFX_WideString CXML_Element::GetContent(FX_DWORD index) const { |
- index <<= 1; |
- if (index >= (FX_DWORD)m_Children.GetSize() || |
- (ChildType)(uintptr_t)m_Children.GetAt(index) != Content) { |
- return CFX_WideString(); |
- } |
- CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1); |
- if (pContent) { |
- return pContent->m_Content; |
+ if (index < m_Children.size() && m_Children[index].type == Content) { |
+ CXML_Content* pContent = |
+ static_cast<CXML_Content*>(m_Children[index].child); |
+ if (pContent) |
+ return pContent->m_Content; |
} |
return CFX_WideString(); |
} |
CXML_Element* CXML_Element::GetElement(FX_DWORD index) const { |
- index <<= 1; |
- if (index >= (FX_DWORD)m_Children.GetSize() || |
- (ChildType)(uintptr_t)m_Children.GetAt(index) != Element) { |
- return NULL; |
+ if (index < m_Children.size() && m_Children[index].type == Element) { |
+ return static_cast<CXML_Element*>(m_Children[index].child); |
} |
- return (CXML_Element*)m_Children.GetAt(index + 1); |
+ return nullptr; |
} |
FX_DWORD CXML_Element::CountElements(const CFX_ByteStringC& space, |
const CFX_ByteStringC& tag) const { |
int count = 0; |
- for (int i = 0; i < m_Children.GetSize(); i += 2) { |
- ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i); |
- if (type != Element) { |
+ for (const ChildRecord& record : m_Children) { |
+ if (record.type != Element) |
continue; |
- } |
- CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1); |
+ |
+ CXML_Element* pKid = static_cast<CXML_Element*>(record.child); |
if ((space.IsEmpty() || pKid->m_QSpaceName == space) && |
pKid->m_TagName == tag) { |
count++; |
@@ -737,31 +721,30 @@ FX_DWORD CXML_Element::CountElements(const CFX_ByteStringC& space, |
CXML_Element* CXML_Element::GetElement(const CFX_ByteStringC& space, |
const CFX_ByteStringC& tag, |
int index) const { |
- if (index < 0) { |
- return NULL; |
- } |
- for (int i = 0; i < m_Children.GetSize(); i += 2) { |
- ChildType type = (ChildType)(uintptr_t)m_Children.GetAt(i); |
- if (type != Element) { |
- continue; |
- } |
- CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1); |
- if ((!space.IsEmpty() && pKid->m_QSpaceName != space) || |
- pKid->m_TagName != tag) { |
+ if (index < 0) |
+ return nullptr; |
+ |
+ for (const ChildRecord& record : m_Children) { |
+ if (record.type != Element) |
continue; |
- } |
- if (index-- == 0) { |
- return pKid; |
+ |
+ CXML_Element* pKid = static_cast<CXML_Element*>(record.child); |
+ if ((space.IsEmpty() || pKid->m_QSpaceName == space) && |
+ pKid->m_TagName == tag) { |
+ if (index-- == 0) |
+ return pKid; |
} |
} |
return NULL; |
} |
FX_DWORD CXML_Element::FindElement(CXML_Element* pChild) const { |
- for (int i = 0; i < m_Children.GetSize(); i += 2) { |
- if ((ChildType)(uintptr_t)m_Children.GetAt(i) == Element && |
- (CXML_Element*)m_Children.GetAt(i + 1) == pChild) { |
- return (FX_DWORD)(i >> 1); |
+ int index = 0; |
+ for (const ChildRecord& record : m_Children) { |
+ if (record.type == Element && |
+ static_cast<CXML_Element*>(record.child) == pChild) { |
+ return index; |
} |
+ ++index; |
} |
return (FX_DWORD)-1; |
} |