Compare commits
	
		
			3 commits
		
	
	
		
			66cefdfd63
			...
			2da7623dd3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 2da7623dd3 | ||
|  | ec50d811ff | ||
|  | d73bcb8c03 | 
					 5 changed files with 286 additions and 194 deletions
				
			
		|  | @ -1,16 +1,18 @@ | ||||||
| #include <iostream> | #include <iostream> | ||||||
| #include "miptstring.cpp" | #include "miptstring.h" | ||||||
| #include "miptstringview.cpp" | #include "miptstringview.h" | ||||||
| 
 |  | ||||||
| using namespace std; | using namespace std; | ||||||
| 
 | 
 | ||||||
| int main() { | int main() { | ||||||
|         mipt::String str = "Meow!!"; |     mipt::String a = "abcd"; | ||||||
|         cout << str << endl; |     mipt::String b = "abce"; | ||||||
|         mipt::StringView sv = str; |     mipt::StringView av = a; | ||||||
|         cout << "string view: " << sv << endl;  |     mipt::StringView bv = b; | ||||||
|         char a[] = "nyaa!"; |     //cout << (b < a) << endl;
 | ||||||
|         mipt::StringView sv1 = a; |     //cout << (bv < av) << endl;
 | ||||||
|        cout << "string view: " << sv1 << endl;  |     cout << av.substr(1,10) << endl;  | ||||||
|        cout << sv1.at(200) << endl; |     av.remove_suffix(2); | ||||||
|  |     cout << av << endl; | ||||||
|  |     mipt::String meow = av; | ||||||
|  |     cout << "sv to string: " << meow << endl; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include <iostream> | #include <iostream> | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <cstdlib> | #include <cstdlib> | ||||||
| #include <cstring> | #include <cstring> | ||||||
|  | #include "miptstring.h" | ||||||
|  | #include "miptstringview.h" | ||||||
| using std::cout, std::cin, std::endl, std::size_t; | using std::cout, std::cin, std::endl, std::size_t; | ||||||
| 
 | 
 | ||||||
| namespace mipt{ | namespace mipt{ | ||||||
|  | @ -19,42 +19,39 @@ char* errorCheckedMalloc(size_t newCapacity) | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | String::String(const char* str)  | ||||||
| class String  |  | ||||||
| { | { | ||||||
| private: |  | ||||||
| 
 |  | ||||||
|     size_t mSize        {0}; |  | ||||||
|     size_t mCapacity    {0}; |  | ||||||
|     char* mpData        {nullptr}; |  | ||||||
| 
 |  | ||||||
| public: |  | ||||||
| 
 |  | ||||||
|     String(const char* str)  |  | ||||||
|     { |  | ||||||
|     size_t strSize = std::strlen(str); |     size_t strSize = std::strlen(str); | ||||||
|     resize(strSize); |     resize(strSize); | ||||||
|     std::memcpy(mpData, str, mSize); |     std::memcpy(mpData, str, mSize); | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     String() : String("") {} | String::String() : String("") {} | ||||||
|     String(const String& s) : String(s.cStr()) {} | String::String(const String& s) : String(s.cStr()) {} | ||||||
|  | String::String(const StringView& sv) { | ||||||
|  |         mSize = sv.size(); | ||||||
|  |         (*this).reserve(mSize); | ||||||
|  |         for(int i = 0; i < mSize; ++i) | ||||||
|  |             mpData[i] = sv[i]; | ||||||
|  |         mpData[mSize] = '\0'; | ||||||
|          |          | ||||||
|     String(size_t n, char a) | } | ||||||
|     { | 
 | ||||||
|  | String::String(size_t n, char a) | ||||||
|  | { | ||||||
|     resize(n); |     resize(n); | ||||||
| 
 | 
 | ||||||
|     for (size_t i = 0; i < mSize; ++i) |     for (size_t i = 0; i < mSize; ++i) | ||||||
|         mpData[i] = a; |         mpData[i] = a; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     ~String() | String::~String() | ||||||
|     { | { | ||||||
|     std::free(mpData); |     std::free(mpData); | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     void reserve(size_t capacity) | void String::reserve(size_t capacity) | ||||||
|     { | { | ||||||
|     if (capacity <= mCapacity) |     if (capacity <= mCapacity) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|  | @ -66,19 +63,19 @@ public: | ||||||
| 
 | 
 | ||||||
|     std::free(mpData); |     std::free(mpData); | ||||||
|     mpData = newData; |     mpData = newData; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     void resize(size_t size) | void String::resize(size_t size) | ||||||
|     { | { | ||||||
|     reserve(size + 1); |     reserve(size + 1); | ||||||
|     mSize = size; |     mSize = size; | ||||||
|     mpData[mSize] = '\0'; |     mpData[mSize] = '\0'; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     String& operator=(const String& right) | String& String::operator=(const String& right) | ||||||
|     { | { | ||||||
|     if (this == &right) |     if (this == &right) | ||||||
|         return *this; |         return *this; | ||||||
| 
 | 
 | ||||||
|  | @ -88,11 +85,11 @@ public: | ||||||
|     std::memcpy(mpData, right.mpData, mSize + 1); |     std::memcpy(mpData, right.mpData, mSize + 1); | ||||||
| 
 | 
 | ||||||
|     return *this; |     return *this; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     String operator+(const String& b) | String String::operator+(const String& b) | ||||||
|     { | { | ||||||
|     String result; |     String result; | ||||||
|     result.resize(mSize + b.mSize); |     result.resize(mSize + b.mSize); | ||||||
| 
 | 
 | ||||||
|  | @ -101,16 +98,16 @@ public: | ||||||
|     result.mpData[result.mSize] = '\0'; |     result.mpData[result.mSize] = '\0'; | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     String& operator+=(const String& right) | String& String::operator+=(const String& right) | ||||||
|     { | { | ||||||
|     *this = *this + right; |     *this = *this + right; | ||||||
|     return *this; |     return *this; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     bool operator==(const String& right) const | bool String::operator==(const String& right) const | ||||||
|     { | { | ||||||
|     if (mSize != right.mSize) |     if (mSize != right.mSize) | ||||||
|         return false; |         return false; | ||||||
| 
 | 
 | ||||||
|  | @ -119,84 +116,84 @@ public: | ||||||
|         i++; |         i++; | ||||||
| 
 | 
 | ||||||
|     return i == mSize; |     return i == mSize; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     bool operator<(const String& right) const | bool String::operator<(const String& right) const | ||||||
|     { | { | ||||||
|     size_t i = 0; |     size_t i = 0; | ||||||
|     while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) |     while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) | ||||||
|         i++; |         i++; | ||||||
| 
 | 
 | ||||||
|     return mpData[i] < right.mpData[i]; |     return mpData[i] < right.mpData[i]; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     bool operator<=(const String& right) const | bool String::operator<=(const String& right) const | ||||||
|     { | { | ||||||
|     size_t i = 0; |     size_t i = 0; | ||||||
|     while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) |     while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) | ||||||
|         i++; |         i++; | ||||||
| 
 | 
 | ||||||
|     return mpData[i] <= right.mpData[i]; |     return mpData[i] <= right.mpData[i]; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     bool operator!=(const String& right) const | bool String::operator!=(const String& right) const | ||||||
|     { | { | ||||||
|     return !(*this == right); |     return !(*this == right); | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     bool operator>(const String& right) const | bool String::operator>(const String& right) const | ||||||
|     { | { | ||||||
|     return !(*this <= right); |     return !(*this <= right); | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     bool operator>=(const String& right) const | bool String::operator>=(const String& right) const | ||||||
|     { | { | ||||||
|     return !(*this < right); |     return !(*this < right); | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     char& operator[](size_t i) | char& String::operator[](size_t i) | ||||||
|     { | { | ||||||
|     return mpData[i]; |     return mpData[i]; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     const char& operator[](size_t i) const | const char& String::operator[](size_t i) const | ||||||
|     { | { | ||||||
|     return mpData[i]; |     return mpData[i]; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     char& at(size_t i) | char& String::at(size_t i) | ||||||
|     { | { | ||||||
|     if (i >= mSize) |     if (i >= mSize) | ||||||
|     { |     { | ||||||
|         cout << "Error! Index is out of bounds." << endl; |         cout << "Error! Index is out of bounds." << endl; | ||||||
|     } |     } | ||||||
|     return mpData[i]; |     return mpData[i]; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     void clear() | void String::clear() | ||||||
|     { | { | ||||||
|     std::free(mpData); |     std::free(mpData); | ||||||
| 
 | 
 | ||||||
|     mSize = 0; |     mSize = 0; | ||||||
|     mCapacity = 1; |     mCapacity = 1; | ||||||
|     mpData = errorCheckedMalloc(mCapacity); |     mpData = errorCheckedMalloc(mCapacity); | ||||||
|     mpData[0] = '\0'; |     mpData[0] = '\0'; | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
|     void addCharacter(char c) | void String::addCharacter(char c) | ||||||
|     { | { | ||||||
|     if (mSize + 1 == mCapacity) |     if (mSize + 1 == mCapacity) | ||||||
|         reserve(2 * mCapacity); |         reserve(2 * mCapacity); | ||||||
| 
 | 
 | ||||||
|     mpData[mSize] = c; |     mpData[mSize] = c; | ||||||
|     resize(mSize + 1); |     resize(mSize + 1); | ||||||
|     } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     size_t getSize()        const   {return mSize;} | size_t String::getSize()        const   {return mSize;} | ||||||
|     size_t getCapacity()    const   {return mCapacity;} | size_t String::getCapacity()    const   {return mCapacity;} | ||||||
|     const char* cStr()      const   {return mpData;} | const char* String::cStr()      const   {return mpData;} | ||||||
| }; | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| std::ostream& operator<<(std::ostream& out, const String& s)  | std::ostream& operator<<(std::ostream& out, const String& s)  | ||||||
|  |  | ||||||
							
								
								
									
										43
									
								
								seminar03_initialization/08_stringview/miptstring.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								seminar03_initialization/08_stringview/miptstring.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,43 @@ | ||||||
|  | #pragma once | ||||||
|  | #include <iostream> | ||||||
|  | 
 | ||||||
|  | namespace mipt { | ||||||
|  | 
 | ||||||
|  | class StringView; | ||||||
|  | class String  | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     size_t mSize        {0}; | ||||||
|  |     size_t mCapacity    {0}; | ||||||
|  |     char* mpData        {nullptr}; | ||||||
|  | public: | ||||||
|  |     String(const char* str); | ||||||
|  |     String(); | ||||||
|  |     String(const String& s); | ||||||
|  |     String(const mipt::StringView& sv); | ||||||
|  |     String(size_t n, char a); | ||||||
|  |     ~String(); | ||||||
|  |     void reserve(size_t capacity); | ||||||
|  |     void resize(size_t size); | ||||||
|  |     String& operator=(const String& right); | ||||||
|  |     String operator+(const String& b); | ||||||
|  |     String& operator+=(const String& right); | ||||||
|  |     bool operator==(const String& right) const; | ||||||
|  |     bool operator<(const String& right) const; | ||||||
|  |     bool operator<=(const String& right) const; | ||||||
|  |     bool operator!=(const String& right) const; | ||||||
|  |     bool operator>(const String& right) const; | ||||||
|  |     bool operator>=(const String& right) const; | ||||||
|  |     char& operator[](size_t i); | ||||||
|  |     const char& operator[](size_t i) const; | ||||||
|  |     char& at(size_t i); | ||||||
|  |     void clear(); | ||||||
|  |     void addCharacter(char c); | ||||||
|  |     size_t getSize()        const;  | ||||||
|  |     size_t getCapacity()    const; | ||||||
|  |     const char* cStr()      const; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | std::ostream& operator<<(std::ostream& out, const String& s); | ||||||
|  | std::istream& operator>>(std::istream& in, String& s);  | ||||||
|  | } | ||||||
|  | @ -1,37 +1,30 @@ | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include <iostream> | #include <iostream> | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <cstdlib> | #include <cstdlib> | ||||||
| #include <cstring> | #include <cstring> | ||||||
|  | #include "miptstring.h" | ||||||
|  | #include "miptstringview.h" | ||||||
| using std::cout, std::cin, std::endl, std::size_t; | using std::cout, std::cin, std::endl, std::size_t; | ||||||
| 
 | 
 | ||||||
| namespace mipt { | namespace mipt { | ||||||
| 
 | 
 | ||||||
| class StringView  |     StringView::StringView() {; | ||||||
| { |  | ||||||
| private: |  | ||||||
|     const char* mpData; |  | ||||||
|     size_t mSize; |  | ||||||
|    |  | ||||||
| public:   |  | ||||||
|     StringView() {; |  | ||||||
|         mSize = 0; |         mSize = 0; | ||||||
|         mpData = nullptr; |         mpData = nullptr; | ||||||
|     } |     } | ||||||
|     StringView(const StringView& str) { |     StringView::StringView(const StringView& str) { | ||||||
|         mSize = str.mSize; |         mSize = str.mSize; | ||||||
|         mpData = str.mpData; |         mpData = str.mpData; | ||||||
|     } |     } | ||||||
|     StringView(const mipt::String& s) { |     StringView::StringView(const mipt::String& s) { | ||||||
|         mSize = s.getSize(); |         mSize = s.getSize(); | ||||||
|         mpData = s.cStr();   |         mpData = s.cStr();   | ||||||
|     } |     } | ||||||
|     StringView(const char* s) { |     StringView::StringView(const char* s) { | ||||||
|         mpData = s; |         mpData = s; | ||||||
|         mSize = strlen(s);  |         mSize = strlen(s);  | ||||||
|     } |     } | ||||||
|     const char& at(size_t i) |     const char& StringView::at(size_t i) | ||||||
|     { |     { | ||||||
|         if (i >= mSize) |         if (i >= mSize) | ||||||
|         { |         { | ||||||
|  | @ -40,20 +33,49 @@ public: | ||||||
|         } |         } | ||||||
|         return mpData[i]; |         return mpData[i]; | ||||||
|     } |     } | ||||||
|     const char& operator[](size_t i) |     const char& StringView::operator[](size_t i) const | ||||||
|     { |     { | ||||||
|         return mpData[i]; |         return mpData[i]; | ||||||
|     } |     } | ||||||
|     size_t size() { |     bool StringView::operator<(const StringView& right) const | ||||||
|  |     { | ||||||
|  |         size_t i = 0; | ||||||
|  |         while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) | ||||||
|  |             i++; | ||||||
|  | 
 | ||||||
|  |         return mpData[i] < right.mpData[i]; | ||||||
|  |     } | ||||||
|  |     size_t StringView::size() const { | ||||||
|         return mSize; |         return mSize; | ||||||
|     } |     } | ||||||
| 
 |     StringView StringView::substr(size_t pos, size_t count) { | ||||||
| }; |         if (pos > mSize)  | ||||||
| } |                 throw std::out_of_range("Error! Index is out of bounds."); | ||||||
| 
 |         if (pos + count > mSize) | ||||||
| std::ostream& operator<<(std::ostream& out, mipt::StringView sv) { |               count = mSize - pos; | ||||||
|  |         StringView result; | ||||||
|  |         result.mpData = mpData + pos; | ||||||
|  |         result.mSize = count; | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  |     void StringView::remove_prefix(size_t n) { | ||||||
|  |             mSize -= n; | ||||||
|  |     } | ||||||
|  |     void StringView::remove_suffix(size_t n) { | ||||||
|  |             mSize -= n; | ||||||
|  |             mpData += n; | ||||||
|  |     } | ||||||
|  | /*std::ostream& StringView::operator<<(std::ostream& out, mipt::StringView sv) {
 | ||||||
|  |     size_t size = sv.size(); | ||||||
|  |     for (int i = 0; i < size; ++i) | ||||||
|  |             out << sv[i]; | ||||||
|  |     return out;  | ||||||
|  | }*/ | ||||||
|  | std::ostream& operator<<(std::ostream& out, const mipt::StringView& sv) { | ||||||
|     size_t size = sv.size(); |     size_t size = sv.size(); | ||||||
|     for (int i = 0; i < size; ++i) |     for (int i = 0; i < size; ++i) | ||||||
|             out << sv[i]; |             out << sv[i]; | ||||||
|     return out;  |     return out;  | ||||||
| } | } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								seminar03_initialization/08_stringview/miptstringview.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								seminar03_initialization/08_stringview/miptstringview.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <iostream> | ||||||
|  | 
 | ||||||
|  | namespace mipt { | ||||||
|  | class String; | ||||||
|  | class StringView  | ||||||
|  | { | ||||||
|  | private: | ||||||
|  |     const char* mpData; | ||||||
|  |     size_t mSize; | ||||||
|  | public:   | ||||||
|  |     StringView(); | ||||||
|  |     StringView(const StringView& str); | ||||||
|  |     StringView(const mipt::String& s); | ||||||
|  |     StringView(const char* s); | ||||||
|  |     const char& at(size_t i); | ||||||
|  |     const char& operator[](size_t i) const; | ||||||
|  |     bool operator<(const StringView& right) const; | ||||||
|  |     size_t size() const; | ||||||
|  |     StringView substr(size_t pos, size_t count); | ||||||
|  |     void remove_prefix(size_t n);  | ||||||
|  |     void remove_suffix(size_t n); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | std::ostream& operator<<(std::ostream& out, const StringView& sv); | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Reference in a new issue