From a028a958c7f0b7ad79faf0fe5dfbcbb28658ae7d Mon Sep 17 00:00:00 2001 From: angeld55 Date: Sun, 5 Jun 2022 21:40:42 +0300 Subject: solutions to task 1 from k2 --- .../task1/PairOfOptionals/PairOfOptionals.hpp | 154 +++++++++++++++++++++ Utils/k_2_SI/task1/Source.cpp | 17 +++ Utils/k_2_SI/task2/Events/Time.cpp | 0 Utils/k_2_SI/task2/Events/Time.h | 0 Utils/k_2_SI/task2/Time/Event.h | 0 5 files changed, 171 insertions(+) create mode 100644 Utils/k_2_SI/task1/PairOfOptionals/PairOfOptionals.hpp create mode 100644 Utils/k_2_SI/task1/Source.cpp create mode 100644 Utils/k_2_SI/task2/Events/Time.cpp create mode 100644 Utils/k_2_SI/task2/Events/Time.h create mode 100644 Utils/k_2_SI/task2/Time/Event.h diff --git a/Utils/k_2_SI/task1/PairOfOptionals/PairOfOptionals.hpp b/Utils/k_2_SI/task1/PairOfOptionals/PairOfOptionals.hpp new file mode 100644 index 0000000..1e5ce24 --- /dev/null +++ b/Utils/k_2_SI/task1/PairOfOptionals/PairOfOptionals.hpp @@ -0,0 +1,154 @@ +#include + +template +class PairOfOptionals +{ + T* first; + D* second; + + + void copyFrom(const PairOfOptionals& other); + void free(); + +public: + PairOfOptionals(); + PairOfOptionals(const T& leftData, const D& rightData); + + + PairOfOptionals(const PairOfOptionals& other); + PairOfOptionals& operator=(const PairOfOptionals& other); + + ~PairOfOptionals(); + + void setFirst(const T& firstData); + void setSecond(const D& firstData); + + const T& getFirst() const; + const D& getSecond() const; + + void removeFirst(); + void removeSecond(); + + bool containsFirst() const; + bool containsSecond() const; + + bool operator==(const PairOfOptionals& rhs) const; + bool operator!=(const PairOfOptionals& rhs) const; + + +}; +template +PairOfOptionals::PairOfOptionals() : first(nullptr), second(nullptr){} + +template +PairOfOptionals::PairOfOptionals(const T& leftData, const D& rightData) : first(nullptr), second(nullptr) +{ + setFirst(leftData); + setSecond(rightData); +} + +template +PairOfOptionals::PairOfOptionals(const PairOfOptionals& other) +{ + copyFrom(other); +} + +template +PairOfOptionals& PairOfOptionals::operator=(const PairOfOptionals& other) +{ + if (this != &other) + { + free(); + copyFrom(other); + } + return *this; +} + +template +PairOfOptionals::~PairOfOptionals() +{ + free(); +} + +template +void PairOfOptionals::setFirst(const T& firstData) +{ + delete first; + first = new T(firstData); +} +template +void PairOfOptionals::setSecond(const D& secondData) +{ + delete second; + second = new D(secondData); +} + +template +const T& PairOfOptionals::getFirst() const +{ + if (!containsFirst()) + throw std::logic_error("No first element"); + return *first; +} +template +const D& PairOfOptionals::getSecond() const +{ + if (!containsSecond()) + throw std::logic_error("No second element"); + return *second; +} + +template +void PairOfOptionals::removeFirst() +{ + delete first; + first = nullptr; +} +template +void PairOfOptionals::removeSecond() +{ + delete second; + second = nullptr; +} +template +bool PairOfOptionals::containsFirst() const +{ + return first != nullptr; +} + +template +bool PairOfOptionals::containsSecond() const +{ + return second != nullptr; +} + +template +void PairOfOptionals::copyFrom(const PairOfOptionals& other) +{ + first = new T(other.first); + second = new D(other.second); +} + +template +void PairOfOptionals::free() +{ + delete first, second; +} + + +template +bool compareValues(const S* ptr1, const S* ptr2) +{ + return (ptr1 == nullptr && ptr2 == nullptr) || (ptr1 != nullptr && ptr2 != nullptr && *ptr1 == *ptr2); +} + +template +bool PairOfOptionals::operator==(const PairOfOptionals& rhs) const +{ + return compareValues(first, rhs.first) && compareValues(second, rhs.second); +} +template +bool PairOfOptionals::operator!=(const PairOfOptionals& rhs) const +{ + return !(*this == rhs); +} \ No newline at end of file diff --git a/Utils/k_2_SI/task1/Source.cpp b/Utils/k_2_SI/task1/Source.cpp new file mode 100644 index 0000000..5020fa9 --- /dev/null +++ b/Utils/k_2_SI/task1/Source.cpp @@ -0,0 +1,17 @@ +#include +#include "PairOfOptionals/PairOfOptionals.hpp" + +int main() +{ + PairOfOptionals p1(5, 's'); + p1.removeSecond(); + + p1.setFirst(1); + + PairOfOptionals p2; + std::cout << (p1 == p2) << std::endl; + + p2.setFirst(1); + + std::cout << (p1 == p2); +} \ No newline at end of file diff --git a/Utils/k_2_SI/task2/Events/Time.cpp b/Utils/k_2_SI/task2/Events/Time.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Utils/k_2_SI/task2/Events/Time.h b/Utils/k_2_SI/task2/Events/Time.h new file mode 100644 index 0000000..e69de29 diff --git a/Utils/k_2_SI/task2/Time/Event.h b/Utils/k_2_SI/task2/Time/Event.h new file mode 100644 index 0000000..e69de29 -- cgit v1.3.1-23-gd82d