ladybird/Libraries/LibXML/DOM/Node.cpp

54 lines
1.8 KiB
C++

/*
* Copyright (c) 2022, Ali Mohammad Pur <mpfard@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/NonnullOwnPtr.h>
#include <LibXML/DOM/Node.h>
namespace XML {
bool Node::operator==(Node const& other) const
{
return content.visit(
[&](Text const& text) -> bool {
auto other_text = other.content.get_pointer<Text>();
if (!other_text)
return false;
return text.builder.string_view() == other_text->builder.string_view();
},
[&](Comment const& comment) -> bool {
auto other_comment = other.content.get_pointer<Comment>();
if (!other_comment)
return false;
return comment.text == other_comment->text;
},
[&](Element const& element) -> bool {
auto other_element = other.content.get_pointer<Element>();
if (!other_element)
return false;
if (element.name != other_element->name)
return false;
if (element.attributes.size() != other_element->attributes.size())
return false;
for (auto& entry : element.attributes) {
auto it = other_element->attributes.find(entry.key);
if (it == other_element->attributes.end())
return false;
if (it->value != entry.value)
return false;
}
if (element.children.size() != other_element->children.size())
return false;
for (size_t i = 0; i < element.children.size(); ++i) {
if (element.children[i].ptr() != other_element->children[i].ptr())
return false;
}
return true;
});
}
}