-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLineManager.cpp
143 lines (103 loc) · 2.99 KB
/
LineManager.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
*****************************************************************************
Full Name : Ronald Roldan
Authenticity Declaration:
I declare this submission is the result of my own work and has not been
shared with any other student or 3rd party content provider. This submitted
piece of work is entirely of my own creation.
*****************************************************************************
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#include "LineManager.h"
#include "Utilities.h"
using namespace sdds;
using namespace std;
sdds::LineManager::LineManager(const std::string &file, const std::vector<Workstation *> &stations)
{
Utilities utill;
ifstream openfile(file);
if (!openfile.is_open()) {
throw string("Unable to open file.");
}
while (!openfile.eof())
{
string data;
size_t position = 0;
string activeStation;
string nextStation;
bool more = true;
Workstation* activeWorkstation = nullptr;
Workstation* nextWorkstation = nullptr;
getline(openfile, data);
activeStation = utill.extractToken(data, position, more);
if (more) {
nextStation = utill.extractToken(data, position, more);
}
for_each(stations.begin(), stations.end(), [&activeWorkstation, &nextWorkstation, activeStation, nextStation](Workstation* ws) {
if (ws->getItemName() == activeStation) {
activeWorkstation = ws;
}
else if (ws->getItemName() == nextStation) {
nextWorkstation = ws;
}
});
if (m_activeLine.size() == 0) {
m_firstStation = activeWorkstation;
}
activeWorkstation->setNextStation(nextWorkstation);
m_activeLine.push_back(activeWorkstation);
}
openfile.close();
}
void sdds::LineManager::reorderStations()
{
vector<Workstation*> tempStations;
Workstation* lastStation = nullptr;
unsigned int count = 0;
unsigned int size = m_activeLine.size();
while (count < size) {
for (unsigned int i = 0; i < size; i++)
{
if (m_activeLine[i]->getNextStation() == lastStation)
{
tempStations.push_back(m_activeLine[i]);
lastStation = m_activeLine[i];
count++;
break;
}
}
}
}
bool sdds::LineManager::run(std::ostream &os)
{
bool empty = true;
static unsigned int count = 0;
count++;
os << "Line Manager Iteration: " << count << endl;
if (!g_pending.empty()) {
(*m_firstStation) += move(g_pending.front());
g_pending.pop_front();
}
for (unsigned int i = 0; i < m_activeLine.size(); i++) {
m_activeLine[i]->fill(os);
}
for (unsigned int i = 0; i < m_activeLine.size(); i++) {
m_activeLine[i]->attemptToMoveOrder();
}
for (unsigned int i = 0; i < m_activeLine.size(); i++) {
if (!m_activeLine[i]->empty()) {
empty = false;
break;
}
}
return empty;
}
void sdds::LineManager::display(std::ostream &os) const
{
unsigned int size = m_activeLine.size();
for (unsigned int i = 0; i < size; i++) {
m_activeLine[i]->display(os);
}
}