Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
diff --git a/Utils/k_2_SI/task2/Events/Time.cpp b/Utils/k_2_SI/task2/Event/Event.cpp
index e69de29..e69de29 100644
--- a/Utils/k_2_SI/task2/Events/Time.cpp
+++ b/Utils/k_2_SI/task2/Event/Event.cpp
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 <cstring>
+
+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 <exception>
+
+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 <iostream>
+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.h b/Utils/k_2_SI/task2/Events/Time.h
deleted file mode 100644
index e69de29..0000000
--- a/Utils/k_2_SI/task2/Events/Time.h
+++ /dev/null
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
--- a/Utils/k_2_SI/task2/Time/Event.h
+++ /dev/null
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);