PhoenixClockMock  2.0.0
Tool to manipulate mock of clock (split, merge and get info)
PString.cpp
Go to the documentation of this file.
1 /***************************************
2  Auteur : Pierre Aubert
3  Mail : pierre.aubert@lapp.in2p3.fr
4  Licence : CeCILL-C
5 ****************************************/
6 
7 
8 #include "PString.h"
9 
11 
14 PString phoenix_charToString(const char * ch){
15  if(ch != NULL){
16  PString str(ch);
17  return str;
18  }else{
19  return "";
20  }
21 }
22 
24 
28  return (ch >= 65 && ch <= 90);
29 }
30 
32 
36  return (ch >= 97 && ch <= 122);
37 }
38 
40 
43 bool phoenix_isCharNumber(char ch){
44  return (ch >= 48 && ch <= 57);
45 }
46 
48 
52 void eraseFirstLastChar(PVecString & vecOut, const PVecString & vecStr, const PString & vecChar){
53  for(PVecString::const_iterator it(vecStr.begin()); it != vecStr.end(); ++it){
54  vecOut.push_back(it->eraseFirstLastChar(vecChar));
55  }
56 }
57 
59 
63 PVecString eraseFirstLastChar(const PVecString & vecStr, const PString & vecChar){
64  PVecString vecOut;
65  eraseFirstLastChar(vecOut, vecStr, vecChar);
66  return vecOut;
67 }
68 
70 
74 bool findInVectorString(const PVecString & vecStr, const PString & str){
75  if(vecStr.size() == 0lu || str == ""){return false;}
76  bool isSearch(true);
77  PVecString::const_iterator it(vecStr.begin());
78  while(it != vecStr.end() && isSearch){
79  isSearch = *it != str;
80  ++it;
81  }
82  return !isSearch;
83 }
84 
87  :std::string("")
88 {
90 }
91 
93 
95 PString::PString(const char * str)
96  :std::string(str)
97 {
99 }
100 
102 
104 PString::PString(const std::string & str)
105  :std::string(str)
106 {
108 }
109 
111 
113 PString::PString(const PString & other)
114  :std::string()
115 {
116  copyPString(other);
117 }
118 
121 
122 }
123 
125 
129  copyPString(other);
130  return *this;
131 }
132 
134 
137 PString & PString::operator = (const std::string & other){
138  copyPString(other);
139  return *this;
140 }
141 
143 
147  return add(other);
148 }
149 
151 
154 PString & PString::operator += (const std::string & other){
155  return add(other);
156 }
157 
159 
163  return add(ch);
164 }
165 
167 
170 PString & PString::add(const PString & other){
171  concatenatePString(other);
172  return *this;
173 }
174 
176 
179 PString & PString::add(const std::string & other){
180  concatenatePString(other);
181  return *this;
182 }
183 
185 
189  std::string str;
190  str+= ch;
191  concatenatePString(str);
192  return *this;
193 }
194 
196 
199 PString & PString::add(const char * str){
201  return *this;
202 }
203 
205 
209 PString operator + (const PString & other1, const PString & other2){
210  PString res(other1);
211  res += other2;
212  return res;
213 }
214 
216 
220 size_t PString::findPatternIndex(const PString & pattern, size_t offset) const{
221  size_t sizePatern(pattern.size());
222  const PString & src = *this;
223  if(sizePatern == 0lu || src.size() < offset + sizePatern){return size();}
224 
225  size_t sizeSrc(src.size());
226  size_t beginTest(0lu), nbMatch(0lu);
227  for(size_t i(offset); i < sizeSrc; ++i){
228  if(src[i] == pattern[nbMatch]){ //si le caractère i est le même que le caractère nbMatch
229  if(nbMatch == 0lu){ //c'est le premier qu'on teste
230  beginTest = i; //il faut donc se rappeler où on a commencer à faire le teste
231  }
232  ++nbMatch; //la prochaîne fois on testera le caractère suivant
233  if(nbMatch == sizePatern){ //dans ce cas, on a tout testé et tout les caractères correspondent, donc on sauvegarde
234  return beginTest; //on a trouver le motif pattern, donc on le remplace par le motif replaceStr
235  }
236  }else{ //si le caractère i n'est pas le même caractère que nbMatch
237  if(nbMatch != 0lu){ //si on avais déjà tester des caractères avant
238  i = beginTest; //On revient là où l'on avait fait le premier test
239  }
240  beginTest = 0lu; //on remet le début des tests à 0 (pour évité les dépassements, on ne sait jamais)
241  nbMatch = 0lu; //on remet ne nombre des tests à 0, comme on n'a pas trouver de nouveau le motif
242  }
243  }
244  return sizeSrc;
245 }
246 
248 
252 PString PString::getBetweenDelimiter(const PString & beginPattern, const PString & endPattern) const{
253  size_t indexBeginPattern(findPatternIndex(beginPattern) + beginPattern.size());
254  size_t indexEndPattern(findPatternIndex(endPattern, indexBeginPattern));
255  if(indexBeginPattern != size() && indexEndPattern != size()){
256  return substr(indexBeginPattern, indexEndPattern - indexBeginPattern);
257  }else{
258  return "";
259  }
260 }
261 
263 
267 PString PString::replace(const PString & pattern, const PString & replaceStr) const{
268  size_t sizePatern(pattern.size());
269  const PString & src = *this;
270  if(sizePatern == 0lu || src.size() == 0lu) return *this;
271  PString out(""); //on évite les petits désagréments
272  size_t sizeSrc(src.size());
273  size_t beginTest(0lu), nbMatch(0lu);
274  for(size_t i(0lu); i < sizeSrc; ++i){
275  if(src[i] == pattern[nbMatch]){ //si le caractère i est le même que le caractère nbMatch
276  if(nbMatch == 0lu){ //c'est le premier qu'on teste
277  beginTest = i; //il faut donc se rappeler où on a commencer à faire le teste
278  }
279  ++nbMatch; //la prochaîne fois on testera le caractère suivant
280  if(nbMatch == sizePatern){ //dans ce cas, on a tout testé et tout les caractères correspondent, donc on sauvegarde
281  out += replaceStr; //on a trouver le motif pattern, donc on le remplace par le motif replaceStr
282  beginTest = 0lu; //on remet le début des tests à 0 (pour évité les dépassements, on ne sait jamais)
283  nbMatch = 0lu; //on remet ne nombre des tests à 0, comme on n'a pas trouver de nouveau le motif
284  }
285  }else{ //si le caractère i n'est pas le même caractère que nbMatch
286  if(nbMatch == 0lu){ //si on n'en avait pas trouver de bon avant
287  out += src[i]; //on ne change rien à ce caractère
288  }else{ //si on avais déjà tester des caractères avant
289  out += src[beginTest];
290  i = beginTest;
291  }
292  beginTest = 0lu; //on remet le début des tests à 0 (pour évité les dépassements, on ne sait jamais)
293  nbMatch = 0lu; //on remet ne nombre des tests à 0, comme on n'a pas trouver de nouveau le motif
294  }
295  }
296  //We are potentially at the end of the source, so no more test
297  return out;
298 }
299 
301 
306 PString PString::replace(const PString & pattern, const PString & replaceStr, size_t maxNbReplace) const{
307  size_t sizePatern(pattern.size());
308  const PString & src = *this;
309  if(sizePatern == 0lu || src.size() == 0lu || maxNbReplace == 0lu) return *this;
310  PString out(""); //on évite les petits désagréments
311  size_t sizeSrc(src.size());
312  size_t beginTest(0lu), nbMatch(0lu), nbReplace(0lu);
313  for(size_t i(0lu); i < sizeSrc; ++i){
314  if(src[i] == pattern[nbMatch] && nbReplace < maxNbReplace){ //si le caractère i est le même que le caractère nbMatch
315  if(nbMatch == 0lu){ //c'est le premier qu'on teste
316  beginTest = i; //il faut donc se rappeler où on a commencer à faire le teste
317  }
318  ++nbMatch; //la prochaîne fois on testera le caractère suivant
319  if(nbMatch == sizePatern){ //dans ce cas, on a tout testé et tout les caractères correspondent, donc on sauvegarde
320  out += replaceStr; //on a trouver le motif pattern, donc on le remplace par le motif replaceStr
321  beginTest = 0lu; //on remet le début des tests à 0 (pour évité les dépassements, on ne sait jamais)
322  nbMatch = 0lu; //on remet ne nombre des tests à 0, comme on n'a pas trouver de nouveau le motif
323  ++nbReplace;
324  }
325  }else{ //si le caractère i n'est pas le même caractère que nbMatch
326  if(nbMatch == 0lu){ //si on n'en avait pas trouver de bon avant
327  out += src[i]; //on ne change rien à ce caractère
328  }else{ //si on avais déjà tester des caractères avant
329  out += src[beginTest];
330  i = beginTest;
331  }
332  beginTest = 0lu; //on remet le début des tests à 0 (pour évité les dépassements, on ne sait jamais)
333  nbMatch = 0lu; //on remet ne nombre des tests à 0, comme on n'a pas trouver de nouveau le motif
334  }
335  }
336  //We are potentially at the end of the source, so no more test
337  return out;
338 }
339 
341 
345 PString PString::replaceChar(const PString & vecChar, const PString & replaceStr) const{
346  PString out;
347  for(PString::const_iterator it(begin()); it != end(); ++it){
348  if(vecChar.find(*it)){
349  out += replaceStr;
350  }else{
351  out += *it;
352  }
353  }
354  return out;
355 }
356 
358 
361 PString PString::format(const PString & arg) const{
362  return replace("{}", arg, 1lu);
363 }
364 
366 
369 bool PString::isSameBegining(const PString & beginStr) const{
370  const PString & src = *this;
371  if(src.size() < beginStr.size()) return false;
372  std::string::const_iterator it = src.begin();
373  std::string::const_iterator it2 = beginStr.begin();
374  while(it != src.end() && it2 != beginStr.end()){
375  if(*it != *it2){ return false;}
376  it++;
377  it2++;
378  }
379  return true;
380 }
381 
383 
386 size_t PString::count(char ch) const{
387  const PString & str(*this);
388  size_t nbChar(0lu);
389  std::string::const_iterator it(str.begin());
390  while(it != str.end()){
391  if(*it == ch) nbChar++;
392  it++;
393  }
394  return nbChar;
395 }
396 
398 
401 size_t PString::count(const PString & patern) const{
402  const PString & src = *this;
403  long unsigned int sizePatern(patern.size()), sizeSrc(src.size());
404  if(sizePatern == 0lu || sizeSrc == 0lu){return 0lu;}
405  size_t nbPaternFound(0lu);
406 
407  long unsigned int beginTest(0lu), nbMatch(0lu);
408  for(long unsigned int i(0lu); i < sizeSrc; ++i){
409  if(src[i] == patern[nbMatch]){ //si le caractère i est le même que le caractère nbMatch
410  if(nbMatch == 0lu){ //c'est le premier qu'on teste
411  beginTest = i; //il faut donc se rappeler où on a commencer à faire le teste
412  }
413  ++nbMatch; //la prochaîne fois on testera le caractère suivant
414  if(nbMatch == sizePatern){ //dans ce cas, on a tout testé et tout les caractères correspondent, donc on sauvegarde
415  ++nbPaternFound;
416  beginTest = 0lu; //on remet le début des tests à 0 (pour évité les dépassements, on ne sait jamais)
417  nbMatch = 0lu; //on remet ne nombre des tests à 0, comme on n'a pas trouver de nouveau le motif
418  }
419  }else{ //si le caractère i n'est pas le même caractère que nbMatch
420  if(nbMatch != 0lu){ //si on avais déjà tester des caractères avant
421  i = beginTest;
422  }
423  beginTest = 0lu; //on remet le début des tests à 0 (pour évité les dépassements, on ne sait jamais)
424  nbMatch = 0lu; //on remet ne nombre des tests à 0, comme on n'a pas trouver de nouveau le motif
425  }
426  }
427  return nbPaternFound;
428 }
429 
431 
434 bool PString::find(char ch) const{
435  PString::const_iterator it = begin();
436  while(it != end()){
437  if(*it == ch) return true;
438  ++it;
439  }
440  return false;
441 }
442 
444 
447 bool PString::find(const PString & listChar) const{
448  if(size() == 0lu || listChar.size() == 0lu){return false;}
449  bool foundChar = false;
450  long unsigned int i(0lu), size(listChar.size());
451  while(!foundChar && i < size){
452  foundChar = find(listChar[i]);
453  ++i;
454  }
455  return foundChar;
456 }
457 
459 
462 PString PString::keepChar(const PString & listChar) const{
463  if(listChar.size() == 0lu){return "";}
464  PString out;
465  for(PString::const_iterator it = begin(); it != end(); ++it){
466  if(listChar.find(*it)){
467  out += *it;
468  }
469  }
470  return out;
471 }
472 
474 
478  PString out("");
479  const PString & str1(*this);
480  PString::const_iterator it = str1.begin();
481  PString::const_iterator it2 = other.begin();
482  while(it != str1.end() && it2 != other.end()){
483  if(*it == *it2){
484  out += *it;
485  }else{
486  break;
487  }
488  it++;
489  it2++;
490  }
491  return out;
492 }
493 
495 
498 std::vector<PString> PString::split(char separator) const{
499  std::vector<PString> vec;
500  PString buffer = "";
501  for(PString::const_iterator it = begin(); it != end(); ++it){
502  if(*it != separator){
503  buffer += *it;
504  }else{
505  vec.push_back(buffer);
506  buffer = "";
507  }
508  }
509  if(buffer != ""){vec.push_back(buffer);}
510  return vec;
511 }
512 
514 
517 std::vector<PString> PString::split(const PString & vecSeparator) const{
518  std::vector<PString> vec;
519  if(size() != 0lu && vecSeparator.size() != 0lu){
520  PString buffer("");
521  for(PString::const_iterator it(begin()); it != end(); ++it){
522  if(!vecSeparator.find(*it)){
523  buffer += *it;
524  }else{
525  if(buffer != ""){
526  vec.push_back(buffer);
527  buffer = "";
528  }
529  }
530  }
531  if(buffer != "") vec.push_back(buffer);
532  }
533  return vec;
534 }
535 
536 
538 
542 PString & PString::merge(const std::vector<PString> & vecStr, const PString & separator){
543  PString out(""), comma("");;
544  for(std::vector<PString>::const_iterator it(vecStr.begin()); it != vecStr.end(); ++it){
545  out += comma + (*it);
546  comma = separator;
547  }
548  *this = out;
549  return *this;
550 }
551 
553 
557  PString buffer = "";
558  for(PString::const_iterator it = begin(); it != end(); it++){
559  if(*it != ch) buffer += *it;
560  }
561  return buffer;
562 }
563 
565 
568 PString PString::eraseChar(const PString & vecChar) const{
569  PString buffer(*this);
570  for(PString::const_iterator it = vecChar.begin(); it != vecChar.end(); it++){
571  buffer = buffer.eraseChar(*it);
572  }
573  return buffer;
574 }
575 
577 
580 PString PString::eraseFirstChar(const PString & vecChar) const{
581  PString buffer(*this);
582  bool continuer = true;
583  PString::iterator it = buffer.begin();
584  //Let's remove the first chars
585  while(it != buffer.end() && continuer){
586  if(vecChar.find(*it)){it = buffer.erase(it);}
587  else{
588  continuer = false;
589  it++;
590  }
591  }
592  return buffer;
593 }
594 
596 
599 PString PString::eraseLastChar(const PString & vecChar) const{
600  if(size() > 0lu){
601  size_t nbCharToRemove(0lu);
602  PString::const_reverse_iterator it(rbegin());
603  while(vecChar.find(*it)){
604  ++it;
605  ++nbCharToRemove;
606  }
607 
608  if(nbCharToRemove == 0lu){
609  return *this;
610  }else{
611  PString buffer(substr(0, size() - nbCharToRemove));
612  return buffer;
613  }
614  }else{
615  return *this;
616  }
617 }
618 
620 
624  PString buffer(eraseFirstChar(vecChar));
625  return buffer.eraseLastChar(vecChar);
626 }
627 
629 
631 bool PString::isUpperCase() const{
632  if(size() == 0lu){return false;}
633  const PString & str = *this;
634  bool isUpper(true);
635  size_t i(0lu);
636  while(i < str.size() && isUpper){
637  isUpper = phoenix_isCharUpperCase(str[i]);
638  ++i;
639  }
640  return isUpper;
641 }
642 
644 
646 bool PString::isLowerCase() const{
647  if(size() == 0lu){return false;}
648  const PString & str = *this;
649  bool isLower(true);
650  size_t i(0lu);
651  while(i < str.size() && isLower){
652  isLower = phoenix_isCharLowerCase(str[i]);
653  ++i;
654  }
655  return isLower;
656 }
657 
659 
661 bool PString::isNumber() const{
662  if(size() == 0lu){return false;}
663  const PString & str = *this;
664  bool isNumber(true);
665  size_t i(0lu);
666  while(i < str.size() && isNumber){
667  isNumber = phoenix_isCharNumber(str[i]);
668  ++i;
669  }
670  return isNumber;
671 }
672 
674 
677  if(size() == 0lu){return *this;}
678  const PString & str = *this;
679  std::string strOut("");
680  char currentChar;
681  long unsigned int size(str.size());
682  for(long unsigned int i(0lu); i < size; ++i){
683  currentChar = str[i];
684  if(phoenix_isCharUpperCase(currentChar)){
685  strOut += currentChar + (char)32;
686  }else{
687  strOut += currentChar;
688  }
689  }
690  return strOut;
691 }
692 
694 
697  if(size() == 0lu){return *this;}
698  const PString & str = *this;
699  std::string strOut("");
700  char currentChar;
701  long unsigned int size(str.size());
702  for(long unsigned int i(0lu); i < size; ++i){
703  currentChar = str[i];
704  if(phoenix_isCharUpperCase(currentChar)){
705  strOut += currentChar + (char)32;
706  }else{
707  if(currentChar == ' '){strOut += '_';}
708  else{strOut += currentChar;}
709  }
710  }
711  return strOut;
712 }
713 
715 
718  if(size() == 0lu){return *this;}
719  const PString & str = *this;
720  std::string strOut("");
721  char currentChar;
722  long unsigned int size(str.size());
723  for(long unsigned int i(0); i < size; ++i){
724  currentChar = str[i];
725  if(phoenix_isCharLowerCase(currentChar)){
726  strOut += currentChar - (char)32;
727  }else{
728  strOut += currentChar;
729  }
730  }
731  return strOut;
732 }
733 
735 
738  if(size() == 0lu){return *this;}
739  const PString & str = *this;
740  std::string strOut(str);
741  char currentChar = strOut[0lu];
742  if(phoenix_isCharUpperCase(currentChar)){
743  strOut[0lu] = currentChar + (char)32;
744  }
745  return strOut;
746 }
747 
749 
752  if(size() == 0lu){return *this;}
753  const PString & str = *this;
754  std::string strOut(str);
755  char currentChar = strOut[0lu];
756  if(phoenix_isCharLowerCase(currentChar)){
757  strOut[0lu] = currentChar - (char)32;
758  }
759  return strOut;
760 }
761 
763 
767 PString PString::escapeStr(const PString & strCharToEscape, const PString & escapeSeq) const{
768  if(size() == 0lu || strCharToEscape.size() == 0lu || escapeSeq.size() == 0lu){return *this;}
769  const PString & src = *this;
770  std::string out("");
771  for(size_t i(0lu); i < src.size(); ++i){
772  char ch = src[i];
773  if(strCharToEscape.find(ch)){
774  out += escapeSeq;
775  }
776  out += ch;
777  }
778  return out;
779 }
780 
782 
784 void PString::copyPString(const PString & other){
785  resize(other.size());
786  memcpy((char*)data(), other.data(), other.size());
787 }
788 
790 
792 void PString::copyPString(const std::string & other){
793  resize(other.size());
794  memcpy((char*)data(), other.data(), other.size());
795 }
796 
798 
801  std::string tmp(*this);
802  resize(tmp.size() + other.size());
803  memcpy((char*)data(), tmp.data(), tmp.size());
804  memcpy((char*)data() + tmp.size(), other.data(), other.size());
805 }
806 
808 
810 void PString::concatenatePString(const std::string & other){
811  std::string tmp(*this);
812  resize(tmp.size() + other.size());
813  memcpy((char*)data(), tmp.data(), tmp.size());
814  memcpy((char*)data() + tmp.size(), other.data(), other.size());
815 }
816 
819 
820 }
821 
822 
823 
824 
825 
bool phoenix_isCharNumber(char ch)
Tels if the character is a number or not.
Definition: PString.cpp:43
PString phoenix_charToString(const char *ch)
Convert a char pointer into a string (event if the char pointer is NULL)
Definition: PString.cpp:14
bool findInVectorString(const PVecString &vecStr, const PString &str)
Find a string in a vector of string.
Definition: PString.cpp:74
void eraseFirstLastChar(PVecString &vecOut, const PVecString &vecStr, const PString &vecChar)
Erase first and last characters of all PString in given vector.
Definition: PString.cpp:52
bool phoenix_isCharUpperCase(char ch)
Tels if the character is upper case letter.
Definition: PString.cpp:27
bool phoenix_isCharLowerCase(char ch)
Tels if the character is lower case letter.
Definition: PString.cpp:35
PString operator+(const PString &other1, const PString &other2)
Concatenate 2 PString together.
Definition: PString.cpp:209
std::vector< PString > PVecString
Definition: PString.h:99
Extends the std::string.
Definition: PString.h:16
PString & operator=(const PString &other)
Definition of equal operator of PString.
Definition: PString.cpp:128
PString & add(const PString &other)
Add a PString to an other.
Definition: PString.cpp:170
bool isLowerCase() const
Say if the given PString is in lowercase.
Definition: PString.cpp:646
PString toLowerUnderscore() const
Convert std::string in lower case and space in '_'.
Definition: PString.cpp:696
PString getCommonBegining(const PString &other) const
Get the common begining between the current PString and other.
Definition: PString.cpp:477
size_t findPatternIndex(const PString &pattern, size_t offset=0lu) const
Get the index of the first character of the given pattern.
Definition: PString.cpp:220
virtual ~PString()
Destructeur of PString.
Definition: PString.cpp:120
PString replace(const PString &pattern, const PString &replaceStr) const
Replace a PString into an other PString.
Definition: PString.cpp:267
PString eraseChar(char ch) const
Erase char ch of current string.
Definition: PString.cpp:556
PString keepChar(const PString &listChar) const
Keep only the characters in the given listChar.
Definition: PString.cpp:462
PString format(const PString &arg) const
Replace first {} with arg.
Definition: PString.cpp:361
std::vector< PString > split(char separator) const
Cut a PString on the given separator char.
Definition: PString.cpp:498
PString toLower() const
Convert PString in lower case.
Definition: PString.cpp:676
PString toUpper() const
Convert std::string in upper case.
Definition: PString.cpp:717
PString replaceChar(const PString &vecChar, const PString &replaceStr) const
Replace characters in vecChar by replaceStr.
Definition: PString.cpp:345
bool find(char ch) const
Find a char in a string.
Definition: PString.cpp:434
PString firstToLower() const
Convert first letter of the PString in lower case.
Definition: PString.cpp:737
PString escapeStr(const PString &strCharToEscape, const PString &escapeSeq) const
Escape given string with passed characters.
Definition: PString.cpp:767
PString & operator+=(const PString &other)
Add a PString to an other.
Definition: PString.cpp:146
bool isNumber() const
Say if the given PString is composed of numbers.
Definition: PString.cpp:661
bool isSameBegining(const PString &beginStr) const
Say if the current PString has the same begining of beginStr.
Definition: PString.cpp:369
size_t count(char ch) const
Count the number of char ch in the current PString.
Definition: PString.cpp:386
PString & merge(const std::vector< PString > &vecStr, const PString &separator="")
Merge a set of PString.
Definition: PString.cpp:542
PString eraseFirstLastChar(const PString &vecChar) const
Erase first and last char in a string.
Definition: PString.cpp:623
void copyPString(const PString &other)
Copy function of PString.
Definition: PString.cpp:784
void concatenatePString(const PString &other)
Concatenate a PString into the current PString.
Definition: PString.cpp:800
PString eraseFirstChar(const PString &vecChar) const
Erase first char in a string.
Definition: PString.cpp:580
PString getBetweenDelimiter(const PString &beginPattern, const PString &endPattern) const
Get the PString between delimiter.
Definition: PString.cpp:252
PString()
Default constructor of PString.
Definition: PString.cpp:86
bool isUpperCase() const
Say if the given PString is in uppercase.
Definition: PString.cpp:631
void initialisationPString()
Initialisation function of the class PString.
Definition: PString.cpp:818
PString firstToUpper() const
Convert first letter of the PString in upper case.
Definition: PString.cpp:751
PString eraseLastChar(const PString &vecChar) const
Erase first and last char in a string.
Definition: PString.cpp:599