sax/source/tools/fastserializer.cxx | 24 ++++++++++++++++++++++-- sax/source/tools/fastserializer.hxx | 5 +++++ sax/source/tools/fshelper.cxx | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-)
New commits: commit 4a0b656701ff863dfc0ab4d2c3cdedb798a572d7 Author: Matúš Kukan <matus.ku...@collabora.com> Date: Fri Oct 3 12:30:51 2014 +0200 FastSerializer: Avoid some cycles when dealing with doubles Would be easier to use OStringBuffer, but we can't get its pData member. Also its append(double) is suboptimal (or anything that uses rtl_str_valueOfDouble) - should be doing something like this commit. Change-Id: I8f3140081a574a84f0e60dc85cce1bd2de23cd34 diff --git a/sax/source/tools/fastserializer.cxx b/sax/source/tools/fastserializer.cxx index 3876609..cd8b0ca 100644 --- a/sax/source/tools/fastserializer.cxx +++ b/sax/source/tools/fastserializer.cxx @@ -20,7 +20,7 @@ #include "fastserializer.hxx" #include <com/sun/star/xml/sax/FastTokenHandler.hpp> -#include <rtl/ustrbuf.hxx> +#include <rtl/math.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/sequenceasvector.hxx> @@ -66,19 +66,39 @@ namespace sax_fastparser { FastSaxSerializer::FastSaxSerializer( const css::uno::Reference< css::io::XOutputStream >& xOutputStream ) : maCachedOutputStream() , maMarkStack() + , mpDoubleStr(NULL) + , mnDoubleStrCapacity(RTL_STR_MAX_VALUEOFDOUBLE) { + rtl_string_new_WithLength(&mpDoubleStr, mnDoubleStrCapacity); mxFastTokenHandler = css::xml::sax::FastTokenHandler::create( ::comphelper::getProcessComponentContext()); assert(xOutputStream.is()); // cannot do anything without that maCachedOutputStream.setOutputStream( xOutputStream ); } - FastSaxSerializer::~FastSaxSerializer() {} + + FastSaxSerializer::~FastSaxSerializer() + { + rtl_string_release(mpDoubleStr); + } void FastSaxSerializer::startDocument() { writeBytes(sXmlHeader, N_CHARS(sXmlHeader)); } + void FastSaxSerializer::write( double value ) + { + rtl_math_doubleToString( + &mpDoubleStr, &mnDoubleStrCapacity, 0, value, rtl_math_StringFormat_G, + RTL_STR_MAX_VALUEOFDOUBLE - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0, + 0, sal_True); + + write(mpDoubleStr->buffer, mpDoubleStr->length); + // and "clear" the string + mpDoubleStr->length = 0; + mnDoubleStrCapacity = RTL_STR_MAX_VALUEOFDOUBLE; + } + void FastSaxSerializer::write( const OUString& sOutput, bool bEscape ) { if (!lcl_isAscii(sOutput)) diff --git a/sax/source/tools/fastserializer.hxx b/sax/source/tools/fastserializer.hxx index 60ef71b..5b740ce 100644 --- a/sax/source/tools/fastserializer.hxx +++ b/sax/source/tools/fastserializer.hxx @@ -110,6 +110,7 @@ public: void writeId( ::sal_Int32 Element ); OString getId( ::sal_Int32 Element ); + void write( double value ); void write( const OUString& s, bool bEscape = false ); void write( const OString& s, bool bEscape = false ); void write( const char* pStr, sal_Int32 nLen, bool bEscape = false ); @@ -204,6 +205,10 @@ private: }; ::std::stack< boost::shared_ptr< ForMerge > > maMarkStack; + // Would be better to use OStringBuffer instead of these two + // but then we couldn't get the rtl_String* member :-( + rtl_String *mpDoubleStr; + sal_Int32 mnDoubleStrCapacity; TokenValueList maTokenValues; #ifdef DBG_UTIL diff --git a/sax/source/tools/fshelper.cxx b/sax/source/tools/fshelper.cxx index 801be10..15a5efa 100644 --- a/sax/source/tools/fshelper.cxx +++ b/sax/source/tools/fshelper.cxx @@ -126,7 +126,7 @@ FastSerializerHelper* FastSerializerHelper::write(sal_Int64 value) FastSerializerHelper* FastSerializerHelper::write(double value) { - mpSerializer->write(OString::number(value)); + mpSerializer->write(value); return this; }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits