Add string_view name & value getter with suffix for compatible

This commit is contained in:
halx99 2021-12-23 15:45:20 +08:00
parent 909b3b65f1
commit 69e24c7fdd
2 changed files with 70 additions and 1 deletions

View File

@ -3132,7 +3132,7 @@ PUGI__NS_BEGIN
PUGI__SCANFOR(s[0] == ']' && s[1] == ']' && PUGI__ENDSWITH(s[2], '>'));
PUGI__CHECK_ERROR(status_bad_cdata, s);
cursor->value_len = s - cursor->value;
cursor->value_len = static_cast<int>(s - cursor->value);
*s++ = '\0'; // Zero-terminate this segment.
}
}
@ -5230,6 +5230,11 @@ namespace pugi
return (_attr && _attr->value) ? _attr->value + 0 : def;
}
PUGI__FN string_view_t xml_attribute::as_string_sv(string_view_t def) const
{
return (_attr && _attr->value) ? string_view_t(_attr->value + 0, _attr->value_len) : def;
}
PUGI__FN int xml_attribute::as_int(int def) const
{
return (_attr && _attr->value) ? impl::get_value_int(_attr->value) : def;
@ -5277,11 +5282,21 @@ namespace pugi
return (_attr && _attr->name) ? _attr->name + 0 : PUGIXML_TEXT("");
}
PUGI__FN string_view_t xml_attribute::name_sv() const
{
return (_attr && _attr->name) ? string_view_t(_attr->name + 0, _attr->name_len) : string_view_t(PUGIXML_TEXT(""), 0);
}
PUGI__FN const char_t* xml_attribute::value() const
{
return (_attr && _attr->value) ? _attr->value + 0 : PUGIXML_TEXT("");
}
PUGI__FN string_view_t xml_attribute::value_sv() const
{
return (_attr && _attr->value) ? string_view_t(_attr->value + 0, _attr->value_len) : string_view_t(PUGIXML_TEXT(""), 0);
}
PUGI__FN size_t xml_attribute::hash_value() const
{
return static_cast<size_t>(reinterpret_cast<uintptr_t>(_attr) / sizeof(xml_attribute_struct));
@ -5556,6 +5571,11 @@ namespace pugi
return (_root && _root->name) ? _root->name + 0 : PUGIXML_TEXT("");
}
PUGI__FN string_view_t xml_node::name_sv() const
{
return (_root && _root->name) ? string_view_t(_root->name + 0, _root->name_len) : string_view_t(PUGIXML_TEXT(""), 0);
}
PUGI__FN xml_node_type xml_node::type() const
{
return _root ? PUGI__NODETYPE(_root) : node_null;
@ -5566,6 +5586,11 @@ namespace pugi
return (_root && _root->value) ? _root->value + 0 : PUGIXML_TEXT("");
}
PUGI__FN string_view_t xml_node::value_sv() const
{
return (_root && _root->value) ? string_view_t(_root->value + 0, _root->value_len) : string_view_t(PUGIXML_TEXT(""), 0);
}
PUGI__FN xml_node xml_node::child(const char_t* name_) const
{
if (!_root) return xml_node();
@ -5683,11 +5708,31 @@ namespace pugi
return PUGIXML_TEXT("");
}
PUGI__FN string_view_t xml_node::child_value_sv() const
{
if (!_root) return string_view_t(PUGIXML_TEXT(""), 0);
// element nodes can have value if parse_embed_pcdata was used
if (PUGI__NODETYPE(_root) == node_element && _root->value)
return string_view_t(_root->value, _root->value_len);
for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
if (impl::is_text_node(i) && i->value)
return string_view_t(i->value, i->value_len);
return string_view_t(PUGIXML_TEXT(""), 0);
}
PUGI__FN const char_t* xml_node::child_value(const char_t* name_) const
{
return child(name_).child_value();
}
PUGI__FN string_view_t xml_node::child_value_sv(const char_t* name_) const
{
return child(name_).child_value_sv();
}
PUGI__FN xml_attribute xml_node::first_attribute() const
{
return _root ? xml_attribute(_root->first_attribute) : xml_attribute();
@ -6513,6 +6558,13 @@ namespace pugi
return (d && d->value) ? d->value + 0 : PUGIXML_TEXT("");
}
PUGI__FN string_view_t xml_text::get_sv() const
{
xml_node_struct* d = _data();
return (d && d->value) ? string_view_t(d->value + 0, d->value_len) : string_view_t(PUGIXML_TEXT(""), 0);
}
PUGI__FN const char_t* xml_text::as_string(const char_t* def) const
{
xml_node_struct* d = _data();
@ -6520,6 +6572,13 @@ namespace pugi
return (d && d->value) ? d->value + 0 : def;
}
PUGI__FN string_view_t xml_text::as_string_sv(string_view_t def) const
{
xml_node_struct* d = _data();
return (d && d->value) ? string_view_t(d->value + 0, d->value_len) : def;
}
PUGI__FN int xml_text::as_int(int def) const
{
xml_node_struct* d = _data();

View File

@ -520,10 +520,14 @@ namespace pugi
// Get attribute name/value, or "" if attribute is empty
const char_t* name() const;
string_view_t name_sv() const;
const char_t* value() const;
string_view_t value_sv() const;
// Get attribute value, or the default value if attribute is empty
const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
string_view_t as_string_sv(string_view_t def = string_view_t(PUGIXML_TEXT(""), 0)) const;
// Get attribute value as a number, or the default value if conversion did not succeed or attribute is empty
int as_int(int def = 0) const;
@ -632,10 +636,12 @@ namespace pugi
// Get node name, or "" if node is empty or it has no name
const char_t* name() const;
string_view_t name_sv() const;
// Get node value, or "" if node is empty or it has no value
// Note: For <node>text</node> node.value() does not return "text"! Use child_value() or text() methods to access text inside nodes.
const char_t* value() const;
string_view_t value_sv() const;
// Get attribute list
xml_attribute first_attribute() const;
@ -669,9 +675,11 @@ namespace pugi
// Get child value of current node; that is, value of the first child node of type PCDATA/CDATA
const char_t* child_value() const;
string_view_t child_value_sv() const;
// Get child value of child with specified name. Equivalent to child(name).child_value().
const char_t* child_value(const char_t* name) const;
string_view_t child_value_sv(const char_t* name) const;
// Set node name/value (returns false if node is empty, there is not enough memory, or node can not have name/value)
bool set_name(string_view_t rhs, bool shallow_copy = false);
@ -881,9 +889,11 @@ namespace pugi
// Get text, or "" if object is empty
const char_t* get() const;
string_view_t get_sv() const;
// Get text, or the default value if object is empty
const char_t* as_string(const char_t* def = PUGIXML_TEXT("")) const;
string_view_t as_string_sv(string_view_t def = string_view_t(PUGIXML_TEXT(""), 0)) const;
// Get text as a number, or the default value if conversion did not succeed or object is empty
int as_int(int def = 0) const;