Use StringRef in XmLWriter when the text is not stored

This commit is contained in:
Martin Hořeňovský 2021-05-29 18:38:07 +02:00
parent 1d04427fcd
commit c7241bb76e
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
2 changed files with 23 additions and 12 deletions

View File

@ -267,18 +267,19 @@ namespace {
return *this;
}
XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) {
XmlWriter& XmlWriter::writeAttribute( StringRef name,
StringRef attribute ) {
if( !name.empty() && !attribute.empty() )
m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"';
return *this;
}
XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) {
XmlWriter& XmlWriter::writeAttribute( StringRef name, bool attribute ) {
m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"';
return *this;
}
XmlWriter& XmlWriter::writeText( std::string const& text, XmlFormatting fmt) {
XmlWriter& XmlWriter::writeText( StringRef text, XmlFormatting fmt ) {
if( !text.empty() ){
bool tagWasOpen = m_tagIsOpen;
ensureTagClosed();
@ -291,7 +292,7 @@ namespace {
return *this;
}
XmlWriter& XmlWriter::writeComment( std::string const& text, XmlFormatting fmt) {
XmlWriter& XmlWriter::writeComment( StringRef text, XmlFormatting fmt ) {
ensureTagClosed();
if (shouldIndent(fmt)) {
m_os << m_indent;
@ -301,7 +302,7 @@ namespace {
return *this;
}
void XmlWriter::writeStylesheetRef( std::string const& url ) {
void XmlWriter::writeStylesheetRef( StringRef url ) {
m_os << R"(<?xml-stylesheet type="text/xsl" href=")" << url << R"("?>)" << '\n';
}

View File

@ -81,22 +81,32 @@ namespace Catch {
XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
XmlWriter& writeAttribute( std::string const& name, std::string const& attribute );
//! The attribute content is XML-encoded
XmlWriter& writeAttribute( StringRef name, StringRef attribute );
XmlWriter& writeAttribute( std::string const& name, bool attribute );
//! Writes the attribute as "true/false"
XmlWriter& writeAttribute( StringRef name, bool attribute );
//! The attribute value must provide op<<(ostream&, T). Resulting
//! serialization is XML-encoded
template<typename T>
XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {
XmlWriter& writeAttribute( StringRef name, T const& attribute ) {
ReusableStringStream rss;
rss << attribute;
return writeAttribute( name, rss.str() );
// We need to explicitly convert the string to StringRef to
// guarantee the right overload is picked
return writeAttribute( name, StringRef(rss.str()) );
}
XmlWriter& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
XmlWriter& writeText( StringRef text,
XmlFormatting fmt = XmlFormatting::Newline |
XmlFormatting::Indent );
XmlWriter& writeComment(std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
XmlWriter& writeComment( StringRef text,
XmlFormatting fmt = XmlFormatting::Newline |
XmlFormatting::Indent );
void writeStylesheetRef( std::string const& url );
void writeStylesheetRef( StringRef url );
XmlWriter& writeBlankLine();