Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Created by: PiMaster
- Member Functions:
- inline char* c_str() - return the data of the string as a c string
- inline const char* c_str() const - return the data of the string as a const c string
- clear() - clear the contents of the string (no return)
- insert(const char c,const unsigned pos) - inserts a character at pos (returns new length)
- insert(const char* str,const unsigned pos) - inserts a c-string at pos (returns new length)
- insert(const string& str,const unsigned pos) - inserts a string at pos (returns new length)
- count(const char c) - returns the number of occurrences of c
- count(const char* str) - returns the number of occurrences of str
- count(const string& str) - returns the number of occurrences of str
- replace(const char* str1,const char* str2) - replace all occurrences of str1 with str2 (returns number of occurrences)
- replace(const string& str1,const char* str2) - replace all occurrences of str1 with str2 (returns number of occurrences)
- replace(const char* str1,const string& str2) - replace all occurrences of str1 with str2 (returns number of occurrences)
- replace(const string& str1,const string& str2) - replace all occurrences of str1 with str2 (returns number of occurrences)
- erase(const int start,const int end) - erase data between start and end (returns new length)
- find(const char c) - returns the position of the first occurrence of c
- find(const char* str) - returns the position of the first occurrence of str
- find(const string& str) - returns the position of the first occurrence of str
- rfind(const char c) - returns the position of the last occurrence of c
- rfind(const char* str) - returns the position of the last occurrence of str
- rfind(const string& str) - returns the position of the first occurrence of str
- reserve(const int newsize) - request a new maximum size for the string (returns new size)
- NOTE: If newsize is less than the current size, the reallocation will NOT happen
- upper() - make all letters in the string uppercase (no return)
- lower() - make all letters in the string lowercase (no return)
- length() - returns the length of the string
- maxsize() - returns the maximum size of the string (size of the buffer)
- end() - returns the index of the last character (not including terminating NULL)
- Member Operators:
- inline operator char*() - converts the string to a c string
- inline operator const char*() - converts the string to a const c string
- inline char& operator[](const int x) - returns the character at index x
- inline const char& operator[](const int x) const - returns the const character at index x
- string& operator=(const char c) - sets the string equal to c (NULL terminated) (returns the string)
- string& operator=(const char* str) - sets the string equal to str (returns the string)
- string& operator=(const string& str) - sets the string equal to str (returns the string)
- string& operator+=(const char c) - appends c to the string (returns the string)
- string& operator+=(const char* str) - appends str to the string (returns the string)
- string& operator+=(cosnt string& str) - appends str to the string (returns the string)
- Global Operators:
- bool operator==(const string& str1,const string& str2) - returns if str1 is equal to str2
- bool operator==(const string& str1,const char* str2) - returns if str1 is equal to str2
- bool operator==(const char* str1,const string& str2) - returns if str1 is equal to str2
- bool operator!=(const string& str1,const string& str2) - returns if str1 is not equal to str2
- bool operator!=(const string& str1,const char* str2) - returns if str1 is not equal to str2
- bool operator!=(const char* str1,const string& str2) - returns if str1 is not equal to str2
- */
- #pragma once
- #ifndef PISTRING
- #define PISTRING
- #include <windows.h>
- struct string{
- protected:
- //data
- char* data;
- unsigned datasize,datalen;
- //friends
- friend bool operator==(const string&,const string&);
- friend bool operator==(const string&,const char*);
- friend bool operator==(const char*,const string&);
- public:
- string(){
- data=NULL;
- datasize=0;
- datalen=0;}
- string(const char* str){
- unsigned s=strlen(str);
- data=new char[s+33];
- memcpy(data,str,s+1);
- datasize=s+33;
- datalen=s;}
- string(const string& str){
- data=new char[str.datasize];
- memcpy(data,str.data,str.datasize);
- datasize=str.datasize;
- datalen=str.datalen;}
- ~string(){
- delete[] data;}
- inline operator char*(){
- return data;}
- inline operator const char*() const{
- return data;}
- inline char* c_str(){
- return data;}
- inline const char* c_str() const{
- return data;}
- inline char& operator[](const int x){
- return data[x];}
- inline const char& operator[](const int x) const{
- return data[x];}
- string& operator=(const char c){
- delete[] data;
- data=new char[34];
- data[0]=c;
- data[1]=0;
- datasize=34;
- datalen=1;
- return *this;}
- string& operator=(const char* str){
- delete[] data;
- unsigned s=strlen(str);
- data=new char[s+33];
- memcpy(data,str,s+1);
- datasize=s+32;
- datalen=s;
- return *this;}
- string& operator=(const string& str){
- delete[] data;
- data=new char[str.datasize];
- memcpy(data,str.data,str.datasize);
- datasize=str.datasize;
- datalen=str.datalen;
- return *this;}
- string& operator+=(const char c){
- if(datalen+2<datasize){
- data[datalen]=c;
- data[datalen+1]=0;
- ++datalen;}
- else{
- char* tmp=new char[datasize+33];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- data[datalen]=c;
- data[datalen+1]=0;
- datasize+=33;
- ++datalen;}
- return *this;}
- string& operator+=(const char* str){
- unsigned s=strlen(str);
- if(datalen+s<datasize){
- memcpy(data+datalen,str,s);
- datalen+=s;}
- else{
- char* tmp=new char[datasize+s<<1];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- memcpy(data+datalen,str,s);
- datasize+=s<<1;
- datalen+=s;}
- return *this;}
- string& operator+=(const string& str){
- if(datalen+str.datalen<datasize){
- memcpy(data+datalen,str.data,str.datalen);
- datalen+=str.datalen;}
- else{
- char* tmp=new char[datasize+str.datalen<<1];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- memcpy(data+datalen,str.data,str.datalen);
- datasize+=str.datalen<<1;
- datalen+=str.datalen;}
- return *this;}
- void clear(){
- delete[] data;
- data=new char[32];
- data[0]=0;
- datasize=32;
- datalen=0;}
- int insert(const char c,const unsigned pos){
- if(datalen+2<datasize){
- memmove(data+pos+1,data+pos,datalen-pos);
- data[pos]=c;
- ++datalen;}
- else{
- char* tmp=new char[datasize+32];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- memmove(data+pos+1,data+pos,datalen-pos);
- data[pos]=c;
- datasize+=32;
- ++datalen;}
- return datalen}
- int insert(const char* str,const unsigned pos){
- unsigned s=strlen(str);
- if(datalen+s<datasize){
- memmove(data+pos+s,data+pos,datalen-pos);
- memcpy(data+pos,str,s);
- datalen+=s;}
- else{
- char* tmp=new char[datasize+s<<1];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- memmove(data+pos+s,data+pos,datalen-pos);
- memcpy(data+pos,str,s);
- datasize+=s<<1;
- datalen+=s;}
- return datalen}
- int insert(const string& str,const unsigned pos){
- if(datalen+pos+str.datalen<datasize){
- memmove(data+pos+str.datalen,data+pos,datalen-pos);
- memcpy(data+pos,str.data,str.datalen);
- datalen+=str.datalen;}
- else{
- char* tmp=new char[datasize+str.datalen<<1];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- memmove(data+pos+str.datalen,data+pos,datalen-pos);
- memcpy(data+pos,str.data,str.datalen);
- datasize+=str.datalen<<1;
- datalen+=str.datalen;}
- return datalen;}
- int count(const char c) const{
- char* p=data;
- int n=0;
- while(*p!=0){
- if(*p==c){
- ++n;}
- ++p;}
- return n;}
- int count(const char* str) const{
- int size=strlen(str);
- int x,n=0;
- char* p=data;
- while(*p!=0){
- for(x=0;x<size && *p!=0;++x,++p){
- if(*p!=str[x]){
- break;}}
- if(x==size){
- ++n;}
- else{
- ++p;}}
- return n;}
- int count(const string& str) const{
- int x,n=0;
- char* p=data;
- while(*p!=0){
- for(x=0;x<str.datalen && *p!=0;++x,++p){
- if(*p!=str[x]){
- break;}}
- if(x==str.datalen){
- ++n;}
- else{
- ++p;}}
- return n;}
- int replace(const char* str1,const char* str2,int num=2147483647){
- int size1=strlen(str1);
- int size2=strlen(str2);
- //adjust size if it causes overflow
- int n=count(str1);
- if(datalen+(size2-size1)*n>=datasize){
- int len=datalen+((size2-size1)*n)<<1;
- char* tmp=new char[len];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- datasize=len;
- datalen+=size2-size1;}
- int x;
- n=0;
- char* p=data;
- while(*p!=0 && n<num){
- for(x=0;x<size1 && *p!=0;++x,++p){
- if(*p!=str1[x]){
- break;}}
- if(x==size1){
- memmove(p+size2-size1,p,size2-size1);
- memcpy(p-size1,str2,size2);
- ++n;}
- else{
- ++p;}}
- return n;}
- int replace(const string& str1,const char* str2,int num=2147483647){
- int size2=strlen(str2);
- //adjust size if it causes overflow
- int n=count(str1);
- if(datalen+(size2-str1.datalen)*n>=datasize){
- int len=datalen+((size2-str1.datalen)*n)<<1;
- char* tmp=new char[len];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- datasize=len;
- datalen+=(size2-str1.datalen)<<2;}
- int x;
- n=0;
- char* p=data;
- while(*p!=0 && n<num){
- for(x=0;x<str1.datalen && *p!=0;++x,++p){
- if(*p!=str1[x]){
- break;}}
- if(x==str1.datalen){
- memmove(p+size2-str1.datalen,p,size2-str1.datalen);
- memcpy(p-str1.datalen,str2,size2);
- ++n;}
- else{
- ++p;}}
- return n;}
- int replace(const char* str1,const string& str2,int num=2147483647){
- int size1=strlen(str1);
- //adjust size if it causes overflow
- int n=count(str1);
- if(datalen+(str2.datalen-size1)*n>=datasize){
- int len=datalen+((str2.datalen-size1)*n)<<1;
- char* tmp=new char[len];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- datasize=len;
- datalen+=(str2.datalen-size1)<<2;}
- int x;
- n=0;
- char* p=data;
- while(*p!=0 && n<num){
- for(x=0;x<size1 && *p!=0;++x,++p){
- if(*p!=str1[x]){
- break;}}
- if(x==size1){
- memmove(p+str2.datalen-size1,p,str2.datalen-size1);
- memcpy(p-size1,str2,str2.datalen);
- ++n;}
- else{
- ++p;}}
- return n;}
- int replace(const string& str1,const string& str2,int num=2147483647){
- //adjust size if it causes overflow
- int n=count(str1);
- if(datalen+(str2.datalen-str1.datalen)*n>=datasize){
- int len=datalen+((str2.datalen-str1.datalen)*n)<<1;
- char* tmp=new char[len];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- datasize=len;
- datalen+=(str2.datalen-str1.datalen)<<2;}
- int x;
- n=0;
- char* p=data;
- while(*p!=0 && n<num){
- for(x=0;x<str1.datalen && *p!=0;++x,++p){
- if(*p!=str1[x]){
- break;}}
- if(x==str1.datalen){
- memmove(p+str2.datalen-str1.datalen,p,str2.datalen-str1.datalen);
- memcpy(p-str1.datalen,str2,str2.datalen);
- ++n;}
- else{
- ++p;}}
- return n;}
- int erase(const int start,const int end){
- memmove(data+start,data+end,datalen-end+1);
- datalen-=end-start;
- return datalen;}
- int find(const char c) const{
- int x;
- for(x=0;x<datalen && x!=c;++x){}
- if(x==datalen){
- return -1;}
- return x;}
- int find(const char* str) const{
- int x,num;
- unsigned s=strlen(str);
- for(x=0;x<datalen;++x){
- if(data[x]==str[0]){
- for(num=0;num<s;++num){
- if(data[x+num]!=str[num]){
- break;}}
- if(num==s){
- return x;}}}
- return -1;}
- int find(const string& str) const{
- int x,num;
- for(x=0;x<datalen;++x){
- if(data[x]==str[0]){
- for(num=0;num<str.datalen;++num){
- if(data[x+num]!=str[num]){
- break;}}
- if(num==str.datalen){
- return x;}}}
- return -1;}
- int rfind(const char c) const{
- int x;
- for(x=datalen;x>=0 && x!=c;--x){}
- if(x==0){
- return -1;}
- return x;}
- int rfind(const char* str) const{
- int x,num;
- unsigned s=strlen(str);
- for(x=datalen;x>=0;--x){
- if(data[x]==str[0]){
- for(num=0;num<s;++num){
- if(data[x+num]!=str[num]){
- break;}}
- if(num==s){
- return x;}}}
- return -1;}
- int rfind(const string& str) const{
- int x,num;
- for(x=datalen;x>=0;--x){
- if(data[x]==str[0]){
- for(num=0;num<str.datalen;++num){
- if(data[x+num]!=str[num]){
- break;}}
- if(num==str.datalen){
- return x;}}}
- return -1;}
- int reserve(const int newsize){
- int size=(newsize>datasize?newsize:datasize);
- char* tmp=new char[size];
- memcpy(tmp,data,datasize);
- delete[] data;
- data=tmp;
- datasize=size;
- return size;}
- void upper(){
- char* p=data;
- while(*p!=0){
- if(*p>96 && *p<123){
- *p-=32;}
- ++p;}}
- void lower(){
- char* p=data;
- while(*p!=0){
- if(*p>64 && *p<91){
- *p+=32;}
- ++p;}}
- unsigned length() const{
- return datalen;}
- unsigned maxsize() const{
- return datasize-1;}
- int end() const{
- return datalen;}};
- //global operators
- bool operator==(const string& str1,const string& str2){
- if(str1.datalen!=str2.datalen){
- return false;}
- char* tmp1=str1.data;
- char* tmp2=str2.data;
- while(*tmp1!=0){
- if(*tmp1!=*tmp2){
- return false;}
- ++tmp1;
- ++tmp2;}
- return true;}
- bool operator==(const string& str1,const char* str2){
- unsigned size=strlen(str2);
- if(str1.datalen!=size){
- return false;}
- char* tmp=str1.data;
- while(*tmp!=0){
- if(*tmp!=*str2){
- return false;}
- ++tmp;
- ++str2;}
- return true;}
- bool operator==(const char* str1,const string& str2){
- unsigned size=strlen(str1);
- if(str2.datalen!=size){
- return false;}
- char* tmp=str2.data;
- while(*tmp!=0){
- if(*tmp!=*str1){
- return false;}
- ++tmp;
- ++str1;}
- return true;}
- bool operator!=(const string& str1,const string& str2){
- return !(str1==str2);}
- bool operator!=(const string& str1,const char* str2){
- return !(str1==str2);}
- bool operator!=(const char* str1,const string& str2){
- return !(str1==str2);}
- #endif
Advertisement
Add Comment
Please, Sign In to add comment