stream operator overloads for pdu_stream_object.

This commit is contained in:
Kevin Matz 2021-08-20 09:58:59 -04:00
parent e5539ffc37
commit 1c9f1e3769
10 changed files with 58 additions and 34 deletions

View File

@ -163,7 +163,7 @@ void address_pair_list::oStream(PDU::Stream stream) const
{ {
for (const auto & [range, vect] : properties) for (const auto & [range, vect] : properties)
{ {
range.oStream(stream); *stream << range;
for (uint8_t d : vect) for (uint8_t d : vect)
*stream << d; *stream << d;
} }
@ -191,9 +191,8 @@ void address_list::iStream(PDU::Stream stream)
while(stream->good()) while(stream->good())
{ {
// Property Address // Property Address
range pr(type_->type, type_->width); addresses.emplace_back(range(type_->type, type_->width));
pr.iStream(stream); *stream >> addresses.back();
addresses.push_back(pr);
//set EOF if buffer insufficient for another property range //set EOF if buffer insufficient for another property range
if (stream->available() < address_width(type_->width) * if (stream->available() < address_width(type_->width) *
@ -209,7 +208,7 @@ void address_list::iStream(PDU::Stream stream)
void address_list::oStream(PDU::Stream stream) const void address_list::oStream(PDU::Stream stream) const
{ {
for (const auto & addr : addresses) for (const auto & addr : addresses)
addr.oStream(stream); *stream << addr;
} }
@ -239,12 +238,12 @@ void Pdu::iStream(PDU::Stream stream)
auto dataIsAddressList = [this, header] () { auto dataIsAddressList = [this, header] () {
data_ = new address_list(header); data_ = new address_list(header);
data_->iStream(stream_); *stream_ >> *data_;
}; };
auto dataIsAdddresPairList = [this, header] () { auto dataIsAdddresPairList = [this, header] () {
data_ = new address_pair_list(header); data_ = new address_pair_list(header);
data_->iStream(stream_); *stream_ >> *data_;
}; };
switch(vector()) { switch(vector()) {

View File

@ -76,6 +76,18 @@ void pdu_stream::writeString(const std::string &str, const int fixed_length)
} }
/**
* @brief pdu_stream::operator >>
* @param obj
* @return
*/
pdu_stream& pdu_stream::operator>> (pdu_stream_object& obj)
{
obj.iStream(shared_from_this());
return *this;
}
/** /**
* @brief pdu_stream::operator >> * @brief pdu_stream::operator >>
* @param val * @param val
@ -143,6 +155,18 @@ pdu_stream& pdu_stream::operator>> (UUID::uuid& uuid)
}; };
/**
* @brief pdu_stream::operator <<
* @param obj
* @return
*/
pdu_stream& pdu_stream::operator<< (const pdu_stream_object& obj)
{
obj.oStream(shared_from_this());
return *this;
}
/** /**
* @brief pdu_stream::operator << * @brief pdu_stream::operator <<
* @param val * @param val

View File

@ -31,11 +31,14 @@
namespace ACN { namespace ACN {
namespace PDU { namespace PDU {
struct pdu_stream_object;
/** /**
* @brief Input/Output stream of nested PDU * @brief Input/Output stream of nested PDU
*/ */
class pdu_stream class pdu_stream
: private std::basic_streambuf<uint8_t> : public std::enable_shared_from_this<pdu_stream>
, private std::basic_streambuf<uint8_t>
, public std::basic_iostream<uint8_t> , public std::basic_iostream<uint8_t>
{ {
public: public:
@ -44,6 +47,7 @@ public:
// input sequence // input sequence
uint32_t available() { return in_avail(); } uint32_t available() { return in_avail(); }
uint8_t * data() { return gptr(); } uint8_t * data() { return gptr(); }
pdu_stream& operator>> (pdu_stream_object& obj);
pdu_stream& operator>> (uint8_t& val); pdu_stream& operator>> (uint8_t& val);
pdu_stream& operator>> (uint16_t& val); pdu_stream& operator>> (uint16_t& val);
pdu_stream& operator>> (uint32_t& val); pdu_stream& operator>> (uint32_t& val);
@ -70,6 +74,7 @@ public:
// output sequence // output sequence
uint32_t size() { return pptr() - pbase(); } uint32_t size() { return pptr() - pbase(); }
uint8_t * base() { return pbase(); } uint8_t * base() { return pbase(); }
pdu_stream& operator<< (const pdu_stream_object& obj);
pdu_stream& operator<< (const uint8_t& val); pdu_stream& operator<< (const uint8_t& val);
pdu_stream& operator<< (const uint16_t& val); pdu_stream& operator<< (const uint16_t& val);
pdu_stream& operator<< (const uint32_t& val); pdu_stream& operator<< (const uint32_t& val);

View File

@ -63,8 +63,7 @@ void transport::iStream(PDU::Stream stream)
return stream->setstate(std::ios_base::failbit); return stream->setstate(std::ios_base::failbit);
*stream >> length; *stream >> length;
*stream >> root;
root.iStream(stream);
} }

View File

@ -85,7 +85,7 @@ void transport::iStream(PDU::Stream stream)
if (length > PREAMBLE_MINIMUM_SIZE) if (length > PREAMBLE_MINIMUM_SIZE)
stream->ignore((length - PREAMBLE_MINIMUM_SIZE)); stream->ignore((length - PREAMBLE_MINIMUM_SIZE));
root.iStream(stream); *stream >> root;
} }
@ -99,7 +99,7 @@ void transport::oStream(PDU::Stream stream) const
*stream << postamble_size; *stream << postamble_size;
stream->write(acn_id, sizeof(acn_id)); stream->write(acn_id, sizeof(acn_id));
for ( auto& pdu : *root.pdu ) for ( auto& pdu : *root.pdu )
pdu->oStream(stream); *stream << pdu;
} }
} // UDP } // UDP

View File

@ -142,7 +142,7 @@ void name_data::iStream(PDU::Stream stream)
while (stream->good()) while (stream->good())
{ {
points.push_back(point_description()); points.push_back(point_description());
points.back().iStream(stream); *stream >> points.back();
} }
} }
@ -156,7 +156,7 @@ void name_data::oStream(PDU::Stream stream) const
*stream << flags; *stream << flags;
*stream << reserved; *stream << reserved;
for (const auto & p : points) for (const auto & p : points)
p.oStream(stream); *stream << p;
} }
} // namespace Name } // namespace Name
@ -248,7 +248,7 @@ void advertisement_data::iStream(PDU::Stream stream)
void advertisement_data::oStream(PDU::Stream stream) const void advertisement_data::oStream(PDU::Stream stream) const
{ {
*stream << reserved; *stream << reserved;
payload->oStream(stream); *stream << payload;
} }
} // namespace OTP::Advertisement } // namespace OTP::Advertisement

View File

@ -74,7 +74,7 @@ void base_data::oStream(PDU::Stream stream) const
*stream << options; *stream << options;
*stream << reserved; *stream << reserved;
stream->writeString(name, 32); stream->writeString(name, 32);
payload->oStream(stream); *stream << payload;
} }

View File

@ -105,7 +105,7 @@ void client_connect_data::iStream(ACN::PDU::Stream stream)
*stream >> version; *stream >> version;
stream->readString(searchDomain, 231); stream->readString(searchDomain, 231);
*stream >> flags.byte; *stream >> flags.byte;
pdu->iStream(stream); *stream >> *pdu;
} }
@ -119,7 +119,7 @@ void client_connect_data::oStream(ACN::PDU::Stream stream) const
*stream << version; *stream << version;
stream->writeString(searchDomain, 231); stream->writeString(searchDomain, 231);
*stream << flags.byte; *stream << flags.byte;
pdu->oStream(stream); *stream << pdu;
} }
@ -156,7 +156,7 @@ void connect_reply_data::oStream(ACN::PDU::Stream stream) const
void client_entry_update_data::iStream(ACN::PDU::Stream stream) void client_entry_update_data::iStream(ACN::PDU::Stream stream)
{ {
*stream >> flags.byte; *stream >> flags.byte;
pdu->iStream(stream); *stream >> *pdu;
} }
@ -167,7 +167,7 @@ void client_entry_update_data::iStream(ACN::PDU::Stream stream)
void client_entry_update_data::oStream(ACN::PDU::Stream stream) const void client_entry_update_data::oStream(ACN::PDU::Stream stream) const
{ {
*stream << flags.byte; *stream << flags.byte;
pdu->oStream(stream); *stream << pdu;
} }
@ -248,7 +248,7 @@ void request_dynamic_uid_data::iStream(ACN::PDU::Stream stream)
while (stream->good()) while (stream->good())
{ {
list.emplace_back(dynamic_uid_request()); list.emplace_back(dynamic_uid_request());
list.back().iStream(stream); *stream >> list.back();
} }
} }
@ -260,7 +260,7 @@ void request_dynamic_uid_data::iStream(ACN::PDU::Stream stream)
void request_dynamic_uid_data::oStream(ACN::PDU::Stream stream) const void request_dynamic_uid_data::oStream(ACN::PDU::Stream stream) const
{ {
for (const auto & r : list) for (const auto & r : list)
r.oStream(stream); *stream << r;
} }
@ -297,7 +297,7 @@ void dynamic_uid_assignment_data::iStream(ACN::PDU::Stream stream)
while (stream->good()) while (stream->good())
{ {
list.emplace_back(dynamic_uid_mapping()); list.emplace_back(dynamic_uid_mapping());
list.back().iStream(stream); *stream >> list.back();
} }
} }
@ -309,7 +309,7 @@ void dynamic_uid_assignment_data::iStream(ACN::PDU::Stream stream)
void dynamic_uid_assignment_data::oStream(ACN::PDU::Stream stream) const void dynamic_uid_assignment_data::oStream(ACN::PDU::Stream stream) const
{ {
for (const auto & r : list) for (const auto & r : list)
r.oStream(stream); *stream << r;
} }

View File

@ -53,7 +53,7 @@ void llrp_data::oStream(ACN::PDU::Stream stream) const
*stream << destination; *stream << destination;
*stream << transaction; *stream << transaction;
if (child) if (child)
child->oStream(stream); *stream << child;
} }
@ -81,7 +81,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
case VECTOR_LLRP_PROBE_REQUEST: case VECTOR_LLRP_PROBE_REQUEST:
{ {
auto block = ACN::PDU::Block<ProbeRequest::Pdu>(); auto block = ACN::PDU::Block<ProbeRequest::Pdu>();
block.iStream(stream_); *stream_ >> block;
if (!block.pdu->empty()) if (!block.pdu->empty())
payload->child = block.pdu->front(); payload->child = block.pdu->front();
} }
@ -89,7 +89,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
case VECTOR_LLRP_PROBE_REPLY: case VECTOR_LLRP_PROBE_REPLY:
{ {
auto block = ACN::PDU::Block<ProbeReply::Pdu>(); auto block = ACN::PDU::Block<ProbeReply::Pdu>();
block.iStream(stream_); *stream_ >> block;
if (!block.pdu->empty()) if (!block.pdu->empty())
payload->child = block.pdu->front(); payload->child = block.pdu->front();
} }
@ -97,7 +97,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
case VECTOR_LLRP_RDM_CMD: case VECTOR_LLRP_RDM_CMD:
{ {
auto block = ACN::PDU::Block<RPT::COMMAND::Pdu>(); auto block = ACN::PDU::Block<RPT::COMMAND::Pdu>();
block.iStream(stream_); *stream_ >> block;
if (!block.pdu->empty()) if (!block.pdu->empty())
payload->child = block.pdu->front(); payload->child = block.pdu->front();
} }

View File

@ -51,7 +51,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
RDMnet::Pdu::iStream(stream); // flags, length, and vector RDMnet::Pdu::iStream(stream); // flags, length, and vector
// hase no header // header // hase no header // header
data_ = new COMMAND::Pdu(); // data data_ = new COMMAND::Pdu(); // data
data_->iStream(stream_); *stream_ >> *data_;
} }
} // namespace REQUEST } // namespace REQUEST
@ -261,7 +261,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
default: default:
return; return;
} }
data->pdu->iStream(stream_); *stream >> *data->pdu;
} }
@ -311,11 +311,8 @@ void rpt_data::oStream(ACN::PDU::Stream stream) const
{ {
*stream << sequence; *stream << sequence;
stream->writeType<typeof(reserved)>(0); stream->writeType<typeof(reserved)>(0);
pdu->oStream(stream); *stream << pdu;
} }
} // namespace RPT } // namespace RPT
} // namespace RDMnet } // namespace RDMnet