diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/pugixml.cpp | 50 | ||||
| -rw-r--r-- | src/pugixml.hpp | 18 | 
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__  | 
