diff --git a/seminar03_initialization/08_stringview/main.cpp b/seminar03_initialization/08_stringview/main.cpp index 7ccf460..cfec7e6 100644 --- a/seminar03_initialization/08_stringview/main.cpp +++ b/seminar03_initialization/08_stringview/main.cpp @@ -1,7 +1,7 @@ #include -#include "miptstring.cpp" -#include "miptstringview.cpp" - +//#include "miptstring.cpp" +//#include "miptstringview.cpp" +#include "mipt.h" using namespace std; diff --git a/seminar03_initialization/08_stringview/mipt.h b/seminar03_initialization/08_stringview/mipt.h new file mode 100644 index 0000000..74c54fa --- /dev/null +++ b/seminar03_initialization/08_stringview/mipt.h @@ -0,0 +1,65 @@ +#pragma once + +#include + +namespace mipt { + +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); + +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); + +} diff --git a/seminar03_initialization/08_stringview/miptstring.cpp b/seminar03_initialization/08_stringview/miptstring.cpp index 1e7e84d..19fa257 100644 --- a/seminar03_initialization/08_stringview/miptstring.cpp +++ b/seminar03_initialization/08_stringview/miptstring.cpp @@ -1,11 +1,8 @@ -#pragma once - #include #include #include #include -//#include "miptstringview.cpp" - +#include "mipt.h" using std::cout, std::cin, std::endl, std::size_t; namespace mipt{ @@ -21,27 +18,16 @@ char* errorCheckedMalloc(size_t newCapacity) return result; } - -class String +String::String(const char* str) { -private: - - size_t mSize {0}; - size_t mCapacity {0}; - char* mpData {nullptr}; - -public: - - String(const char* str) - { - size_t strSize = std::strlen(str); - resize(strSize); - std::memcpy(mpData, str, mSize); - } + size_t strSize = std::strlen(str); + resize(strSize); + std::memcpy(mpData, str, mSize); +} - String() : String("") {} - String(const String& s) : String(s.cStr()) {} -/* String(const mipt::StringView& sv) { +String::String() : String("") {} +String::String(const String& s) : String(s.cStr()) {} +String::String(const StringView& sv) { mSize = sv.size(); self.reserve(mSize); for(int i = 0; i < mSize; ++i) @@ -49,164 +35,164 @@ public: mpData[mSize] = '\0'; } -*/ - String(size_t n, char a) - { - resize(n); - for (size_t i = 0; i < mSize; ++i) - mpData[i] = a; - } +String::String(size_t n, char a) +{ + resize(n); - ~String() - { - std::free(mpData); - } + for (size_t i = 0; i < mSize; ++i) + mpData[i] = a; +} - void reserve(size_t capacity) - { - if (capacity <= mCapacity) - return; +String::~String() +{ + std::free(mpData); +} - mCapacity = std::max(2 * mCapacity, capacity); - char* newData = errorCheckedMalloc(mCapacity); +void String::reserve(size_t capacity) +{ + if (capacity <= mCapacity) + return; - if (mpData) - std::memcpy(newData, mpData, mSize + 1); + mCapacity = std::max(2 * mCapacity, capacity); + char* newData = errorCheckedMalloc(mCapacity); - std::free(mpData); - mpData = newData; - } + if (mpData) + std::memcpy(newData, mpData, mSize + 1); + std::free(mpData); + mpData = newData; +} - void resize(size_t size) - { - reserve(size + 1); - mSize = size; - mpData[mSize] = '\0'; - } +void String::resize(size_t size) +{ + reserve(size + 1); + mSize = size; + mpData[mSize] = '\0'; +} - String& operator=(const String& right) - { - if (this == &right) - return *this; - mSize = right.mSize; - resize(mSize); +String& String::operator=(const String& right) +{ + if (this == &right) + return *this; - std::memcpy(mpData, right.mpData, mSize + 1); + mSize = right.mSize; + resize(mSize); - return *this; - } + std::memcpy(mpData, right.mpData, mSize + 1); + return *this; +} - String operator+(const String& b) - { - String result; - result.resize(mSize + b.mSize); - std::memcpy(result.mpData, mpData, mSize); - std::memcpy(result.mpData + mSize, b.mpData, b.mSize); - result.mpData[result.mSize] = '\0'; +String String::operator+(const String& b) +{ + String result; + result.resize(mSize + b.mSize); - return result; - } + std::memcpy(result.mpData, mpData, mSize); + std::memcpy(result.mpData + mSize, b.mpData, b.mSize); + result.mpData[result.mSize] = '\0'; - String& operator+=(const String& right) - { - *this = *this + right; - return *this; - } + return result; +} - bool operator==(const String& right) const - { - if (mSize != right.mSize) - return false; +String& String::operator+=(const String& right) +{ + *this = *this + right; + return *this; +} - size_t i = 0; - while (i < mSize && mpData[i] == right.mpData[i]) - i++; +bool String::operator==(const String& right) const +{ + if (mSize != right.mSize) + return false; - return i == mSize; - } + size_t i = 0; + while (i < mSize && mpData[i] == right.mpData[i]) + i++; - bool operator<(const String& right) const - { - size_t i = 0; - while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) - i++; + return i == mSize; +} - return mpData[i] < right.mpData[i]; - } +bool String::operator<(const String& right) const +{ + size_t i = 0; + while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) + i++; - bool operator<=(const String& right) const - { - size_t i = 0; - while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) - i++; + return mpData[i] < right.mpData[i]; +} - return mpData[i] <= right.mpData[i]; - } +bool String::operator<=(const String& right) const +{ + size_t i = 0; + while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) + i++; - bool operator!=(const String& right) const - { - return !(*this == right); - } + return mpData[i] <= right.mpData[i]; +} - bool operator>(const String& right) const - { - return !(*this <= right); - } +bool String::operator!=(const String& right) const +{ + return !(*this == right); +} - bool operator>=(const String& right) const - { - return !(*this < right); - } +bool String::operator>(const String& right) const +{ + return !(*this <= right); +} - char& operator[](size_t i) - { - return mpData[i]; - } +bool String::operator>=(const String& right) const +{ + return !(*this < right); +} - const char& operator[](size_t i) const - { - return mpData[i]; - } +char& String::operator[](size_t i) +{ + return mpData[i]; +} - char& at(size_t i) +const char& String::operator[](size_t i) const +{ + return mpData[i]; +} + +char& String::at(size_t i) +{ + if (i >= mSize) { - if (i >= mSize) - { - cout << "Error! Index is out of bounds." << endl; - } - return mpData[i]; + cout << "Error! Index is out of bounds." << endl; } + return mpData[i]; +} - void clear() - { - std::free(mpData); +void String::clear() +{ + std::free(mpData); - mSize = 0; - mCapacity = 1; - mpData = errorCheckedMalloc(mCapacity); - mpData[0] = '\0'; - } + mSize = 0; + mCapacity = 1; + mpData = errorCheckedMalloc(mCapacity); + mpData[0] = '\0'; +} - void addCharacter(char c) - { - if (mSize + 1 == mCapacity) - reserve(2 * mCapacity); +void String::addCharacter(char c) +{ + if (mSize + 1 == mCapacity) + reserve(2 * mCapacity); - mpData[mSize] = c; - resize(mSize + 1); - } + mpData[mSize] = c; + resize(mSize + 1); +} - size_t getSize() const {return mSize;} - size_t getCapacity() const {return mCapacity;} - const char* cStr() const {return mpData;} -}; +size_t String::getSize() const {return mSize;} +size_t String::getCapacity() const {return mCapacity;} +const char* String::cStr() const {return mpData;} + std::ostream& operator<<(std::ostream& out, const String& s) @@ -228,5 +214,4 @@ std::istream& operator>>(std::istream& in, String& s) return in; } - } diff --git a/seminar03_initialization/08_stringview/miptstringview.cpp b/seminar03_initialization/08_stringview/miptstringview.cpp index 5727b60..74892cb 100644 --- a/seminar03_initialization/08_stringview/miptstringview.cpp +++ b/seminar03_initialization/08_stringview/miptstringview.cpp @@ -1,37 +1,29 @@ -#pragma once - #include #include #include #include +#include "mipt.h" using std::cout, std::cin, std::endl, std::size_t; namespace mipt { -class StringView -{ -private: - const char* mpData; - size_t mSize; - -public: - StringView() {; + StringView::StringView() {; mSize = 0; mpData = nullptr; } - StringView(const StringView& str) { + StringView::StringView(const StringView& str) { mSize = str.mSize; mpData = str.mpData; } - StringView(const mipt::String& s) { + StringView::StringView(const mipt::String& s) { mSize = s.getSize(); mpData = s.cStr(); } - StringView(const char* s) { + StringView::StringView(const char* s) { mpData = s; mSize = strlen(s); } - const char& at(size_t i) + const char& StringView::at(size_t i) { if (i >= mSize) { @@ -40,11 +32,11 @@ public: } return mpData[i]; } - const char& operator[](size_t i) + const char& StringView::operator[](size_t i) const { return mpData[i]; } - bool operator<(const StringView& right) const + bool StringView::operator<(const StringView& right) const { size_t i = 0; while (i < mSize && i < right.mSize && mpData[i] == right.mpData[i]) @@ -52,10 +44,10 @@ public: return mpData[i] < right.mpData[i]; } - size_t size() { + size_t StringView::size() const { return mSize; } - StringView substr(size_t pos, size_t count) { + 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) @@ -65,22 +57,24 @@ public: result.mSize = count; return result; } - void remove_prefix(size_t n) { + void StringView::remove_prefix(size_t n) { mSize -= n; } - void remove_suffix(size_t n) { + void StringView::remove_suffix(size_t n) { mSize -= n; mpData += n; } - -}; - -}; - - -std::ostream& operator<<(std::ostream& out, mipt::StringView sv) { +/*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(); for (int i = 0; i < size; ++i) out << sv[i]; return out; } +}; +