From d73bcb8c0371988162300c921fa1c3c33081896d Mon Sep 17 00:00:00 2001 From: nihonium Date: Sat, 22 Oct 2022 19:15:34 +0300 Subject: [PATCH 1/3] working stringview --- .../08_stringview/main.cpp | 18 +++++++----- .../08_stringview/miptstring.cpp | 13 ++++++++- .../08_stringview/miptstringview.cpp | 29 ++++++++++++++++++- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/seminar03_initialization/08_stringview/main.cpp b/seminar03_initialization/08_stringview/main.cpp index b54382e..7ccf460 100644 --- a/seminar03_initialization/08_stringview/main.cpp +++ b/seminar03_initialization/08_stringview/main.cpp @@ -2,15 +2,17 @@ #include "miptstring.cpp" #include "miptstringview.cpp" + using namespace std; int main() { - mipt::String str = "Meow!!"; - cout << str << endl; - mipt::StringView sv = str; - cout << "string view: " << sv << endl; - char a[] = "nyaa!"; - mipt::StringView sv1 = a; - cout << "string view: " << sv1 << endl; - cout << sv1.at(200) << endl; + mipt::String a = "abcd"; + mipt::String b = "abce"; + mipt::StringView av = a; + mipt::StringView bv = b; + //cout << (b < a) << endl; + //cout << (bv < av) << endl; + cout << av.substr(1,10) << endl; + av.remove_suffix(5); + cout << av << endl; } diff --git a/seminar03_initialization/08_stringview/miptstring.cpp b/seminar03_initialization/08_stringview/miptstring.cpp index 4234748..1e7e84d 100644 --- a/seminar03_initialization/08_stringview/miptstring.cpp +++ b/seminar03_initialization/08_stringview/miptstring.cpp @@ -4,6 +4,8 @@ #include #include #include +//#include "miptstringview.cpp" + using std::cout, std::cin, std::endl, std::size_t; namespace mipt{ @@ -39,7 +41,15 @@ public: String() : String("") {} String(const String& s) : String(s.cStr()) {} - +/* String(const mipt::StringView& sv) { + mSize = sv.size(); + self.reserve(mSize); + for(int i = 0; i < mSize; ++i) + mpData[i] = sv[i]; + mpData[mSize] = '\0'; + + } +*/ String(size_t n, char a) { resize(n); @@ -218,4 +228,5 @@ 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 770aa16..5727b60 100644 --- a/seminar03_initialization/08_stringview/miptstringview.cpp +++ b/seminar03_initialization/08_stringview/miptstringview.cpp @@ -44,12 +44,39 @@ public: { return mpData[i]; } + bool 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 size() { return mSize; } + 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) + count = mSize - pos; + StringView result; + result.mpData = mpData + pos; + result.mSize = count; + return result; + } + void remove_prefix(size_t n) { + mSize -= n; + } + void remove_suffix(size_t n) { + mSize -= n; + mpData += n; + } + +}; }; -} + std::ostream& operator<<(std::ostream& out, mipt::StringView sv) { size_t size = sv.size(); From ec50d811ff2540bea0b1a3a0fc5f2e023ed998ed Mon Sep 17 00:00:00 2001 From: nihonium Date: Sat, 22 Oct 2022 21:32:50 +0300 Subject: [PATCH 2/3] splitted --- .../08_stringview/main.cpp | 6 +- seminar03_initialization/08_stringview/mipt.h | 65 ++++ .../08_stringview/miptstring.cpp | 307 +++++++++--------- .../08_stringview/miptstringview.cpp | 48 ++- 4 files changed, 235 insertions(+), 191 deletions(-) create mode 100644 seminar03_initialization/08_stringview/mipt.h 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 strSize = std::strlen(str); + resize(strSize); + std::memcpy(mpData, str, mSize); +} - 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); - } - - 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); - - std::memcpy(mpData, right.mpData, mSize + 1); - +String& String::operator=(const String& right) +{ + if (this == &right) return *this; - } + + mSize = right.mSize; + resize(mSize); + + std::memcpy(mpData, right.mpData, mSize + 1); + + return *this; +} - String operator+(const String& b) +String 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'; + + return result; +} + +String& String::operator+=(const String& right) +{ + *this = *this + right; + return *this; +} + +bool String::operator==(const String& right) const +{ + if (mSize != right.mSize) + return false; + + size_t i = 0; + while (i < mSize && mpData[i] == right.mpData[i]) + i++; + + return i == mSize; +} + +bool String::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]; +} + +bool String::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]; +} + +bool String::operator!=(const String& right) const +{ + return !(*this == right); +} + +bool String::operator>(const String& right) const +{ + return !(*this <= right); +} + +bool String::operator>=(const String& right) const +{ + return !(*this < right); +} + +char& String::operator[](size_t i) +{ + return mpData[i]; +} + +const char& String::operator[](size_t i) const +{ + return mpData[i]; +} + +char& String::at(size_t i) +{ + if (i >= mSize) { - 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'; - - return result; + cout << "Error! Index is out of bounds." << endl; } + return mpData[i]; +} - String& operator+=(const String& right) - { - *this = *this + right; - return *this; - } +void String::clear() +{ + std::free(mpData); - bool operator==(const String& right) const - { - if (mSize != right.mSize) - return false; + mSize = 0; + mCapacity = 1; + mpData = errorCheckedMalloc(mCapacity); + mpData[0] = '\0'; +} - size_t i = 0; - while (i < mSize && mpData[i] == right.mpData[i]) - i++; +void String::addCharacter(char c) +{ + if (mSize + 1 == mCapacity) + reserve(2 * mCapacity); - return i == mSize; - } - - 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]; - } - - 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]; - } - - bool operator!=(const String& right) const - { - return !(*this == right); - } - - bool operator>(const String& right) const - { - return !(*this <= right); - } - - bool operator>=(const String& right) const - { - return !(*this < right); - } - - char& operator[](size_t i) - { - return mpData[i]; - } - - const char& operator[](size_t i) const - { - return mpData[i]; - } - - char& at(size_t i) - { - if (i >= mSize) - { - cout << "Error! Index is out of bounds." << endl; - } - return mpData[i]; - } - - void clear() - { - std::free(mpData); - - mSize = 0; - mCapacity = 1; - mpData = errorCheckedMalloc(mCapacity); - mpData[0] = '\0'; - } - - void 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; } +}; + From 2da7623dd3e30f6ea6abb5da639fe9e74743f388 Mon Sep 17 00:00:00 2001 From: nihonium Date: Sat, 22 Oct 2022 22:03:40 +0300 Subject: [PATCH 3/3] finished stringview --- .../08_stringview/main.cpp | 10 +++---- .../08_stringview/miptstring.cpp | 7 +++-- .../08_stringview/{mipt.h => miptstring.h} | 24 +--------------- .../08_stringview/miptstringview.cpp | 3 +- .../08_stringview/miptstringview.h | 28 +++++++++++++++++++ 5 files changed, 40 insertions(+), 32 deletions(-) rename seminar03_initialization/08_stringview/{mipt.h => miptstring.h} (68%) create mode 100644 seminar03_initialization/08_stringview/miptstringview.h diff --git a/seminar03_initialization/08_stringview/main.cpp b/seminar03_initialization/08_stringview/main.cpp index cfec7e6..beaa948 100644 --- a/seminar03_initialization/08_stringview/main.cpp +++ b/seminar03_initialization/08_stringview/main.cpp @@ -1,8 +1,6 @@ #include -//#include "miptstring.cpp" -//#include "miptstringview.cpp" -#include "mipt.h" - +#include "miptstring.h" +#include "miptstringview.h" using namespace std; int main() { @@ -13,6 +11,8 @@ int main() { //cout << (b < a) << endl; //cout << (bv < av) << endl; cout << av.substr(1,10) << endl; - av.remove_suffix(5); + av.remove_suffix(2); cout << av << endl; + mipt::String meow = av; + cout << "sv to string: " << meow << endl; } diff --git a/seminar03_initialization/08_stringview/miptstring.cpp b/seminar03_initialization/08_stringview/miptstring.cpp index 19fa257..ef07c94 100644 --- a/seminar03_initialization/08_stringview/miptstring.cpp +++ b/seminar03_initialization/08_stringview/miptstring.cpp @@ -2,7 +2,8 @@ #include #include #include -#include "mipt.h" +#include "miptstring.h" +#include "miptstringview.h" using std::cout, std::cin, std::endl, std::size_t; namespace mipt{ @@ -29,12 +30,12 @@ String::String() : String("") {} String::String(const String& s) : String(s.cStr()) {} String::String(const StringView& sv) { mSize = sv.size(); - self.reserve(mSize); + (*this).reserve(mSize); for(int i = 0; i < mSize; ++i) mpData[i] = sv[i]; mpData[mSize] = '\0'; - } +} String::String(size_t n, char a) { diff --git a/seminar03_initialization/08_stringview/mipt.h b/seminar03_initialization/08_stringview/miptstring.h similarity index 68% rename from seminar03_initialization/08_stringview/mipt.h rename to seminar03_initialization/08_stringview/miptstring.h index 74c54fa..7a6d37f 100644 --- a/seminar03_initialization/08_stringview/mipt.h +++ b/seminar03_initialization/08_stringview/miptstring.h @@ -1,9 +1,9 @@ #pragma once - #include namespace mipt { +class StringView; class String { private: @@ -40,26 +40,4 @@ public: 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/miptstringview.cpp b/seminar03_initialization/08_stringview/miptstringview.cpp index 74892cb..9d903b3 100644 --- a/seminar03_initialization/08_stringview/miptstringview.cpp +++ b/seminar03_initialization/08_stringview/miptstringview.cpp @@ -2,7 +2,8 @@ #include #include #include -#include "mipt.h" +#include "miptstring.h" +#include "miptstringview.h" using std::cout, std::cin, std::endl, std::size_t; namespace mipt { diff --git a/seminar03_initialization/08_stringview/miptstringview.h b/seminar03_initialization/08_stringview/miptstringview.h new file mode 100644 index 0000000..3dfd7ac --- /dev/null +++ b/seminar03_initialization/08_stringview/miptstringview.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +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); + +}