Hi Jenei, On Sunday, 2011-08-21 14:59:26 +0200, Jenei Gábor wrote:
+ ::rtl::OUStringBuffer sTemp;
Construct the buffer with a sufficient capacity beforehand so no memory
allocation needs to be done in between:
::rtl::OUStringBuffer sTemp( nQueryLen);
[...] + return (::rtl::OUString)sTemp;
Make that instead
return sTemp.makeStringAndClear();
With your C-style cast (please don't use those anyhow, this is C++)
a temporary string instance is created and the buffer is copied, which
it isn't when using makeStringAndClear().
+std::vector< ::rtl::OUStringBuffer > getComment(const ::rtl::OUString& sQuery){
Why return vector<OUStringBuffer> ? vector<OUString> seems to be more straight forward.
+ const sal_Unicode* sCopy=sQuery.getStr();
+ int nQueryLen=sQuery.getLength();
+ bool bIsText1=false;
+ bool bIsText2=false;
+ bool bComment=false;
+ std::vector< ::rtl::OUStringBuffer > sRet;
+ ::rtl::OUStringBuffer sTemp;
+ for(int i=0;i<nQueryLen;i++){
+ if(sCopy[i]=='\"' && !bIsText2 && !bComment) bIsText1=!bIsText1;
+ if(sCopy[i]=='\'' && !bIsText1 && !bComment) bIsText2=!bIsText2;
+ if(sCopy[i]=='\n' || i==nQueryLen-1){
+ if(bComment) bComment=false;
+ sTemp.append((sal_Unicode)'\n');
+ sRet.push_back(sTemp); + sTemp=::rtl::OUString();
Provided that vector<OUString> is returned, change that to
sRet.push_back( sTemp.makeStringAndClear());
then there's also no need to assign sTemp an empty OUString anymore.
+ } + if(!bIsText1 && !bIsText2 && (i+1)<nQueryLen && sCopy[i]=='-' && sCopy[i+1]=='-') bComment=true; + if(!bIsText1 && !bIsText2 && (i+1)<nQueryLen && sCopy[i]=='/' && sCopy[i+1]=='/') bComment=true; + if(bComment) sTemp.append(&sCopy[i],1); + } + sTemp=::rtl::OUString();
That one is superfluous, sTemp as a stack local variable will be destructed upon return anyway.
+ return sRet; +}
+//------------------------------------------------------------------------------
+::rtl::OUString ConcatComment(const ::rtl::OUString& sQuery,std::vector< ::rtl::OUStringBuffer >
sComments){
Pass sComments as const reference so it doesn't need to be copied when ConcatComment() is called. And use vector<OUString> instead, as above.
+ ::rtl::OUStringBuffer sRet;
+ int nIndLF=0;
+ int nIndBeg=0;
+ for(unsigned int i=0;i<sComments.size();i++){
+ nIndBeg=nIndLF;
+ if(sQuery.indexOf('\n')==-1){
+ nIndLF=sQuery.getLength();
This conditional gets executed for each element of sComments, but clearly sQuery can't change in between, so doing this over and over again is unnecessary.
+ }
+ else{
+ nIndLF=sQuery.indexOf('\n',nIndLF);
+ }
+ sRet.append(sQuery.copy(nIndBeg,nIndLF-nIndBeg));
What if sQuery doesn't contain as many LFs as there are elements in
sComments? nIndLF will be -1 and in the next loop run nIndBeg will also
be -1.
The append(copy()) construct could be optimized as the copy creates
a temporary OUString instance that then is appended to sRet. More
effective would be something like
sRet.append( sQuery.getStr() + nIndBeg, nIndLF - nIndBeg));
+ sRet.append(sComments[i]); + } + return (::rtl::OUString)sRet;
Same here, use
return sRet.makeStringAndClear();
Btw,
+ sTranslatedStmt=ConcatComment(sTranslatedStmt,sComments);
blanks increase legibility, maybe it's just me but I'd much prefer a
sTranslatedStmt = ConcatComment( sTranslatedStmt, sComments);
style instead.
Thanks
Eike
--
PGP/OpenPGP/GnuPG encrypted mail preferred in all private communication.
Key ID: 0x293C05FD - 997A 4C60 CE41 0149 0DB3 9E96 2F1A D073 293C 05FD
Attachment:
signature.asc
Description: Digital signature