From e0aecbfe38dc2646dcc1695af6bfc8c479a464b7 Mon Sep 17 00:00:00 2001 From: angeld55 Date: Mon, 6 Jun 2022 00:20:42 +0300 Subject: solutions to K2 --- Utils/k_2_SI/task2/Event/Event.cpp | 0 Utils/k_2_SI/task2/Event/Event.h | 30 +++++++ Utils/k_2_SI/task2/Event/EventTypeA.cpp | 57 ++++++++++++ Utils/k_2_SI/task2/Event/EventTypeA.h | 24 +++++ Utils/k_2_SI/task2/Event/EventTypeB.cpp | 19 ++++ Utils/k_2_SI/task2/Event/EventTypeB.h | 16 ++++ Utils/k_2_SI/task2/Event/EventTypeC.cpp | 22 +++++ Utils/k_2_SI/task2/Event/EventTypeC.h | 15 ++++ Utils/k_2_SI/task2/EventManager/EventManager.cpp | 110 +++++++++++++++++++++++ Utils/k_2_SI/task2/EventManager/EventManager.h | 30 +++++++ Utils/k_2_SI/task2/Events/Time.cpp | 0 Utils/k_2_SI/task2/Events/Time.h | 0 Utils/k_2_SI/task2/Source.cpp | 15 ++++ Utils/k_2_SI/task2/Time/Event.h | 0 Utils/k_2_SI/task2/Time/Time.cpp | 55 ++++++++++++ Utils/k_2_SI/task2/Time/Time.h | 20 +++++ 16 files changed, 413 insertions(+) create mode 100644 Utils/k_2_SI/task2/Event/Event.cpp create mode 100644 Utils/k_2_SI/task2/Event/Event.h create mode 100644 Utils/k_2_SI/task2/Event/EventTypeA.cpp create mode 100644 Utils/k_2_SI/task2/Event/EventTypeA.h create mode 100644 Utils/k_2_SI/task2/Event/EventTypeB.cpp create mode 100644 Utils/k_2_SI/task2/Event/EventTypeB.h create mode 100644 Utils/k_2_SI/task2/Event/EventTypeC.cpp create mode 100644 Utils/k_2_SI/task2/Event/EventTypeC.h create mode 100644 Utils/k_2_SI/task2/EventManager/EventManager.cpp create mode 100644 Utils/k_2_SI/task2/EventManager/EventManager.h delete mode 100644 Utils/k_2_SI/task2/Events/Time.cpp delete mode 100644 Utils/k_2_SI/task2/Events/Time.h create mode 100644 Utils/k_2_SI/task2/Source.cpp delete mode 100644 Utils/k_2_SI/task2/Time/Event.h create mode 100644 Utils/k_2_SI/task2/Time/Time.cpp create mode 100644 Utils/k_2_SI/task2/Time/Time.h diff --git a/Utils/k_2_SI/task2/Event/Event.cpp b/Utils/k_2_SI/task2/Event/Event.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Utils/k_2_SI/task2/Event/Event.h b/Utils/k_2_SI/task2/Event/Event.h new file mode 100644 index 0000000..f3a5c18 --- /dev/null +++ b/Utils/k_2_SI/task2/Event/Event.h @@ -0,0 +1,30 @@ +#pragma once +#include "../Time/Time.h" +class Event +{ + +public: + enum class EventType + { + typeA, + typeB, + typeC + }; + +protected: + Time start; + Time end; + + EventType type; +public: + + + Event(EventType type, size_t sHours, size_t sMins, size_t eHours, size_t eMins) : type(type), start(sHours, sMins), end(eHours, eMins){} + virtual ~Event() = default; + + virtual bool duringTime(const Time& time) const = 0; + virtual Time getLength() const = 0; + virtual Event* clone() const = 0; + + EventType getType() const { return type; } +}; \ No newline at end of file diff --git a/Utils/k_2_SI/task2/Event/EventTypeA.cpp b/Utils/k_2_SI/task2/Event/EventTypeA.cpp new file mode 100644 index 0000000..f8ad683 --- /dev/null +++ b/Utils/k_2_SI/task2/Event/EventTypeA.cpp @@ -0,0 +1,57 @@ +#include "EventTypeA.h" +#include + +void EventTypeA::copyFrom(const EventTypeA& other) +{ + name = new char[strlen(other.name) + 1]; + strcpy(name, other.name); +} +void EventTypeA::free() +{ + delete[] name; +} + +EventTypeA::EventTypeA(size_t startH, size_t startM, size_t endH, size_t endM, const char* name) : Event(type, startH, startM, endH, endM) +{ + setName(name); +} + +EventTypeA::EventTypeA(const EventTypeA& other) : Event(other) +{ + copyFrom(other); +} +EventTypeA& EventTypeA::operator=(const EventTypeA& other) +{ + if (this != &other) + { + Event::operator=(other); + free(); + copyFrom(other); + } + return *this; +} +EventTypeA::~EventTypeA() +{ + free(); +} + +void EventTypeA::setName(const char* name) +{ + delete[] this->name; + this->name = new char[strlen(name) + 1]; + strcpy(this->name, name); +} + +bool EventTypeA::duringTime(const Time& time) const +{ + return (start <= time) && (time <= end); +} +Time EventTypeA::getLength() const +{ + return end - start; +} + +Event* EventTypeA::clone() const +{ + return new EventTypeA(*this); +} diff --git a/Utils/k_2_SI/task2/Event/EventTypeA.h b/Utils/k_2_SI/task2/Event/EventTypeA.h new file mode 100644 index 0000000..cd3263f --- /dev/null +++ b/Utils/k_2_SI/task2/Event/EventTypeA.h @@ -0,0 +1,24 @@ +#include "Event.h" + +class EventTypeA : public Event +{ + char* name = nullptr; + + void copyFrom(const EventTypeA& other); + void free(); +public: + + EventTypeA(size_t startH, size_t startM, size_t endH, size_t endM, const char* name); + + EventTypeA(const EventTypeA& other); + EventTypeA& operator=(const EventTypeA& other); + ~EventTypeA(); + + void setName(const char* name); + + + bool duringTime(const Time& time) const override; + Time getLength() const override; + Event* clone() const override; + +}; \ No newline at end of file diff --git a/Utils/k_2_SI/task2/Event/EventTypeB.cpp b/Utils/k_2_SI/task2/Event/EventTypeB.cpp new file mode 100644 index 0000000..418b120 --- /dev/null +++ b/Utils/k_2_SI/task2/Event/EventTypeB.cpp @@ -0,0 +1,19 @@ +#include "EventTypeB.h" + +EventTypeB::EventTypeB(size_t startH, size_t startM, size_t endH, size_t endM, size_t break1H, size_t break1M) : Event(type, startH, startM, endH, endM), break1(break1H, break1M) +{} + +bool EventTypeB::duringTime(const Time& time) const +{ + return (start <= time && time <= break1) || + (break1 + Time(0, 5) <= time && time <= end); +} +Time EventTypeB::getLength() const +{ + return break1 - start + (end - (break1 + Time(0, 5))); //the 5 mins break +} + +Event* EventTypeB::clone() const +{ + return new EventTypeB(*this); +} diff --git a/Utils/k_2_SI/task2/Event/EventTypeB.h b/Utils/k_2_SI/task2/Event/EventTypeB.h new file mode 100644 index 0000000..e2ea2c9 --- /dev/null +++ b/Utils/k_2_SI/task2/Event/EventTypeB.h @@ -0,0 +1,16 @@ +#include "Event.h" + +class EventTypeB : public Event +{ + Time break1; + +public: + + EventTypeB(size_t startH, size_t startM, size_t endH, size_t endM, size_t breakH, size_t breakM); + + + bool duringTime(const Time& time) const override; + Time getLength() const override; + Event* clone() const override; + +}; \ No newline at end of file diff --git a/Utils/k_2_SI/task2/Event/EventTypeC.cpp b/Utils/k_2_SI/task2/Event/EventTypeC.cpp new file mode 100644 index 0000000..b8f3980 --- /dev/null +++ b/Utils/k_2_SI/task2/Event/EventTypeC.cpp @@ -0,0 +1,22 @@ +#include "EventTypeC.h" + +EventTypeC::EventTypeC(size_t startH, size_t startM, size_t endH, size_t endM, size_t break1H, size_t break1M, size_t break2H, size_t break2M) : Event(type, startH, startM, endH, endM), break1(break1H, break1M), break2(break2H, break2M) +{} + +bool EventTypeC::duringTime(const Time& time) const +{ + return start <= time && time <= break1 || + break1 + Time(0, 5) <= time && time <= break2 || + break2 + Time(0, 5) <= time && time <= end; +} + +Time EventTypeC::getLength() const +{ + return break1 - start + (break2 - (break1 + Time(0, 5))) //first break + + end - (break2 + Time(0, 5)); //second break +} + +Event* EventTypeC::clone() const +{ + return new EventTypeC(*this); +} diff --git a/Utils/k_2_SI/task2/Event/EventTypeC.h b/Utils/k_2_SI/task2/Event/EventTypeC.h new file mode 100644 index 0000000..b3833fb --- /dev/null +++ b/Utils/k_2_SI/task2/Event/EventTypeC.h @@ -0,0 +1,15 @@ +#include "Event.h" + +class EventTypeC : public Event +{ + Time break1; + Time break2; + +public: + + EventTypeC(size_t startH, size_t startM, size_t endH, size_t endM, size_t break1H, size_t break1M, size_t break2H, size_t break2M); + + bool duringTime(const Time& time) const override; + Time getLength() const override; + Event* clone() const override; +}; \ No newline at end of file diff --git a/Utils/k_2_SI/task2/EventManager/EventManager.cpp b/Utils/k_2_SI/task2/EventManager/EventManager.cpp new file mode 100644 index 0000000..2d56ec5 --- /dev/null +++ b/Utils/k_2_SI/task2/EventManager/EventManager.cpp @@ -0,0 +1,110 @@ +#include "EventManager.h" + +#include "../Event/EventTypeA.h" +#include "../Event/EventTypeB.h" +#include "../Event/EventTypeC.h" +#include + +void EventManager::free() +{ + for (size_t i = 0; i < eventsCount; i++) + delete events[i]; //не се инт. какъв обект е. (вирт дестр) + delete[] events; +} +void EventManager::copyFrom(const EventManager& other) +{ + events = new Event * [other.eventsCount]; + eventsCount = other.eventsCount; + capacity = other.capacity; + + for (size_t i = 0; i < eventsCount; i++) + { + events[i] = other.events[i]->clone(); + } +} + +void EventManager::resize() +{ + Event** newCollection = new Event * [capacity *= 2]; + for (size_t i = 0; i < eventsCount; i++) + newCollection[i] = events[i]; // !!не правим клониране + delete[] events; + events = newCollection; +} + +EventManager::EventManager() +{ + capacity = 8; + eventsCount = 0; + events = new Event * [capacity]; +} + +EventManager::EventManager(const EventManager& other) +{ + copyFrom(other); +} +EventManager& EventManager::operator=(const EventManager& other) +{ + if (this != &other) + { + free(); + copyFrom(other); + } + return *this; +} +EventManager::~EventManager() +{ + free(); +} + +void EventManager::addEvent(Event* event) +{ + if (eventsCount == capacity) + resize(); + events[eventsCount++] = event; //we dont make a copy here (it's a private function, called from creation funcions) +} + +//By including the Eventmanager we DONT include the 3 diffrent classes. +//Since the user DOES NOT KNOW about the 3 diffrent classes (A,B,C) the validation can be done here! + +void EventManager::addEventTypeA(size_t startH, size_t startM, size_t endH, size_t endM, const char* name) +{ + //validation + + addEvent(new EventTypeA(startH, startM, endH, endM, name)); +} +void EventManager::addEventTypeB(size_t startH, size_t startM, size_t breakH, size_t breakM, size_t endH, size_t endM) +{ + //validation + + addEvent(new EventTypeB(startH, startM, endH, endM, breakH, breakM)); +} +void EventManager::addEventTypeC(size_t startH, size_t startM, size_t break1H, size_t break1M, size_t break2H, size_t break2M, size_t endH, size_t endM) +{ + //validation + addEvent(new EventTypeC(startH, startM, endH, endM, break1H, break1M, break2H, break2M)); + +} +Time EventManager::getDuration(size_t ind) const +{ + if (ind >= eventsCount) + throw std::out_of_range("Out of range"); + return events[ind]->getLength(); +} +size_t EventManager::getEventsCountDuringTime(size_t hours, size_t mins) +{ + Time t(hours, mins); + size_t count = 0; + for (size_t i = 0; i < eventsCount; i++) + { + if (events[i]->duringTime(t)) + count++; + } + return count; +} +Event::EventType EventManager::getType(size_t ind) const +{ + if (ind >= eventsCount) + throw std::out_of_range("Out of range"); + return events[ind]->getType(); +} \ No newline at end of file diff --git a/Utils/k_2_SI/task2/EventManager/EventManager.h b/Utils/k_2_SI/task2/EventManager/EventManager.h new file mode 100644 index 0000000..8582265 --- /dev/null +++ b/Utils/k_2_SI/task2/EventManager/EventManager.h @@ -0,0 +1,30 @@ +#include "../Event/Event.h" +#include +class EventManager +{ + Event** events; + + void free(); + void copyFrom(const EventManager& other); + void resize(); + + void addEvent(Event* event); + + size_t eventsCount; + size_t capacity; + +public: + EventManager(); + EventManager(const EventManager& other); + EventManager& operator=(const EventManager& other); + ~EventManager(); + + + void addEventTypeA(size_t startH, size_t startM, size_t endH, size_t endM, const char* name); + void addEventTypeB(size_t startH, size_t startM, size_t breakH, size_t breakM, size_t endH, size_t endM); + void addEventTypeC(size_t startH, size_t startM, size_t break1H, size_t break1M, size_t break2H, size_t break2M, size_t endH, size_t endM); + + Time getDuration(size_t ind) const; + size_t getEventsCountDuringTime(size_t hours, size_t mins); + Event::EventType getType(size_t ind) const; +}; \ 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 deleted file mode 100644 index e69de29..0000000 diff --git a/Utils/k_2_SI/task2/Events/Time.h b/Utils/k_2_SI/task2/Events/Time.h deleted file mode 100644 index e69de29..0000000 diff --git a/Utils/k_2_SI/task2/Source.cpp b/Utils/k_2_SI/task2/Source.cpp new file mode 100644 index 0000000..44be6e2 --- /dev/null +++ b/Utils/k_2_SI/task2/Source.cpp @@ -0,0 +1,15 @@ +#include "EventManager/EventManager.h" +int main() +{ + EventManager em; + + em.addEventTypeA(10, 30, 12, 30, "ACS"); + em.addEventTypeB(11, 00, 12, 00, 13, 00); + + em.getDuration(0); + em.getDuration(1); + + std::cout<< em.getEventsCountDuringTime(12, 20); + + em.getType(1); +} \ No newline at end of file diff --git a/Utils/k_2_SI/task2/Time/Event.h b/Utils/k_2_SI/task2/Time/Event.h deleted file mode 100644 index e69de29..0000000 diff --git a/Utils/k_2_SI/task2/Time/Time.cpp b/Utils/k_2_SI/task2/Time/Time.cpp new file mode 100644 index 0000000..4ac891c --- /dev/null +++ b/Utils/k_2_SI/task2/Time/Time.cpp @@ -0,0 +1,55 @@ +#include "Time.h" + + +void Time::setHours(size_t hours) +{ + if (hours > 24) + hours = 24; + this->hours = hours; +} +void Time::setMins(size_t mins) +{ + if (mins > 59) + mins = 59; + this->mins = mins; +} +Time::Time(size_t hours, size_t mins) +{ + setHours(hours); + setMins(mins); +} + +bool operator<=(const Time& lhs, const Time& rhs) +{ + return lhs.getHours() * 60 + lhs.getMins() < rhs.getHours() * 60 + rhs.getMins(); +} + + +Time operator-(const Time& lhs, const Time& rhs) +{ + int res = lhs.getHours() * 60 + lhs.getMins() - (rhs.getHours() * 60 + rhs.getMins()); + + if (res < 0) + return Time(0, 0); + else + return Time(res / 60, res % 60); +} + + +size_t Time::getMins() const +{ + return mins; +} +size_t Time::getHours() const +{ + return hours; +} + +Time operator+(const Time& lhs, const Time& rhs) +{ + int res = lhs.getHours() * 60 + lhs.getMins() + rhs.getHours() * 60 + rhs.getMins(); + if (res > 24 * 60) + return Time(0, 0); + else + return Time(res / 60, res % 60); +} \ No newline at end of file diff --git a/Utils/k_2_SI/task2/Time/Time.h b/Utils/k_2_SI/task2/Time/Time.h new file mode 100644 index 0000000..b16e794 --- /dev/null +++ b/Utils/k_2_SI/task2/Time/Time.h @@ -0,0 +1,20 @@ +#pragma once +class Time +{ + size_t hours; + size_t mins; + + void setHours(size_t hours); + void setMins(size_t mins); + + +public: + Time(size_t hour, size_t min); + + size_t getMins() const; + size_t getHours() const; +}; + +bool operator<=(const Time& lhs, const Time& rhs); +Time operator-(const Time& lhs, const Time& rhs); +Time operator+(const Time& lhs, const Time& rhs); -- cgit v1.3.1-23-gd82d