Skip to content

Commit 67f584a

Browse files
committed
Finishing up the CMDP implementation
Details: - Making the types accessible in DataLine - Making the types accessible in DataPoint - Making the types accessible in Diagram - Removing the DataLineId feature from DataLine - Switching to using OrderedDict as the container in Diagram - Not removing the whitespaces from the data to fix messing up the titles with spaces - Added checks for duplicate DataLine IDs - Added checks for not-existing DataLine IDs - Updating the MDP with DataLine IDs (not used in MDP) - Adding copy and move constructors and operators to OrderedDict - Adding duplicate key check for push_back() and emplace_back() in OrderedDict - Fixing the push_back() signature in OrderedDict - Adding begin() and end() to OrderedDict - Adding new tests for the rest of the CMDP test files - Updating the DataLine unit tests - Updating the OrderedDict unit tests
1 parent 11514ec commit 67f584a

10 files changed

+138
-122
lines changed

application/sources/continous_measurement_data_protocol.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,12 @@ std::string ContinousMeasurementDataProtocol::GetProtocolName(void)
3838
std::vector<DiagramSpecialized> ContinousMeasurementDataProtocol::ProcessData(std::istream& input_data)
3939
{
4040
std::vector<DiagramSpecialized> assembled_diagrams;
41-
std::string received_data;
4241
std::string actual_line_std_string;
43-
QString actual_line;
4442

4543
while(std::getline(input_data, actual_line_std_string))
4644
{
4745
QRegularExpressionMatch match;
48-
49-
// Removing the whitespaces from the actual line
50-
actual_line_std_string.erase(std::remove_if(actual_line_std_string.begin(), actual_line_std_string.end(), isspace), actual_line_std_string.end());
51-
actual_line = QString::fromStdString(actual_line_std_string);
46+
QString actual_line = QString::fromStdString(actual_line_std_string);
5247

5348
switch(state)
5449
{
@@ -98,9 +93,14 @@ std::vector<DiagramSpecialized> ContinousMeasurementDataProtocol::ProcessData(st
9893
while(regex_iterator.hasNext())
9994
{
10095
auto match = regex_iterator.next();
101-
auto y_index = match.captured("id");
96+
auto y_id = match.captured("id");
10297
auto y_title = match.captured("title");
103-
actual_diagram.AddNewDataLine(y_index.toStdString(), y_title.toStdString());
98+
99+
// Adding the new dataline to the diagram, if we fail (because of duplicate IDs) then we drop this diagram
100+
if(!actual_diagram.AddNewDataLine(y_id.toStdString(), y_title.toStdString()))
101+
{
102+
state = Constants::States::WaitingForHeaderMessageStart;
103+
}
104104
}
105105

106106
state = Constants::States::WaitingForHeaderMessageEnd;
@@ -147,9 +147,18 @@ std::vector<DiagramSpecialized> ContinousMeasurementDataProtocol::ProcessData(st
147147
while(regex_iterator.hasNext())
148148
{
149149
auto match = regex_iterator.next();
150-
auto y_index = match.captured("id");
150+
auto y_id = match.captured("id");
151151
auto y_value = match.captured("value");
152-
actual_diagram.AddNewDataPoint(y_index.toStdString(), DataPointSpecialized(x_value.toDouble(), y_value.toDouble()));
152+
153+
// Checking whether the dataline existsm if not we are dropping this diagram
154+
if(actual_diagram.HasDataLine(y_id.toStdString()))
155+
{
156+
actual_diagram.AddNewDataPoint(y_id.toStdString(), DataPointSpecialized(x_value.toDouble(), y_value.toDouble()));
157+
}
158+
else
159+
{
160+
state = Constants::States::WaitingForHeaderMessageStart;
161+
}
153162
}
154163
}
155164
else

application/sources/data_line.hpp

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ template <typename T_DATA_POINT, typename T_INDEX >
4040
class DataLine
4141
{
4242
public:
43-
explicit DataLine(const std::string& newDataLineId = invalid_id,
44-
const std::string& newDataLineTitle = "") : DataLineId(newDataLineId), DataLineTitle(newDataLineTitle) {}
43+
using coordinate_t = T_DATA_POINT;
44+
using index_t = T_INDEX;
45+
46+
explicit DataLine(const std::string& newDataLineTitle = "") : DataLineTitle(newDataLineTitle) {}
4547

4648
DataLine(const DataLine& newDataLine) = default;
4749
DataLine(DataLine&& newDataLine) = default;
@@ -61,48 +63,38 @@ class DataLine
6163
DataLineTitle = newDataLineTitle;
6264
}
6365

64-
inline std::string GetId(void) const
65-
{
66-
return DataLineId;
67-
}
68-
69-
inline void SetId(const std::string& newDataLineId)
70-
{
71-
DataLineId = newDataLineId;
72-
}
73-
74-
inline void AddNewDataPoint(const DataPoint<T_DATA_POINT>& newDataPoint)
66+
inline void AddNewDataPoint(const DataPoint<coordinate_t>& newDataPoint)
7567
{
7668
Data.push_back(newDataPoint);
7769
}
7870

79-
inline DataLine<T_DATA_POINT, T_INDEX>& operator<<(const DataPoint<T_DATA_POINT>& newDataPoint)
71+
inline DataLine<coordinate_t, index_t>& operator<<(const DataPoint<coordinate_t>& newDataPoint)
8072
{
8173
AddNewDataPoint(newDataPoint);
8274
return *this;
8375
}
8476

85-
inline T_INDEX GetTheNumberOfDataPoints(void) const
77+
inline index_t GetTheNumberOfDataPoints(void) const
8678
{
8779
return Data.size();
8880
}
8981

90-
inline const DataPoint<T_DATA_POINT> GetDataPoint(const T_INDEX& dataPointIndex) const
82+
inline const DataPoint<coordinate_t> GetDataPoint(const index_t& dataPointIndex) const
9183
{
9284
CheckDataPointIndex(dataPointIndex);
9385

9486
return Data[dataPointIndex];
9587
}
9688

97-
inline void SetDataPoint(const T_INDEX& dataPointIndex, const DataPoint<T_DATA_POINT>& newDataPoint)
89+
inline void SetDataPoint(const index_t& dataPointIndex, const DataPoint<coordinate_t>& newDataPoint)
9890
{
9991
CheckDataPointIndex(dataPointIndex);
10092

10193
Data[dataPointIndex] = newDataPoint;
10294
}
10395

104-
inline const DataPoint<T_DATA_POINT> GetDataPointWithMinValue(const std::function<bool(DataPoint<T_DATA_POINT>,
105-
DataPoint<T_DATA_POINT>)>& compare) const
96+
inline const DataPoint<coordinate_t> GetDataPointWithMinValue(const std::function<bool(DataPoint<coordinate_t>,
97+
DataPoint<coordinate_t>)>& compare) const
10698
{
10799
auto min_value = std::min_element(Data.begin(), Data.end(), compare);
108100

@@ -115,8 +107,8 @@ class DataLine
115107
return *min_value;
116108
}
117109

118-
inline const DataPoint<T_DATA_POINT> GetDataPointWithMaxValue(const std::function<bool(DataPoint<T_DATA_POINT>,
119-
DataPoint<T_DATA_POINT>)>& compare) const
110+
inline const DataPoint<coordinate_t> GetDataPointWithMaxValue(const std::function<bool(DataPoint<coordinate_t>,
111+
DataPoint<coordinate_t>)>& compare) const
120112
{
121113
auto max_value = std::max_element(Data.begin(), Data.end(), compare);
122114

@@ -129,10 +121,8 @@ class DataLine
129121
return *max_value;
130122
}
131123

132-
static constexpr char invalid_id[] = "invalid_id";
133-
134124
private:
135-
void CheckDataPointIndex(const T_INDEX& dataPointIndex) const
125+
void CheckDataPointIndex(const index_t& dataPointIndex) const
136126
{
137127
if(Data.size() <= dataPointIndex)
138128
{
@@ -144,9 +134,8 @@ class DataLine
144134
}
145135
}
146136

147-
std::string DataLineId;
148137
std::string DataLineTitle;
149-
std::vector<DataPoint<T_DATA_POINT> > Data;
138+
std::vector<DataPoint<coordinate_t> > Data;
150139
};
151140

152141

application/sources/data_point.hpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ template <typename T_DATA_POINT>
3434
class DataPoint
3535
{
3636
public:
37-
DataPoint(const T_DATA_POINT& newX = 0, const T_DATA_POINT& newY = 0) : x(newX), y(newY) {}
37+
using coordinate_t = T_DATA_POINT;
38+
39+
DataPoint(const coordinate_t& newX = 0, const coordinate_t& newY = 0) : x(newX), y(newY) {}
3840
DataPoint(const DataPoint& newDataPoint) : x(newDataPoint.x), y(newDataPoint.y) {}
3941
DataPoint(DataPoint&& newDataPoint) : x(newDataPoint.x), y(newDataPoint.y) {}
4042

@@ -45,24 +47,24 @@ class DataPoint
4547
bool operator==(const DataPoint& other) const {return ((x == other.x) && (y == other.y));}
4648
bool operator!=(const DataPoint& other) const {return !(*this == other);}
4749

48-
inline const T_DATA_POINT GetX(void) const {return x;}
49-
inline const T_DATA_POINT GetY(void) const {return y;}
50+
inline const coordinate_t GetX(void) const {return x;}
51+
inline const coordinate_t GetY(void) const {return y;}
5052

51-
inline static const T_DATA_POINT GetXValueOf(const DataPoint& object) {return object.GetX();}
52-
inline static const T_DATA_POINT GetYValueOf(const DataPoint& object) {return object.GetY();}
53+
inline static const coordinate_t GetXValueOf(const DataPoint& object) {return object.GetX();}
54+
inline static const coordinate_t GetYValueOf(const DataPoint& object) {return object.GetY();}
5355

54-
inline void SetX(const T_DATA_POINT newX = 0) {x = newX;}
55-
inline void SetY(const T_DATA_POINT newY = 0) {y = newY;}
56+
inline void SetX(const coordinate_t newX = 0) {x = newX;}
57+
inline void SetY(const coordinate_t newY = 0) {y = newY;}
5658

57-
inline static void SetXValueOf(DataPoint& object, const T_DATA_POINT newX = 0) {object.SetX(newX);}
58-
inline static void SetYValueOf(DataPoint& object, const T_DATA_POINT newY = 0) {object.SetY(newY);}
59+
inline static void SetXValueOf(DataPoint& object, const coordinate_t newX = 0) {object.SetX(newX);}
60+
inline static void SetYValueOf(DataPoint& object, const coordinate_t newY = 0) {object.SetY(newY);}
5961

6062
inline static bool CompareXValues(const DataPoint& object_A, const DataPoint& object_B) {return (GetXValueOf(object_A) < GetXValueOf(object_B));}
6163
inline static bool CompareYValues(const DataPoint& object_A, const DataPoint& object_B) {return (GetYValueOf(object_A) < GetYValueOf(object_B));}
6264

6365
private:
64-
T_DATA_POINT x;
65-
T_DATA_POINT y;
66+
coordinate_t x;
67+
coordinate_t y;
6668
};
6769

6870

application/sources/diagram.hpp

Lines changed: 31 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222

2323

2424
#include <string>
25-
#include <vector>
2625
#include <algorithm>
2726

2827
#include "global.hpp"
28+
#include "ordered_dict.h"
2929
#include "data_point.hpp"
3030
#include "data_line.hpp"
3131

@@ -39,8 +39,11 @@
3939
template <typename T_DATA_POINT, typename T_INDEX >
4040
class Diagram {
4141
public:
42-
using DataLine_t = DataLine<T_DATA_POINT, T_INDEX>;
43-
using DataPoint_t = DataPoint<T_DATA_POINT>;
42+
using coordinate_t = T_DATA_POINT;
43+
using index_t = T_INDEX;
44+
using DataPoint_t = DataPoint<coordinate_t>;
45+
using DataLine_t = DataLine<coordinate_t, index_t>;
46+
using DataContainer_t = OrderedDict<DataLine_t>;
4447

4548
Diagram(const std::string& newDiagramTitle = "", const std::string& newAxisXTitle = "") : DiagramTitle(newDiagramTitle), AxisXTitle(newAxisXTitle) {}
4649

@@ -72,102 +75,75 @@ class Diagram {
7275
AxisXTitle = newAxisXTitle;
7376
}
7477

75-
void AddNewDataLine(const std::string& newDataLineId = DataLine_t::invalid_id,
78+
bool AddNewDataLine(const std::string& newDataLineId,
7679
const std::string& newDataLineTitle = "")
7780
{
78-
Data.push_back(DataLine_t(newDataLineId, newDataLineTitle));
81+
return Data.emplace_back(newDataLineId, DataLine_t(newDataLineTitle));
7982
}
8083

81-
inline const T_INDEX GetTheNumberOfDataLines(void) const
84+
inline bool HasDataLine(const index_t& dataLineIndex) const
8285
{
83-
return Data.size();
86+
return (!Data.empty() && (dataLineIndex <= GetTheNumberOfDataLines()));
8487
}
8588

86-
inline const std::string GetDataLineTitle(const T_INDEX& dataLineIndex) const
89+
inline bool HasDataLine(const std::string& dataLineId) const
8790
{
88-
CheckDataLineIndex(dataLineIndex);
89-
90-
return Data[dataLineIndex].GetTitle();
91+
return Data.hasKey(dataLineId);
9192
}
9293

93-
inline void SetDataLineTitle(const T_INDEX& dataLineIndex, const std::string& newDataLineTitle)
94+
inline const index_t GetTheNumberOfDataLines(void) const
9495
{
95-
CheckDataLineIndex(dataLineIndex);
96-
97-
Data[dataLineIndex].SetTitle(newDataLineTitle);
96+
return Data.size();
9897
}
9998

100-
inline std::string GetDataLineId(const T_INDEX& dataLineIndex) const
99+
inline const std::string GetDataLineTitle(const index_t& dataLineIndex) const
101100
{
102101
CheckDataLineIndex(dataLineIndex);
103102

104-
return Data[dataLineIndex].GetId();
103+
return Data[dataLineIndex].GetTitle();
105104
}
106105

107-
inline void SetDataLineId(const T_INDEX& dataLineIndex, const std::string& newDataLineId)
106+
inline void SetDataLineTitle(const index_t& dataLineIndex, const std::string& newDataLineTitle)
108107
{
109108
CheckDataLineIndex(dataLineIndex);
110109

111-
Data[dataLineIndex].SetId(newDataLineId);
112-
}
113-
114-
inline bool GetDataLineIndex(const std::string& dataLineId, T_INDEX& dataLineIndex) const
115-
{
116-
bool result = false;
117-
dataLineIndex = 0;
118-
119-
for(auto const& dataLine : Data)
120-
{
121-
if(dataLine.GetId() == dataLineId)
122-
{
123-
result = true;
124-
break;
125-
}
126-
dataLineIndex++;
127-
}
128-
129-
return result;
110+
Data[dataLineIndex].SetTitle(newDataLineTitle);
130111
}
131112

132-
void AddNewDataPoint(T_INDEX dataLineIndex, const DataPoint_t& newDataPoint)
113+
void AddNewDataPoint(const index_t& dataLineIndex, const DataPoint_t& newDataPoint)
133114
{
134115
CheckDataLineIndex(dataLineIndex);
135116

136117
Data[dataLineIndex].AddNewDataPoint(newDataPoint);
137118
}
138119

139-
void AddNewDataPoint(std::string dataLineId, const DataPoint_t& newDataPoint)
120+
void AddNewDataPoint(const std::string& dataLineId, const DataPoint_t& newDataPoint)
140121
{
141-
T_INDEX data_line_index = 0;
142-
143-
if(GetDataLineIndex(dataLineId, data_line_index))
144-
{
145-
Data[data_line_index].AddNewDataPoint(newDataPoint);
146-
}
122+
Data[dataLineId].AddNewDataPoint(newDataPoint);
147123
}
148124

149-
inline const T_INDEX GetTheNumberOfDataPoints(const T_INDEX& dataLineIndex) const
125+
inline const index_t GetTheNumberOfDataPoints(const index_t& dataLineIndex) const
150126
{
151127
CheckDataLineIndex(dataLineIndex);
152128

153129
return Data[dataLineIndex].GetTheNumberOfDataPoints();
154130
}
155131

156-
inline const DataPoint_t GetDataPoint(const T_INDEX& dataLineIndex, const T_INDEX& dataPointIndex) const
132+
inline const DataPoint_t GetDataPoint(const index_t& dataLineIndex, const index_t& dataPointIndex) const
157133
{
158134
CheckDataLineIndex(dataLineIndex);
159135

160136
return Data[dataLineIndex].GetDataPoint(dataPointIndex);
161137
}
162138

163-
void SetDataPoint(const T_INDEX& dataLineIndex, const T_INDEX& dataPointIndex, const DataPoint_t& newDataPoint)
139+
void SetDataPoint(const index_t& dataLineIndex, const index_t& dataPointIndex, const DataPoint_t& newDataPoint)
164140
{
165141
CheckDataLineIndex(dataLineIndex);
166142

167143
Data[dataLineIndex].SetDataPoint(dataPointIndex, newDataPoint);
168144
}
169145

170-
std::pair<DataPoint_t, DataPoint_t> GetExtremeValues(const T_INDEX& dataLineIndex) const
146+
std::pair<DataPoint_t, DataPoint_t> GetExtremeValues(const index_t& dataLineIndex) const
171147
{
172148
CheckDataLineIndex(dataLineIndex);
173149

@@ -192,10 +168,10 @@ class Diagram {
192168

193169
for(const auto& i : Data)
194170
{
195-
data_points_with_min_x_values.AddNewDataPoint(i.GetDataPointWithMinValue(DataPoint_t::CompareXValues));
196-
data_points_with_max_x_values.AddNewDataPoint(i.GetDataPointWithMaxValue(DataPoint_t::CompareXValues));
197-
data_points_with_min_y_values.AddNewDataPoint(i.GetDataPointWithMinValue(DataPoint_t::CompareYValues));
198-
data_points_with_max_y_values.AddNewDataPoint(i.GetDataPointWithMaxValue(DataPoint_t::CompareYValues));
171+
data_points_with_min_x_values.AddNewDataPoint(i.second.GetDataPointWithMinValue(DataPoint_t::CompareXValues));
172+
data_points_with_max_x_values.AddNewDataPoint(i.second.GetDataPointWithMaxValue(DataPoint_t::CompareXValues));
173+
data_points_with_min_y_values.AddNewDataPoint(i.second.GetDataPointWithMinValue(DataPoint_t::CompareYValues));
174+
data_points_with_max_y_values.AddNewDataPoint(i.second.GetDataPointWithMaxValue(DataPoint_t::CompareYValues));
199175
}
200176

201177
auto min_x_value = data_points_with_min_x_values.GetDataPointWithMinValue(DataPoint_t::CompareXValues).GetX();
@@ -222,7 +198,7 @@ class Diagram {
222198
}
223199

224200
private:
225-
void CheckDataLineIndex(const T_INDEX& dataLineIndex) const
201+
void CheckDataLineIndex(const index_t& dataLineIndex) const
226202
{
227203
if(Data.size() <= dataLineIndex)
228204
{
@@ -236,7 +212,7 @@ class Diagram {
236212

237213
std::string DiagramTitle;
238214
std::string AxisXTitle;
239-
std::vector<DataLine_t> Data;
215+
DataContainer_t Data;
240216
};
241217

242218

0 commit comments

Comments
 (0)