7#include <Atlas/Codecs/Packed.h>
16 Packed::Packed(std::istream &in, std::ostream &out,
Atlas::Bridge &b)
17 : m_istream(in), m_ostream(out), m_bridge(b) {
18 m_state.push(PARSE_NOTHING);
21 void Packed::parsingBegins(
char next) {
22 m_state.push(PARSE_STREAM);
23 m_bridge.streamBegin();
28 void Packed::parseStream(
char next) {
31 m_bridge.streamMessage();
32 m_state.push(PARSE_MAP);
42 void Packed::parseMap(
char next) {
50 m_state.push(PARSE_MAP);
51 m_state.push(PARSE_MAP_BEGIN);
52 m_state.push(PARSE_NAME);
56 m_state.push(PARSE_LIST);
57 m_state.push(PARSE_LIST_BEGIN);
58 m_state.push(PARSE_NAME);
62 m_state.push(PARSE_STRING);
63 m_state.push(PARSE_NAME);
67 m_state.push(PARSE_INT);
68 m_state.push(PARSE_NAME);
72 m_state.push(PARSE_FLOAT);
73 m_state.push(PARSE_NAME);
83 void Packed::parseList(
char next) {
91 m_bridge.listMapItem();
92 m_state.push(PARSE_MAP);
96 m_bridge.listListItem();
97 m_state.push(PARSE_LIST);
101 m_state.push(PARSE_STRING);
105 m_state.push(PARSE_INT);
109 m_state.push(PARSE_FLOAT);
119 void Packed::parseMapBegin(
char next) {
120 m_bridge.mapMapItem(hexDecode(std::move(m_name)));
121 m_istream.putback(next);
126 void Packed::parseListBegin(
char next) {
127 m_bridge.mapListItem(hexDecode(std::move(m_name)));
128 m_istream.putback(next);
133 void Packed::parseInt(
char next) {
142 m_istream.putback(next);
145 if (m_state.top() == PARSE_MAP) {
146 if (m_data.empty()) {
147 m_bridge.mapNoneItem(hexDecode(std::move(m_name)));
149 m_bridge.mapIntItem(hexDecode(std::move(m_name)), std::stol(m_data));
152 }
else if (m_state.top() == PARSE_LIST) {
153 if (m_data.empty()) {
154 m_bridge.listNoneItem();
156 m_bridge.listIntItem(std::stol(m_data));
163 if (m_state.top() == PARSE_MAP) {
192 void Packed::parseFloat(
char next) {
201 m_istream.putback(next);
205 if (m_state.top() == PARSE_MAP) {
206 m_bridge.mapFloatItem(hexDecode(std::move(m_name)), std::stod(m_data));
208 }
else if (m_state.top() == PARSE_LIST) {
209 m_bridge.listFloatItem(std::stod(m_data));
215 if (m_state.top() == PARSE_MAP) {
247 void Packed::parseString(
char next) {
256 m_istream.putback(next);
258 if (m_state.top() == PARSE_MAP) {
259 m_bridge.mapStringItem(hexDecode(std::move(m_name)), hexDecode(std::move(m_data)));
261 }
else if (m_state.top() == PARSE_LIST) {
262 m_bridge.listStringItem(hexDecode(std::move(m_data)));
280 void Packed::parseName(
char next) {
303 void Packed::poll() {
306 std::streamsize count;
308 while ((count = m_istream.rdbuf()->in_avail()) > 0) {
310 for (std::streamsize i = 0; i < count; ++i) {
312 char next = m_istream.rdbuf()->sbumpc();
314 switch (m_state.top()) {
327 case PARSE_MAP_BEGIN:
330 case PARSE_LIST_BEGIN:
331 parseListBegin(next);
350 void Packed::streamBegin() {
354 void Packed::streamMessage() {
358 void Packed::streamEnd() {
362 void Packed::mapMapItem(std::string name) {
363 m_ostream <<
'[' << hexEncode(std::move(name)) <<
'=';
366 void Packed::mapListItem(std::string name) {
367 m_ostream <<
'(' << hexEncode(std::move(name)) <<
'=';
370 void Packed::mapIntItem(std::string name, std::int64_t data) {
371 m_ostream <<
'@' << hexEncode(std::move(name)) <<
'=' << data;
374 void Packed::mapFloatItem(std::string name,
double data) {
375 m_ostream <<
'#' << hexEncode(std::move(name)) <<
'=' << data;
378 void Packed::mapStringItem(std::string name, std::string data) {
379 m_ostream <<
'$' << hexEncode(std::move(name)) <<
'=' << hexEncode(std::move(data));
382 void Packed::mapNoneItem(std::string name) {
383 m_ostream <<
'@' << hexEncode(std::move(name)) <<
'=';
386 void Packed::mapEnd() {
390 void Packed::listMapItem() {
394 void Packed::listListItem() {
398 void Packed::listIntItem(std::int64_t data) {
399 m_ostream <<
'@' << data;
402 void Packed::listFloatItem(
double data) {
403 m_ostream <<
'#' << data;
406 void Packed::listStringItem(std::string data) {
407 m_ostream <<
'$' << hexEncode(std::move(data));
410 void Packed::listNoneItem() {
415 void Packed::listEnd() {