Kigs Framework  Doc version 0.8
Open source multi purpose Rapid Application Development framework
usString.h
1 #ifndef _USSTRING_H
2 #define _USSTRING_H
3 
4 #include "CoreTypes.h"
5 #include <string>
6 #include <locale>
7 
8 // ****************************************
9 // * usString class
10 // * --------------------------------------
14 // ****************************************
15 // Unsigned short String Management
16 
17 #include "kstlvector.h"
18 
19 // define sprintf on wchar
20 extern "C" int sprintfw(unsigned short* _Dest, const unsigned short* _format, ...);
21 extern "C" int vsprintfw(unsigned short* _Dest, const unsigned short* _format, va_list args);
22 // copy a nul terminated string to a wchar buffer
23 extern "C" void strcpyw(unsigned short* _Dest, const char* src);
24 extern "C" void strcpywUtoC(char * _Dest, const unsigned short * src);
25 extern "C" int setUnsignedShortToInt(unsigned short * buffer);
26 extern "C" float setUnsignedShortToFloat(unsigned short * buffer);
27 extern "C" void convertIntToString(char * buffer, int number);
28 
29 typedef unsigned char UTF8Char;
30 
31 class usString
32 {
33 public:
34  usString();
35 
36  // set this one as explicit to avoid ambiguity for method with kstl::string or usString parameter called with const char* parameter
37  explicit usString(const char* str) :
38  mString(0)
39  {
40  copy(str);
41  }
42 
43  usString(const UTF8Char* str) :
44  mString(0)
45  {
46  copy(str);
47  }
48 
49  usString(const unsigned short* str) :
50  mString(0)
51  {
52  copy(str);
53  }
54 
55  usString(const kstl::string& other) : mString(0) {
56  copy(other.c_str());
57  }
58 
59  usString(const usString& other);
60 
61  // reserve clear the current string if any
62  void reserve(int size);
63 
64  ~usString();
65 
66  // cast operator
67  operator bool() const;
68 
69  operator float() const;
70 
71  operator int() const;
72 
73  operator unsigned int() const;
74 
75  explicit operator kstl::string() const;
76 
77  const unsigned short* us_str() const
78  {
79  return mString;
80  }
81  /*const char* c_str() const
82  {
83  char * _Dest = new char[length()];
84  this->strcpywUtoC(_Dest, mString);
85  return _Dest;
86  }*/
87 
88  std::vector<UTF8Char> toUTF8();
89 
90 
91  bool operator == (const char* str)
92  {
93  usString usstr(str);
94  return usstr == *this;
95  }
96 
97  bool operator == (const usString& other)
98  {
99  const unsigned short* read_char1 = mString;
100  const unsigned short* read_char2 = other.mString;
101 
102  while (*read_char2 == *read_char1)
103  {
104  if (*read_char1 == 0)
105  {
106  return true;
107  }
108  ++read_char2;
109  ++read_char1;
110  }
111 
112  return false;
113  }
114 
115  inline const unsigned short& operator[](unsigned int i)const
116  {
117  // warning, no check for out of bound
118  return mString[i];
119  }
120 
121  inline unsigned short& operator[](unsigned int i)
122  {
123  // warning, no check for out of bound
124  return mString[i];
125  }
126 
127  void strcpywUtoC(char * _Dest, const unsigned short * src)const
128  {
129  const unsigned short* read_char = src;
130  char* write_char = _Dest;
131 
132  while (*read_char)
133  {
134  *write_char = (char)*read_char;
135  ++read_char;
136  ++write_char;
137  }
138 
139  *write_char = 0;
140  }
141 
142  bool operator<(const usString& other) const
143  {
144 
145  const unsigned short* read_char1 = mString;
146  const unsigned short* read_char2 = other.mString;
147 
148  do
149  {
150  if (*read_char1 < *read_char2)
151  {
152  return true;
153  }
154  else if (*read_char1 > *read_char2)
155  {
156  return false;
157  }
158  ++read_char1;
159  ++read_char2;
160  } while (((*read_char1) != 0) || ((*read_char2) != 0));
161  return false;
162  }
163 
164  kstl::string ToString() const
165  {
166  kstl::string ret = "";
167  ret.reserve(strlen());
168 
169  const unsigned short* read_char = mString;
170 
171  while (*read_char)
172  {
173  ret += ((char)*read_char);
174  ++read_char;
175  }
176 
177  return ret;
178  }
179 
180  // encode current unsigned short string to a char string :
181  // each unsigned short is print as a integer and each integer is separated by '.'
182  kstl::string encode();
183 
184  // decode a serie of integer separated by '.' to a unsigned short string
185  void decode(const kstl::string& todecode);
186 
187 
188  // len = -1 remove everything from start to end of the string
189  void removeRange(size_t start, int len);
190 
191  kstl::vector<usString> SplitByCharacter(unsigned short _value) const
192  {
193  kstl::vector<usString> returnedString;
194 
195  unsigned short* read = mString;
196 
197  unsigned int startCount = 0;
198  unsigned int count = 0;
199  while (*read)
200  {
201  if ((*read) == _value)
202  {
203  unsigned int size = count + 1;
204  unsigned short* temp = new unsigned short[size];
205 
206  memset(temp, 0, (size) * sizeof(unsigned short));
207  memcpy(temp, mString + startCount, count * sizeof(unsigned short));
208  returnedString.push_back(temp);
209  delete[] temp;
210 
211  startCount += size;
212  count = 0;
213  ++read;
214  }
215  else
216  {
217  ++read;
218  count++;
219  }
220 
221  }
222  unsigned int size = count + 1;
223  unsigned short* temp = new unsigned short[size];
224 
225  memset(temp, 0, (size) * sizeof(unsigned short));
226  memcpy(temp, mString + startCount, count * sizeof(unsigned short));
227  returnedString.push_back(temp);
228  delete[] temp;
229 
230  return returnedString;
231  }
232 
233  static inline unsigned int strlen(const char* str)
234  {
235  char* read = (char*)str;
236 
237  unsigned int len = 0;
238 
239  while (*read)
240  {
241  ++read;
242  ++len;
243  }
244 
245  return len;
246 
247  }
248 
249  bool empty() const
250  {
251  return (strlen(mString) == 0);
252  }
253 
254  inline unsigned int length() const
255  {
256  return strlen(mString);
257  }
258 
259  usString substr(int pos, int len) const
260  {
261  usString result;
262  int origlen = strlen(mString);
263  if ((origlen - pos) < len)
264  {
265  len = origlen - pos;
266  if (len < 0)
267  {
268  len = 0;
269  }
270  }
271 
272  if (result.mString)
273  delete[] result.mString;
274  result.mString = new unsigned short[len + 1];
275  memcpy(result.mString, mString + pos, len * sizeof(unsigned short));
276  result.mString[len] = 0;
277 
278  return result;
279  }
280 
281  std::string::size_type find(unsigned short toFind, int startpos = 0) const
282  {
283  int Len = strlen(mString);
284  if (startpos >= Len)
285  {
286  return std::string::npos;
287  }
288 
289  unsigned short* read = ((unsigned short*)mString) + startpos;
290  unsigned int pos = startpos;
291  while (*read)
292  {
293  if (*read == toFind)
294  {
295  return pos;
296  }
297  ++pos;
298  ++read;
299  }
300  return std::string::npos;
301  }
302  std::string::size_type rfind(unsigned short toFind, int startpos = 0) const
303  {
304  int Len = strlen(mString);
305  if (startpos < 0)
306  {
307  return std::string::npos;
308  }
309 
310  unsigned short* read = ((unsigned short*)mString) + startpos;
311  unsigned int pos = Len - 1 - startpos;
312  while (*read)
313  {
314  if (*read == toFind)
315  {
316  return pos;
317  }
318  --pos;
319  --read;
320  }
321  return std::string::npos;
322  }
323 
324  std::string::size_type find(const usString& toFind, int startpos = 0) const;
325  std::string::size_type rfind(const usString& toFind, int startpos = 0) const;
326 
327 
328  void replaceAllOccurence(const usString& toReplace, const usString& Replacement, int startpos = 0);
329 
330  void replaceAt(const usString& Replacement, int start,int lenToReplace);
331 
332  void replaceEscapeUnicode();
333 
334  static inline unsigned int strlen(const unsigned short* str)
335  {
336  unsigned short* read = (unsigned short*)str;
337 
338  unsigned int len = 0;
339 
340  while (*read)
341  {
342  ++read;
343  ++len;
344  }
345 
346  return len;
347 
348  }
349 
350  inline unsigned int strlen() const
351  {
352  return strlen(mString);
353  }
354 
355  usString& operator=(const usString& toCopy)
356  {
357  copy(toCopy.us_str());
358 
359  return *this;
360  }
361 
362  bool operator==(const usString& _value) const
363  {
364  unsigned int len1 = _value.strlen();
365  unsigned int len2 = strlen();
366 
367  if (len1 == len2)
368  {
369  unsigned short* read = _value.mString;
370  unsigned short* read2 = mString;
371 
372  while (*read)
373  {
374  if ((*read2) != (*read))
375  {
376  return false;
377  }
378  ++read;
379  ++read2;
380  }
381 
382  return true;
383  }
384 
385  return false;
386  }
387 
388  bool operator==(unsigned short* _value) const
389  {
390  unsigned int len1 = strlen(_value);
391  unsigned int len2 = strlen();
392 
393  if (len1 == len2)
394  {
395  unsigned short* read = _value;
396  unsigned short* read2 = mString;
397 
398  while (*read)
399  {
400  if ((*read2) != (*read))
401  {
402  return false;
403  }
404  ++read;
405  ++read2;
406  }
407 
408  return true;
409  }
410 
411  return false;
412  }
413 
414  bool operator!=(const usString& _value) const
415  {
416  unsigned int len1 = _value.strlen();
417  unsigned int len2 = strlen();
418 
419  if (len1 == len2)
420  {
421  unsigned short* read = _value.mString;
422  unsigned short* read2 = mString;
423 
424  while (*read)
425  {
426  if ((*read2) != (*read))
427  {
428  return true;
429  }
430  ++read;
431  ++read2;
432  }
433 
434  return false;
435  }
436 
437  return true;
438  }
439 
440  bool operator!=(unsigned short* _value) const
441  {
442  unsigned int len1 = strlen(_value);
443  unsigned int len2 = strlen();
444 
445  if (len1 == len2)
446  {
447  unsigned short* read = _value;
448  unsigned short* read2 = mString;
449 
450  while (*read)
451  {
452  if ((*read2) != (*read))
453  {
454  return true;
455  }
456  ++read;
457  ++read2;
458  }
459  return false;
460  }
461  return true;
462  }
463 
464  usString& operator+=(const usString& _value)
465  {
466  unsigned int len1 = _value.strlen();
467  unsigned int len2 = strlen();
468 
469  unsigned int totalsize = len1 + len2 + 1;
470 
471  unsigned short* result = new unsigned short[totalsize];
472  memset(result, 0, totalsize * sizeof(unsigned short));
473  if (mString)
474  memcpy(result, mString, len2 * sizeof(unsigned short));
475 
476  memcpy(result + len2, _value.mString, len1 * sizeof(unsigned short));
477 
478  if (mString)
479  delete[] mString;
480  mString = result;
481 
482  return *this;
483 
484  }
485 
486  usString& operator+=(unsigned short _value)
487  {
488  unsigned int len2 = strlen();
489 
490 
491  unsigned int totalsize = 1 + len2 + 1;
492 
493  unsigned short* result = new unsigned short[totalsize];
494  result[totalsize - 2] = _value;
495  result[totalsize - 1] = 0;
496  if (mString)
497  memcpy(result, mString, len2 * sizeof(unsigned short));
498 
499  if (mString)
500  delete[] mString;
501  mString = result;
502 
503  return *this;
504 
505  }
506 
507  inline unsigned int hexaCharacterToInt(unsigned short character)
508  {
509  unsigned int result = 0;
510  if ((character >= 0x30) && (character <= 0x39))
511  {
512  result = character - 0x30;
513  }
514  else if ((character >= 0x61) && (character <= 0x66))
515  {
516  result = character - 0x61 + 10;
517  }
518  else if ((character >= 0x41) && (character <= 0x46)) // manage upper character also ?
519  {
520  result = character - 0x61 + 10;
521  }
522  return result;
523  }
524 
525  usString& operator+=(unsigned short* _value)
526  {
527  unsigned int len1 = strlen(_value);
528  unsigned int len2 = strlen();
529 
530  unsigned int totalsize = len1 + len2 + 1;
531 
532  unsigned short* result = new unsigned short[totalsize];
533  memset(result, 0, totalsize * sizeof(unsigned short));
534  if (mString)
535  memcpy(result, mString, len2 * sizeof(unsigned short));
536  memcpy(result + len2, _value, len1 * sizeof(unsigned short));
537 
538  if (mString)
539  delete[] mString;
540  mString = result;
541  return *this;
542  }
543 
544  void removeEscapeBackslash();
545 
546 protected:
547 
548  inline void copy(const char* str)
549  {
550  if (mString)
551  {
552  delete[] mString;
553  }
554  unsigned int len = strlen(str);
555  mString = new unsigned short[len + 1];
556  unsigned char* read = (unsigned char*)str;
557  unsigned short* write = mString;
558  *write = *read;
559 
560  while (*read)
561  {
562  *++write = *++read;
563  }
564 
565  }
566 
567  inline void copy(const unsigned short* str)
568  {
569  // mString is always valid and allocated
570  if (mString)
571  delete[] mString;
572 
573  unsigned int len = strlen(str);
574  mString = new unsigned short[len + 1];
575  memcpy(mString, str, (len + 1) * sizeof(unsigned short));
576  }
577 
578  void copy(const UTF8Char* str);
579 
580 
581  unsigned short* mString;
582 };
583 
584 
585 inline usString operator+(const usString& _l, const usString& _r)
586 {
587  usString ret = _l;
588  ret += _r;
589 
590  return ret;
591 }
592 
593 static inline usString ToLowerCase(const usString& a_entry)
594 {
595  std::locale loc;
596  usString str;
597 
598  unsigned int al = a_entry.length();
599 
600  for (unsigned int i = 0; i < al; ++i)
601  {
602  if (a_entry[i] < 128)
603  {
604  str += std::tolower((char)a_entry[i], loc);
605  }
606  else
607  {
608  str += a_entry[i];
609  }
610  }
611  return str;
612 }
613 
614 #endif // _USSTRING_H
operator<
bool operator<(const DrawableSorterItem &Item1, const DrawableSorterItem &Item2)
overload < operator for comparison
Definition: DrawableSorter.h:30