Skip to content

Commit be2b4b8

Browse files
committed
Refactored to use TableRow and TableCell types for Tables
1 parent 81cc714 commit be2b4b8

16 files changed

+488
-267
lines changed

src/mtconnect/entity/data_set.cpp

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ namespace std {
4848
[&s](const std::string &st) { s << "string(" << st << ")"; },
4949
[&s](const int64_t &i) { s << "int(" << i << ")"; },
5050
[&s](const double &d) { s << "double(" << d << ")"; },
51-
[&s](const DataSet &arg) {
51+
[&s](const TableRow &arg) {
5252
s << "{";
5353
for (const auto &v : arg)
5454
{
@@ -65,6 +65,12 @@ namespace std {
6565
s << t.m_key << "=" << t.m_value << (t.m_removed ? ":removed" : "");
6666
return s;
6767
}
68+
69+
static inline ostream &operator<<(ostream &s, const mtconnect::observation::TableCell &t)
70+
{
71+
s << t.m_key << "=" << t.m_value;
72+
return s;
73+
}
6874

6975
} // namespace std
7076
#endif
@@ -75,6 +81,32 @@ namespace mtconnect::entity {
7581
/// @brief Functions called when parsing data sets
7682
namespace DataSetParserActions {
7783
inline static void add_entry_f(DataSet &ds, const DataSetEntry &entry) { ds.emplace(entry); }
84+
85+
struct TableCellConverter {
86+
TableCellConverter(TableCellValue &value) : m_value(value) { }
87+
88+
void operator()(const TableRow &row)
89+
{
90+
LOG(error) << "Table row cannot recurse";
91+
}
92+
93+
template<typename T>
94+
void operator()(const T &v)
95+
{
96+
m_value.emplace<T>(v);
97+
}
98+
99+
TableCellValue &m_value;
100+
};
101+
102+
inline static void add_cell_f(TableRow &row, const DataSetEntry &entry)
103+
{
104+
TableCell cell(entry.m_key);
105+
cell.m_removed = entry.m_removed;
106+
std::visit(TableCellConverter(cell.m_value), entry.m_value);
107+
row.emplace(cell);
108+
}
109+
78110
inline static void make_entry_f(DataSetEntry &entry, const string &key,
79111
const boost::optional<DataSetValue> &v)
80112
{
@@ -85,7 +117,7 @@ namespace mtconnect::entity {
85117
entry.m_removed = true;
86118
}
87119
inline static void make_entry_f(DataSetEntry &entry, const string &key,
88-
const boost::optional<DataSet> &v)
120+
const boost::optional<TableRow> &v)
89121
{
90122
entry.m_key = key;
91123
if (v)
@@ -95,6 +127,7 @@ namespace mtconnect::entity {
95127
}
96128
}; // namespace DataSetParserActions
97129
BOOST_PHOENIX_ADAPT_FUNCTION(void, add_entry, DataSetParserActions::add_entry_f, 2);
130+
BOOST_PHOENIX_ADAPT_FUNCTION(void, add_cell, DataSetParserActions::add_cell_f, 2);
98131
BOOST_PHOENIX_ADAPT_FUNCTION(void, make_entry, DataSetParserActions::make_entry_f, 3);
99132

100133
/// @brief Parser to turn adapter text in `key=value ...` or `key={col1=value ...}` syntax into a
@@ -153,15 +186,15 @@ namespace mtconnect::entity {
153186
m_entry = (m_key >> -("=" >> -m_value))[make_entry(_val, _1, _2)];
154187

155188
// Table support with quoted and braced content
156-
m_quotedDataSet =
157-
(char_("\"'")[_a = _1] >> *space >> *(m_entry[add_entry(_val, _1)] >> *space)) > lit(_a);
189+
m_quotedTableRow =
190+
(char_("\"'")[_a = _1] >> *space >> *(m_entry[add_cell(_val, _1)] >> *space)) > lit(_a);
158191

159-
m_bracedDataSet =
160-
(lit('{') >> *space >> *(m_entry[add_entry(_val, _1)] >> *space)) > lit('}');
192+
m_bracedTableRow =
193+
(lit('{') >> *space >> *(m_entry[add_cell(_val, _1)] >> *space)) > lit('}');
161194

162-
m_tableValue %= (m_quotedDataSet | m_bracedDataSet);
195+
m_tableRow %= (m_quotedTableRow | m_bracedTableRow);
163196
m_tableEntry = (m_key >> -("=" > &(space | lit('{') | '\'' | '"') >>
164-
-m_tableValue))[make_entry(_val, _1, _2)];
197+
-m_tableRow))[make_entry(_val, _1, _2)];
165198

166199
if (table)
167200
{
@@ -173,7 +206,7 @@ namespace mtconnect::entity {
173206
}
174207

175208
BOOST_SPIRIT_DEBUG_NODES((
176-
m_start)(m_quoted)(m_braced)(m_key)(m_value)(m_entry)(m_simple)(m_quoted)(m_tableValue)(m_quotedDataSet)(m_bracedDataSet)(m_tableEntry));
209+
m_start)(m_quoted)(m_braced)(m_key)(m_value)(m_entry)(m_simple)(m_quoted)(m_quotedTableRow)(m_bracedTableRow)(m_tableEntry));
177210

178211
m_start.name("top");
179212
m_simple.name("simple");
@@ -183,9 +216,9 @@ namespace mtconnect::entity {
183216
m_simple.name("simple");
184217
m_quoted.name("quoted");
185218

186-
m_tableValue.name("table value");
187-
m_quotedDataSet.name("quoted data set");
188-
m_bracedDataSet.name("braced data set");
219+
m_tableEntry.name("table value");
220+
m_quotedTableRow.name("quoted table row");
221+
m_bracedTableRow.name("braced table row");
189222
m_tableEntry.name("table entry");
190223

191224
using namespace boost::fusion;
@@ -210,9 +243,9 @@ namespace mtconnect::entity {
210243
qi::rule<It, DataSetValue()> m_value;
211244
qi::rule<It, DataSetEntry()> m_entry;
212245

213-
qi::rule<It, DataSet(), qi::locals<char>> m_quotedDataSet;
214-
qi::rule<It, DataSet()> m_bracedDataSet;
215-
qi::rule<It, DataSet()> m_tableValue;
246+
qi::rule<It, TableRow(), qi::locals<char>> m_quotedTableRow;
247+
qi::rule<It, TableRow()> m_bracedTableRow;
248+
qi::rule<It, TableRow()> m_tableRow;
216249
qi::rule<It, DataSetEntry()> m_tableEntry;
217250
};
218251

0 commit comments

Comments
 (0)