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
Attachment:
signature.asc
Description: Digital signature