summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pugixml.cpp50
-rw-r--r--src/pugixml.hpp18
2 files changed, 42 insertions, 26 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 8b2f35c..c65fc90 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -3336,14 +3336,9 @@ namespace pugi
return (_attr && _attr->value) ? _attr->value : PUGIXML_TEXT("");
}
- const void* xml_attribute::document_order() const
+ xml_attribute_struct* xml_attribute::internal_object()
{
- if (!_attr) return 0;
-
- if ((_attr->header & xml_memory_page_name_allocated_mask) == 0) return _attr->name;
- if ((_attr->header & xml_memory_page_value_allocated_mask) == 0) return _attr->value;
-
- return 0;
+ return _attr;
}
xml_attribute& xml_attribute::operator=(const char_t* rhs)
@@ -4054,14 +4049,9 @@ namespace pugi
return walker.end(arg_end);
}
- const void* xml_node::document_order() const
+ xml_node_struct* xml_node::internal_object()
{
- if (!_root) return 0;
-
- if (_root->name && (_root->header & xml_memory_page_name_allocated_mask) == 0) return _root->name;
- if (_root->value && (_root->header & xml_memory_page_value_allocated_mask) == 0) return _root->value;
-
- return 0;
+ return _root;
}
void xml_node::print(xml_writer& writer, const char_t* indent, unsigned int flags, xml_encoding encoding, unsigned int depth) const
@@ -5351,19 +5341,43 @@ namespace
return parent && node == parent;
}
+
+ const void* document_order(const xpath_node& xnode)
+ {
+ xml_node_struct* node = xnode.node().internal_object();
+
+ if (node)
+ {
+ if (node->name && (node->header & xml_memory_page_name_allocated_mask) == 0) return node->name;
+ if (node->value && (node->header & xml_memory_page_value_allocated_mask) == 0) return node->value;
+ return 0;
+ }
+
+ xml_attribute_struct* attr = xnode.attribute().internal_object();
+
+ if (attr)
+ {
+ if ((attr->header & xml_memory_page_name_allocated_mask) == 0) return attr->name;
+ if ((attr->header & xml_memory_page_value_allocated_mask) == 0) return attr->value;
+ return 0;
+ }
+
+ return 0;
+ }
struct document_order_comparator
{
bool operator()(const xpath_node& lhs, const xpath_node& rhs) const
{
- xml_node ln = lhs.node(), rn = rhs.node();
-
// optimized document order based check
- const void* lo = lhs.attribute() ? lhs.attribute().document_order() : ln.document_order();
- const void* ro = rhs.attribute() ? rhs.attribute().document_order() : rn.document_order();
+ const void* lo = document_order(lhs);
+ const void* ro = document_order(rhs);
if (lo && ro) return lo < ro;
+ // slow comparison
+ xml_node ln = lhs.node(), rn = rhs.node();
+
// compare attributes
if (lhs.attribute() && rhs.attribute())
{
diff --git a/src/pugixml.hpp b/src/pugixml.hpp
index 80fe6d8..2624362 100644
--- a/src/pugixml.hpp
+++ b/src/pugixml.hpp
@@ -254,12 +254,13 @@ namespace pugi
typedef xml_attribute_struct* xml_attribute::*unspecified_bool_type;
- explicit xml_attribute(xml_attribute_struct* attr);
-
public:
// Default constructor. Constructs an empty attribute.
xml_attribute();
+ // Constructs attribute from internal pointer
+ explicit xml_attribute(xml_attribute_struct* attr);
+
// Safe bool conversion operator
operator unspecified_bool_type() const;
@@ -311,8 +312,8 @@ namespace pugi
xml_attribute next_attribute() const;
xml_attribute previous_attribute() const;
- // This function is for internal use
- const void* document_order() const;
+ // Get internal pointer
+ xml_attribute_struct* internal_object();
};
#ifdef __BORLANDC__
@@ -332,12 +333,13 @@ namespace pugi
typedef xml_node_struct* xml_node::*unspecified_bool_type;
- explicit xml_node(xml_node_struct* p);
-
public:
// Default constructor. Constructs an empty node.
xml_node();
+ // Constructs node from internal pointer
+ explicit xml_node(xml_node_struct* p);
+
// Safe bool conversion operator
operator unspecified_bool_type() const;
@@ -521,8 +523,8 @@ namespace pugi
// Get node offset in parsed file/string (in char_t units) for debugging purposes
ptrdiff_t offset_debug() const;
- // This function is for internal use
- const void* document_order() const;
+ // Get internal pointer
+ xml_node_struct* internal_object();
};
#ifdef __BORLANDC__