Optimize and refactor node output implementation a bit (+5% perf gain)

git-svn-id: https://pugixml.googlecode.com/svn/trunk@1019 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
Arseny Kapoulkine 2014-09-22 06:29:14 +00:00
parent fff1991743
commit bb6eaa7565

View File

@ -3059,9 +3059,7 @@ PUGI__NS_BEGIN
} }
} }
void write(const char_t* data, size_t length) void write_direct(const char_t* data, size_t length)
{
if (bufsize + length > bufcapacity)
{ {
// flush the remaining buffer contents // flush the remaining buffer contents
flush(); flush();
@ -3094,12 +3092,24 @@ PUGI__NS_BEGIN
// small tail is copied below // small tail is copied below
bufsize = 0; bufsize = 0;
} }
}
memcpy(buffer + bufsize, data, length * sizeof(char_t)); memcpy(buffer + bufsize, data, length * sizeof(char_t));
bufsize += length; bufsize += length;
} }
void write(const char_t* data, size_t length)
{
if (bufsize + length <= bufcapacity)
{
memcpy(buffer + bufsize, data, length * sizeof(char_t));
bufsize += length;
}
else
{
write_direct(data, length);
}
}
void write(const char_t* data) void write(const char_t* data)
{ {
write(data, strlength(data)); write(data, strlength(data));
@ -3336,6 +3346,7 @@ PUGI__NS_BEGIN
writer.write('<'); writer.write('<');
writer.write(name); writer.write(name);
if (node.first_attribute())
node_output_attributes(writer, node, flags); node_output_attributes(writer, node, flags);
if (flags & format_raw) if (flags & format_raw)
@ -3349,16 +3360,20 @@ PUGI__NS_BEGIN
return true; return true;
} }
} }
else if (!node.first_child()) else
{
xml_node first = node.first_child();
if (!first)
writer.write(' ', '/', '>', '\n'); writer.write(' ', '/', '>', '\n');
else if (node.first_child() == node.last_child() && (node.first_child().type() == node_pcdata || node.first_child().type() == node_cdata)) else if (!first.next_sibling() && (first.type() == node_pcdata || first.type() == node_cdata))
{ {
writer.write('>'); writer.write('>');
if (node.first_child().type() == node_pcdata) if (first.type() == node_pcdata)
text_output(writer, node.first_child().value(), ctx_special_pcdata, flags); text_output(writer, first.value(), ctx_special_pcdata, flags);
else else
text_output_cdata(writer, node.first_child().value()); text_output_cdata(writer, first.value());
writer.write('<', '/'); writer.write('<', '/');
writer.write(name); writer.write(name);
@ -3370,6 +3385,7 @@ PUGI__NS_BEGIN
return true; return true;
} }
}
return false; return false;
} }
@ -3381,10 +3397,11 @@ PUGI__NS_BEGIN
writer.write('<', '/'); writer.write('<', '/');
writer.write(name); writer.write(name);
writer.write('>');
if ((flags & format_raw) == 0) if (flags & format_raw)
writer.write('\n'); writer.write('>');
else
writer.write('>', '\n');
} }
PUGI__FN void node_output_simple(xml_buffered_writer& writer, const xml_node& node, unsigned int flags) PUGI__FN void node_output_simple(xml_buffered_writer& writer, const xml_node& node, unsigned int flags)
@ -4582,10 +4599,7 @@ namespace pugi
PUGI__FN xml_node xml_node::next_sibling() const PUGI__FN xml_node xml_node::next_sibling() const
{ {
if (!_root) return xml_node(); return _root ? xml_node(_root->next_sibling) : xml_node();
if (_root->next_sibling) return xml_node(_root->next_sibling);
else return xml_node();
} }
PUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const PUGI__FN xml_node xml_node::previous_sibling(const char_t* name_) const