-
Notifications
You must be signed in to change notification settings - Fork 0
/
Company.cpp
108 lines (90 loc) · 2.75 KB
/
Company.cpp
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
107
108
#include "Company.h"
Company::Company(int companyID, int value) : companyID(companyID), value(value)
{
num_of_employees = 0;
highest_earner = nullptr;
employees_tree = AVLTree<Employee *>(Employee::compareByPointer);
employees_tree_by_salary = AVLTree<Employee *>(Employee::compareBySalary);
};
int Company::getCompanyID() const
{
return companyID;
}
int Company::getValue() const
{
return value;
}
int Company::getNumOfEmployees() const
{
return num_of_employees;
}
Employee* Company::getHighestEarner(){
return highest_earner;
}
void Company::setCompanyID(int newID){
companyID=newID;
}
void Company::setValue(int value){
this->value = value;
}
void Company::setHighesEarner(Employee* emp){
if (emp != nullptr &&
(highest_earner == nullptr || Employee::compareBySalary(highest_earner, emp)))
{
highest_earner = emp;
}
}
AVLTree<Employee *> *Company::getEmployeesTree()
{
return &employees_tree;
}
void Company::addEmployee(Employee* employee){
setHighesEarner(employee); // checking if the new employee is the new highest earner.
num_of_employees++;
employees_tree.insert(employee);
employees_tree_by_salary.insert(employee);
}
void Company::removeEmployee(Employee* employee){
employees_tree.remove(employee);
employees_tree_by_salary.remove(employee);
num_of_employees--;
if (employee == highest_earner) // if this employee was the richest
{
if (this->getNumOfEmployees() > 0)
{
highest_earner = employees_tree_by_salary.getHighest(); // set new one.
}
else
{
highest_earner = nullptr; // no employee in the company
}
}
}
void Company::merge(Company *company, double factor)
{
if (company == nullptr)
return;
num_of_employees += company->getNumOfEmployees();
this->setValue(factor * (company->getValue() + this->getValue()));
// company->updateIds(this->getCompanyID(), company->getEmployeesTree()->getRoot());
company->transferEmployees(this, company->getEmployeesTree()->getRoot());
employees_tree.merge(company->getEmployeesTree());
employees_tree_by_salary.merge(company->getEmployeesTreeBySalary());
setHighesEarner(company->getHighestEarner());
}
void Company::transferEmployees(Company *new_company, Node<Employee *> *current)
{
if (current == nullptr)
return;
current->getData()->setCompany(new_company);
transferEmployees(new_company, current->getLeft());
transferEmployees(new_company, current->getRight());
}
AVLTree<Employee *> *Company::getEmployeesTreeBySalary()
{
return &employees_tree_by_salary;
}
bool Company::compareByPointer(Company *const &a, Company *const &b)
{
return a->getCompanyID() < b->getCompanyID();
}