diff options
solutions to task 1 from k2
5 files changed, 171 insertions, 0 deletions
| -rw-r--r-- | Utils/k_2_SI/task1/PairOfOptionals/PairOfOptionals.hpp | 154 | ||||
| -rw-r--r-- | Utils/k_2_SI/task1/Source.cpp | 17 | ||||
| -rw-r--r-- | Utils/k_2_SI/task2/Events/Time.cpp | 0 | ||||
| -rw-r--r-- | Utils/k_2_SI/task2/Events/Time.h | 0 | ||||
| -rw-r--r-- | Utils/k_2_SI/task2/Time/Event.h | 0 |
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 <iostream> + +template<typename T, typename D> +class PairOfOptionals +{ + T* first; + D* second; + + + void copyFrom(const PairOfOptionals<T, D>& other); + void free(); + +public: + PairOfOptionals(); + PairOfOptionals(const T& leftData, const D& rightData); + + + PairOfOptionals(const PairOfOptionals<T,D>& other); + PairOfOptionals<T, D>& operator=(const PairOfOptionals<T,D>& 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<T, D>& rhs) const; + bool operator!=(const PairOfOptionals<T, D>& rhs) const; + + +}; +template <typename T, typename D> +PairOfOptionals<T, D>::PairOfOptionals() : first(nullptr), second(nullptr){} + +template<typename T, typename D> +PairOfOptionals<T, D>::PairOfOptionals(const T& leftData, const D& rightData) : first(nullptr), second(nullptr) +{ + setFirst(leftData); + setSecond(rightData); +} + +template<typename T, typename D> +PairOfOptionals<T, D>::PairOfOptionals(const PairOfOptionals<T, D>& other) +{ + copyFrom(other); +} + +template<typename T, typename D> +PairOfOptionals<T, D>& PairOfOptionals<T, D>::operator=(const PairOfOptionals<T, D>& other) +{ + if (this != &other) + { + free(); + copyFrom(other); + } + return *this; +} + +template<typename T, typename D> +PairOfOptionals<T, D>::~PairOfOptionals() +{ + free(); +} + +template<typename T, typename D> +void PairOfOptionals<T, D>::setFirst(const T& firstData) +{ + delete first; + first = new T(firstData); +} +template<typename T, typename D> +void PairOfOptionals<T, D>::setSecond(const D& secondData) +{ + delete second; + second = new D(secondData); +} + +template<typename T, typename D> +const T& PairOfOptionals<T, D>::getFirst() const +{ + if (!containsFirst()) + throw std::logic_error("No first element"); + return *first; +} +template<typename T, typename D> +const D& PairOfOptionals<T, D>::getSecond() const +{ + if (!containsSecond()) + throw std::logic_error("No second element"); + return *second; +} + +template<typename T, typename D> +void PairOfOptionals<T, D>::removeFirst() +{ + delete first; + first = nullptr; +} +template<typename T, typename D> +void PairOfOptionals<T, D>::removeSecond() +{ + delete second; + second = nullptr; +} +template<typename T, typename D> +bool PairOfOptionals<T, D>::containsFirst() const +{ + return first != nullptr; +} + +template<typename T, typename D> +bool PairOfOptionals<T, D>::containsSecond() const +{ + return second != nullptr; +} + +template<typename T, typename D> +void PairOfOptionals<T, D>::copyFrom(const PairOfOptionals<T, D>& other) +{ + first = new T(other.first); + second = new D(other.second); +} + +template<typename T, typename D> +void PairOfOptionals<T, D>::free() +{ + delete first, second; +} + + +template<typename S> +bool compareValues(const S* ptr1, const S* ptr2) +{ + return (ptr1 == nullptr && ptr2 == nullptr) || (ptr1 != nullptr && ptr2 != nullptr && *ptr1 == *ptr2); +} + +template<typename T, typename D> +bool PairOfOptionals<T, D>::operator==(const PairOfOptionals<T, D>& rhs) const +{ + return compareValues<T>(first, rhs.first) && compareValues<D>(second, rhs.second); +} +template<typename T, typename D> +bool PairOfOptionals<T, D>::operator!=(const PairOfOptionals<T, D>& 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 <iostream> +#include "PairOfOptionals/PairOfOptionals.hpp" + +int main() +{ + PairOfOptionals<int, char> p1(5, 's'); + p1.removeSecond(); + + p1.setFirst(1); + + PairOfOptionals<int, char> 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 --- /dev/null +++ b/Utils/k_2_SI/task2/Events/Time.cpp 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 --- /dev/null +++ b/Utils/k_2_SI/task2/Events/Time.h 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 --- /dev/null +++ b/Utils/k_2_SI/task2/Time/Event.h |
