Website Summary Files Commits Branches @commit @diff @stats
path: root / Utils / k_2_SI / task2 / EventManager / EventManager.cpp
blob: edc61ddae090bd2b46a224d717362fa240ddfcdd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#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)
{
	//validation
	addEvent(new EventTypeC(startH, startM, 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();
}