1 #include <StringHelper.hpp>
3 #include <BadAllocException.hpp>
4 #include <NullPointerException.hpp>
5 #include <InvalidArgumentException.hpp>
6 #include <OutOfBoundsException.hpp>
9 #define BUFF_MAX ((size_t)260)
13 // namespace SimGrid::Msg
19 #define DEFAULT_STRING_HELPER_CAPACITY ((int)128)
22 void StringHelper::init(void)
24 capacity = DEFAULT_STRING_HELPER_CAPACITY;
26 if(!(content = (char*) calloc(capacity + 1, sizeof(char))))
27 throw BadAllocException();
32 // Default constructor
33 StringHelper::StringHelper()
38 StringHelper::StringHelper(char c)
45 StringHelper::StringHelper(char c, int n)
51 StringHelper::StringHelper(const char* cstr)
57 StringHelper::StringHelper(const char* cstr, int n)
63 StringHelper::StringHelper(const char* cstr, int pos, int n)
69 StringHelper::StringHelper(const string& rstr)
75 StringHelper::StringHelper(const string& rstr, int n)
81 StringHelper::StringHelper(const string& rstr, int pos, int n)
87 StringHelper::StringHelper(short si)
93 StringHelper::StringHelper(int i)
99 StringHelper::StringHelper(long l)
105 StringHelper::StringHelper(float f)
111 StringHelper::StringHelper(double d)
117 StringHelper::StringHelper(double d, const char* format)
119 char toAppend[BUFF_MAX + 1] = {0};
121 sprintf(toAppend,format,d);
128 StringHelper::StringHelper(unsigned short usi)
134 StringHelper::StringHelper(unsigned int ui)
140 StringHelper::StringHelper(unsigned long ul)
147 StringHelper::StringHelper(const StringHelper& rStringHelper)
149 if(this != &rStringHelper && rStringHelper.size())
152 append(rStringHelper.cstr());
157 StringHelper::~StringHelper()
165 void StringHelper::clear(void)
168 memset(content, 0, len);
173 bool StringHelper::empty(void)
178 StringHelper& StringHelper::append(unsigned char c)
180 if(capacity < len + 1)
182 int new_capacity = (capacity << 1) ;
184 if(!(content = (char*) realloc(content, new_capacity)))
185 throw BadAllocException();
187 capacity = new_capacity;
199 StringHelper& StringHelper::append(unsigned char c, int n)
202 throw InvalidArgumentException("n");
204 char* toAppend = (char*) calloc(n + 1, sizeof(char));
207 throw BadAllocException();
209 memset(toAppend, c, n);
219 StringHelper& StringHelper::append(char c)
221 if(capacity < len + 1)
223 int new_capacity = (capacity << 1) ;
225 if(!(content = (char*) realloc(content, new_capacity)))
226 throw BadAllocException();
228 capacity = new_capacity;
240 StringHelper& StringHelper::append(char c, int n)
243 throw InvalidArgumentException("n");
245 char* toAppend = (char*) calloc(n + 1, sizeof(char));
248 throw BadAllocException();
250 memset(toAppend, c, n);
259 StringHelper& StringHelper::append(const char* cstr)
262 throw NullPointerException("cstr");
264 int l = (int) strlen(cstr);
266 if(capacity < len + l)
268 int new_capacity = (capacity << 1) < (len + l) ? (len + l) << 1 : capacity << 1;
270 if(!(content = (char*) realloc(content, new_capacity)))
271 throw BadAllocException();
273 strcat(content, cstr);
275 capacity = new_capacity;
279 strcat(content, cstr);
289 StringHelper& StringHelper::append(const char* cstr, int n)
292 throw NullPointerException("cstr");
295 throw InvalidArgumentException("n");
298 int l = ((int) strlen(cstr)) * n;
300 if(capacity < len + l)
302 int new_capacity = (capacity << 1) < (len + l) ? (len + l) << 1 : capacity << 1;
304 if(!(content = (char*) realloc(content, new_capacity)))
305 throw BadAllocException();
307 for(int i = 0; i < n; i++)
308 strcat(content, cstr);
310 capacity = new_capacity;
314 for(int i = 0; i < n; i++)
315 strcat(content, cstr);
325 StringHelper& StringHelper::append(const char* cstr, int pos, int n)
328 throw NullPointerException("cstr");
331 throw InvalidArgumentException("n");
333 if(pos < 0 || pos >= (int)strlen(cstr) )
334 throw OutOfBoundsException(pos);
336 if(pos + n >= (int)strlen(cstr))
337 throw OutOfBoundsException(pos, n);
340 char* toAppend = (char*) calloc(n + 1, sizeof(char));
342 strncpy(toAppend, cstr + pos, n);
351 StringHelper& StringHelper::append(const string& rstr)
353 append(rstr.c_str());
357 StringHelper& StringHelper::append(const string& rstr, int n)
360 throw NullPointerException("rstr");
363 throw InvalidArgumentException("n");
366 int l = ((int) rstr.size()) * n;
368 if(capacity < len + l)
370 int new_capacity = (capacity << 1) < (len + l) ? (len + l) << 1 : capacity << 1;
372 if(!(content = (char*) realloc(content, new_capacity)))
373 throw BadAllocException();
375 for(int i = 0; i < n; i++)
376 strcat(content, rstr.c_str());
378 capacity = new_capacity;
382 for(int i = 0; i < n; i++)
383 strcat(content, rstr.c_str());
392 StringHelper& StringHelper::append(const string& rstr, int pos, int n)
395 throw InvalidArgumentException("rstr");
398 throw InvalidArgumentException("n");
400 if(pos < 0 || pos >= (int) rstr.size() )
401 throw OutOfBoundsException(pos);
403 if(pos + n >= (int) rstr.size())
404 throw OutOfBoundsException(pos, n);
407 char* toAppend = (char*) calloc(n + 1, sizeof(char));
409 strncpy(toAppend, rstr.c_str() + pos, n);
418 StringHelper& StringHelper::append(short si)
420 char toAppend[26] = {0};
422 sprintf(toAppend, "%hd",si);
429 StringHelper& StringHelper::append(int i)
431 char toAppend[26] = {0};
433 sprintf(toAppend, "%d",i);
440 StringHelper& StringHelper::append(long l)
442 char toAppend[26] = {0};
444 sprintf(toAppend, "%ld",l);
451 StringHelper& StringHelper::append(float f)
453 char toAppend[26] = {0};
455 sprintf(toAppend, "%f",f);
462 StringHelper& StringHelper::append(double d)
464 char toAppend[26] = {0};
466 sprintf(toAppend, "%#7lf",d);
473 StringHelper& StringHelper::append(double d, const char* format)
475 char toAppend[BUFF_MAX + 1] = {0};
477 sprintf(toAppend, format, d);
484 StringHelper& StringHelper::append(unsigned short usi)
486 char toAppend[26] = {0};
488 sprintf(toAppend, "%hu",usi);
495 StringHelper& StringHelper::append(unsigned int ui)
497 char toAppend[26] = {0};
499 sprintf(toAppend, "%u",ui);
506 StringHelper& StringHelper::append(unsigned long ul)
508 char toAppend[26] = {0};
510 sprintf(toAppend, "%lu",ul);
517 const char& StringHelper::at(int pos) const
519 if(pos < 0 || pos >= len)
520 throw OutOfBoundsException(pos);
525 char& StringHelper::at(int pos)
527 if(pos < 0 || pos >= len)
528 throw OutOfBoundsException(pos);
533 const char* StringHelper::cstr(void) const
535 return (const char*)content;
538 string& StringHelper::toString(void)
540 string* s = new string();
545 int StringHelper::size(void) const
553 StringHelper& StringHelper::operator = (const StringHelper& rStringHelper)
556 if(this !=&rStringHelper && rStringHelper.size())
559 append(rStringHelper.cstr());
565 StringHelper& StringHelper::operator = (const char* cstr)
572 StringHelper& StringHelper::operator = (const string& str)
579 StringHelper& StringHelper::operator = (short n)
586 StringHelper& StringHelper::operator = (int n)
593 StringHelper& StringHelper::operator = (long n)
600 StringHelper& StringHelper::operator = (float n)
607 StringHelper& StringHelper::operator = (double n)
614 StringHelper& StringHelper::operator = (unsigned short n)
621 StringHelper& StringHelper::operator = (unsigned int n)
628 StringHelper& StringHelper::operator = (unsigned long n)
635 char& StringHelper::operator[](int pos)
637 if(pos < 0 || pos >= len)
638 throw OutOfBoundsException(pos);
643 char StringHelper::operator[](int pos) const
645 if(pos < 0 || pos >= len)
646 throw OutOfBoundsException(pos);
651 StringHelper& StringHelper::operator += (short n)
657 StringHelper& StringHelper::operator += (int n)
663 StringHelper& StringHelper::operator += (long n)
669 StringHelper& StringHelper::operator += (float n)
675 StringHelper& StringHelper::operator += (double n)
681 StringHelper& StringHelper::operator += (unsigned short n)
687 StringHelper& StringHelper::operator += (unsigned int n)
693 StringHelper& StringHelper::operator += (unsigned long n)
699 StringHelper& StringHelper::operator += (const StringHelper& rStringHelper)
701 append(rStringHelper.content);
705 StringHelper& StringHelper::operator += (const string& rstr)
707 append(rstr.c_str());
711 StringHelper& StringHelper::operator += (const char* cstr)
717 StringHelper& StringHelper::operator += (char c)
723 StringHelper& StringHelper::operator + (short n)
729 StringHelper& StringHelper::operator + (int n)
735 StringHelper& StringHelper::operator + (long n)
741 StringHelper& StringHelper::operator + (float n)
747 StringHelper& StringHelper::operator + (double n)
753 StringHelper& StringHelper::operator + (unsigned short n)
759 StringHelper& StringHelper::operator + (unsigned int n)
765 StringHelper& StringHelper::operator + (unsigned long n)
772 StringHelper& StringHelper::operator + (const StringHelper& rStringHelper)
774 append(rStringHelper.content);
778 StringHelper& StringHelper::operator + (const string& rstr)
780 append(rstr.c_str());
784 StringHelper& StringHelper::operator + (const char* cstr)
790 StringHelper& StringHelper::operator + (char c)
796 StringHelper::operator char *()
801 StringHelper::operator const char *()
806 ostream& operator<<(ostream& stream, const StringHelper& s)
812 istream& operator<<(istream& stream, StringHelper& s)
814 char buff[256] = {0};
824 } // namespace SimGrid