@@ -48,7 +48,7 @@ namespace std {
48
48
[&s](const std::string &st) { s << " string(" << st << " )" ; },
49
49
[&s](const int64_t &i) { s << " int(" << i << " )" ; },
50
50
[&s](const double &d) { s << " double(" << d << " )" ; },
51
- [&s](const DataSet &arg) {
51
+ [&s](const TableRow &arg) {
52
52
s << " {" ;
53
53
for (const auto &v : arg)
54
54
{
@@ -65,6 +65,12 @@ namespace std {
65
65
s << t.m_key << " =" << t.m_value << (t.m_removed ? " :removed" : " " );
66
66
return s;
67
67
}
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
+ }
68
74
69
75
} // namespace std
70
76
#endif
@@ -75,6 +81,32 @@ namespace mtconnect::entity {
75
81
// / @brief Functions called when parsing data sets
76
82
namespace DataSetParserActions {
77
83
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
+
78
110
inline static void make_entry_f (DataSetEntry &entry, const string &key,
79
111
const boost::optional<DataSetValue> &v)
80
112
{
@@ -85,7 +117,7 @@ namespace mtconnect::entity {
85
117
entry.m_removed = true ;
86
118
}
87
119
inline static void make_entry_f (DataSetEntry &entry, const string &key,
88
- const boost::optional<DataSet > &v)
120
+ const boost::optional<TableRow > &v)
89
121
{
90
122
entry.m_key = key;
91
123
if (v)
@@ -95,6 +127,7 @@ namespace mtconnect::entity {
95
127
}
96
128
}; // namespace DataSetParserActions
97
129
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 );
98
131
BOOST_PHOENIX_ADAPT_FUNCTION (void , make_entry, DataSetParserActions::make_entry_f, 3 );
99
132
100
133
// / @brief Parser to turn adapter text in `key=value ...` or `key={col1=value ...}` syntax into a
@@ -153,15 +186,15 @@ namespace mtconnect::entity {
153
186
m_entry = (m_key >> -(" =" >> -m_value))[make_entry (_val, _1, _2)];
154
187
155
188
// 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);
158
191
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 (' }' );
161
194
162
- m_tableValue %= (m_quotedDataSet | m_bracedDataSet );
195
+ m_tableRow %= (m_quotedTableRow | m_bracedTableRow );
163
196
m_tableEntry = (m_key >> -(" =" > &(space | lit (' {' ) | ' \' ' | ' "' ) >>
164
- -m_tableValue ))[make_entry (_val, _1, _2)];
197
+ -m_tableRow ))[make_entry (_val, _1, _2)];
165
198
166
199
if (table)
167
200
{
@@ -173,7 +206,7 @@ namespace mtconnect::entity {
173
206
}
174
207
175
208
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));
177
210
178
211
m_start.name (" top" );
179
212
m_simple.name (" simple" );
@@ -183,9 +216,9 @@ namespace mtconnect::entity {
183
216
m_simple.name (" simple" );
184
217
m_quoted.name (" quoted" );
185
218
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 " );
189
222
m_tableEntry.name (" table entry" );
190
223
191
224
using namespace boost ::fusion;
@@ -210,9 +243,9 @@ namespace mtconnect::entity {
210
243
qi::rule<It, DataSetValue()> m_value;
211
244
qi::rule<It, DataSetEntry()> m_entry;
212
245
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 ;
216
249
qi::rule<It, DataSetEntry()> m_tableEntry;
217
250
};
218
251
0 commit comments