Hi Mohammad, On Saturday, 2011-08-27 04:10:40 +0430, Mohammad Elahi wrote:
> Numbering in localized persian word is useful in some areas, at least > for me it is necessary. Since it is not trivial a function and table > is needed. Good one, I'll also integrated this. I added quite a few spaces though between variables and operators and keywords for better legibility. I also changed some of the implementation, please see my comments on below, for the results please see the commit once I will have pushed it. > +// Tables used for numbering in persian words > +static sal_Unicode *table_PersianWord_decade1[]={ > + (sal_Unicode[]){0}, // 0 > + (sal_Unicode[]){0x06cc, 0x06a9, 0}, // 1 I introduced a typedef ArrUnicode sal_Unicode[]; and did (ArrUnicode){...} for better legibility throught the entire patch. Also nicely lined up the commented numbers in one column. > +void lcl_formatPersianWord(unsigned int aNumber, OUString& rsResult) Btw, I changed aNumber to nNumber to indicate the simple numeric type instead of an object, that's one of our coding conventions. > +{ > + // Formats numbers in persian word up to 999999999999 which is high > enough for showing int > + OUString asTemp; Performance wise it pays to use an OUStringBuffer instead of an OUString that is copied and recreated and reassigned all way long, initializing the buffer with a sufficient capacity also gets rid of the memory allocation bottlenecks. So, that now is OUStringBuffer aTemp(64); > + OUString > asPersianWord_conjunction=OUString((sal_Unicode[]){0x20,0x0648,0x20,0}); <nitpick> That can be constructed as OUString asPersianWord_conjunction( (ArrUnicode){0x20,0x0648,0x20,0}); without the assignment operator. </nitpick> > + while(int anPart=aNumber%1000) For example, that now is while (int nPart = nNumber % 1000) looks much nicer, doesn't it? ;-) To illustrate why to use an OUStringBuffer: > + > asTemp=OUString(table_PersianWord_decadeX[anSection-1])+asPersianWord_conjunction+asTemp; For that the compiler needs to 1. construct a temporary OUString instance of the expression OUString(table_PersianWord_decadeX[anSection-1]) 2. construct and allocate a second temporary OUString for the concatenation of #1+asPersianWord_conjunction 3. construct and allocate a third temporary OUString for the concatenation of #2+asTemp 4. assign #3 to asTemp, hence deallocate the original asTemp and 5. destruct all temporary instances Instead, aTemp.insert( 0, asPersianWord_conjunction).insert( 0, table_PersianWord_decadeX[nSection-1]); only needs to move some values for insert() in the preallocated buffer. Note that insert() returns a OUStringBuffer& so while this looks reversed at first hand the result is in the correct order. I changed all those constructs to use insert() instead. Probably performance could be enhanced if the algorithm would loop backwards and strings be appended instead of inserted, but.. I don't think that's necessary here. > + if(!asTemp.isEmpty()) That then needs a change to if (aTemp.getLength()) > + asTemp=OUString(0x0020)+asTemp; Also this one can be written as aTemp.insert( 0, sal_Unicode(0x0020)); and so on.. > + rsResult+=asTemp; This one now is rsResult += aTemp.makeStringAndClear(); Thanks again, and keep on hacking ;) Eike -- PGP/OpenPGP/GnuPG encrypted mail preferred in all private communication. Key ID: 0x293C05FD - 997A 4C60 CE41 0149 0DB3 9E96 2F1A D073 293C 05FD
signature.asc
Description: Digital signature
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice