From 7b19cabee8b08478f31f6e4594ed28e1d04e153c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 10 May 2024 10:10:21 +0300 Subject: [w11] Solved exercises --- week11/Exercise06/TwoArray.hpp | 117 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 week11/Exercise06/TwoArray.hpp (limited to 'week11/Exercise06/TwoArray.hpp') diff --git a/week11/Exercise06/TwoArray.hpp b/week11/Exercise06/TwoArray.hpp new file mode 100644 index 0000000..62ff2c0 --- /dev/null +++ b/week11/Exercise06/TwoArray.hpp @@ -0,0 +1,117 @@ +#pragma once + +template +class TwoArray { + T* first; + U* second; + unsigned allocated; + unsigned size; + + void free(); + void copyFrom(const TwoArray& other); + +public: + TwoArray(); + ~TwoArray(); + TwoArray(const TwoArray& other); + TwoArray& operator=(const TwoArray& other); + TwoArray(TwoArray&& other); + TwoArray& operator=(TwoArray&& other); + + T& operator[](int index); + const T& operator[](int index) const; + U& operator()(int index); + const U& operator()(int index) const; +}; + +template +void TwoArray::free() { + delete[] first; + delete[] second; +} + +template +void TwoArray::copyFrom(const TwoArray& other) { + this->size = other.size; + this->allocated = other.allocated; + first = new T[allocated]; + second = new U[allocated]; + for (int i = 0; i < size; i++) { + first[i] = other.first[i]; + second[i] = other.second[i]; + } +} + +template +TwoArray::TwoArray() { + first = second = nullptr; + size = allocated = 0; +} + +template +TwoArray::~TwoArray() { + free(); +} + +template +TwoArray::TwoArray(const TwoArray& other) { + copyFrom(other); +} + +template +TwoArray& TwoArray::operator=(const TwoArray& other) { + if (this != &other) { + free(); + copyFrom(other); + } + return *this; +} + +template +TwoArray::TwoArray(TwoArray&& other) { + this->first = other.first; + other.first = nullptr; + this->second = other.second; + other.second = nullptr; + this->allocated = other.allocated; + this->size = other.size; +} + +template +TwoArray& TwoArray::operator=(TwoArray&& other) { + if (this != &other) { + free(); + + this->first = other.first; + other.first = nullptr; + this->second = other.second; + other.second = nullptr; + this->allocated = other.allocated; + this->size = other.size; + } + return *this; +} + +template +T& TwoArray::operator[](int index) { + if (index < 0 || index >= size) throw "Invalid index!"; + return first[index]; +} + +template +const T& TwoArray::operator[](int index) const { + if (index < 0 || index >= size) throw "Invalid index!"; + return first[index]; +} + +template +U& TwoArray::operator()(int index) { + if (index < 0 || index >= size) throw "Invalid index!"; + return second[index]; +} + +template +const U& TwoArray::operator()(int index) const { + if (index < 0 || index >= size) throw "Invalid index!"; + return second[index]; +} -- cgit v1.2.3