smart pointers for PDU header and data segments
This commit is contained in:
parent
858e8b4770
commit
ae5732e2fd
|
@ -39,16 +39,6 @@ Pdu::Pdu(size_t vector_size)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Pdu::~Pdu
|
||||
*/
|
||||
Pdu::~Pdu()
|
||||
{
|
||||
if (header_) delete header_;
|
||||
if (data_) delete data_;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Pdu::vector
|
||||
* @return
|
||||
|
@ -67,7 +57,7 @@ uint32_t Pdu::vector()
|
|||
* @brief Pdu::header
|
||||
* @return
|
||||
*/
|
||||
pdu_header * Pdu::header()
|
||||
std::shared_ptr<pdu_header> Pdu::header()
|
||||
{
|
||||
if (flags_.hasHeader)
|
||||
return header_;
|
||||
|
@ -81,7 +71,7 @@ pdu_header * Pdu::header()
|
|||
* @brief Pdu::data
|
||||
* @return
|
||||
*/
|
||||
pdu_data * Pdu::data()
|
||||
std::shared_ptr<pdu_data> Pdu::data()
|
||||
{
|
||||
if (flags_.hasData)
|
||||
return data_;
|
||||
|
@ -288,9 +278,10 @@ void Pdu::setVector (const uint32_t v)
|
|||
* @brief Pdu::setHeader
|
||||
* @param h
|
||||
*/
|
||||
void Pdu::setHeader (pdu_header * h)
|
||||
void Pdu::setHeader (std::shared_ptr<pdu_header> h)
|
||||
{
|
||||
header_ = h; flags_.hasHeader = true;
|
||||
header_ = h;
|
||||
flags_.hasHeader = true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -298,9 +289,10 @@ void Pdu::setHeader (pdu_header * h)
|
|||
* @brief Pdu::setData
|
||||
* @param d
|
||||
*/
|
||||
void Pdu::setData (pdu_data * d)
|
||||
void Pdu::setData (std::shared_ptr<pdu_data> d)
|
||||
{
|
||||
data_ = d; flags_.hasData = true;
|
||||
data_ = d;
|
||||
flags_.hasData = true;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -157,12 +157,11 @@ class Pdu
|
|||
{
|
||||
public:
|
||||
Pdu(size_t vector_size);
|
||||
~Pdu();
|
||||
|
||||
// getters
|
||||
uint32_t vector(); // may inherit
|
||||
pdu_header * header(); // may inherit
|
||||
pdu_data * data(); // may inherit
|
||||
std::shared_ptr<pdu_header> header(); // may inherit
|
||||
std::shared_ptr<pdu_data> data(); // may inherit
|
||||
Message<Pdu> parent();
|
||||
Stream stream();
|
||||
virtual size_t streamSize() const override;
|
||||
|
@ -170,9 +169,9 @@ public:
|
|||
virtual void oStream(Stream) const override;
|
||||
|
||||
// setters
|
||||
void setVector (const uint32_t v);
|
||||
void setHeader (pdu_header * h);
|
||||
void setData (pdu_data * d);
|
||||
void setVector (const uint32_t);
|
||||
void setHeader (std::shared_ptr<pdu_header>);
|
||||
void setData (std::shared_ptr<pdu_data>);
|
||||
void setParent (Message<Pdu> pdu);
|
||||
void setInherit(Message<Pdu> pdu);
|
||||
|
||||
|
@ -185,7 +184,7 @@ public:
|
|||
{
|
||||
if (flags_.hasHeader)
|
||||
{
|
||||
header_ = new T();
|
||||
header_ = std::make_shared<T>();
|
||||
if (stream_ && stream_->good())
|
||||
header_->iStream(stream_);
|
||||
}
|
||||
|
@ -198,7 +197,7 @@ public:
|
|||
{
|
||||
if (flags_.hasData)
|
||||
{
|
||||
data_ = new T();
|
||||
data_ = std::make_shared<T>();
|
||||
if (stream_ && stream_->good())
|
||||
data_->iStream(stream_);
|
||||
}
|
||||
|
@ -208,7 +207,7 @@ public:
|
|||
*/
|
||||
template<class T>
|
||||
void createDataBlock() {
|
||||
auto block = new Block<T>();
|
||||
auto block = std::make_shared<Block<T>>();
|
||||
if (stream_)
|
||||
block->iStream(stream_);
|
||||
block->setParent(shared_from_this());
|
||||
|
@ -221,9 +220,9 @@ protected:
|
|||
size_t vector_size_; //!< width (numbe of octets) of the vector
|
||||
Message<Pdu> parent_; //!< parent PDU
|
||||
Message<Pdu> inherit_; //!< PDU from which to inherit
|
||||
pdu_header * header_ = nullptr; //!< header segment
|
||||
pdu_data * data_ = nullptr; //!< data segment
|
||||
Stream stream_; //!< buffer
|
||||
std::shared_ptr<pdu_header> header_ = nullptr; //!< header segment
|
||||
std::shared_ptr<pdu_data> data_ = nullptr; //!< data segment
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -86,8 +86,8 @@ void Device::dmpGet(PDU::Message<DMP::Pdu> dmp)
|
|||
*/
|
||||
void Device::dmpSet(PDU::Message<DMP::Pdu> dmp)
|
||||
{
|
||||
auto type = static_cast<address_type*>(dmp->header());
|
||||
auto set_data = static_cast<address_pair_list*>(dmp->data());
|
||||
auto type = std::static_pointer_cast<address_type>(dmp->header());
|
||||
auto set_data = std::static_pointer_cast<address_pair_list>(dmp->data());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -228,15 +228,15 @@ void Pdu::iStream(PDU::Stream stream)
|
|||
if (!flags_.hasData)
|
||||
return;
|
||||
|
||||
auto header = static_cast<address_type*>(this->header());
|
||||
auto header = std::static_pointer_cast<address_type>(this->header());
|
||||
|
||||
auto dataIsAddressList = [this, header] () {
|
||||
data_ = new address_list(*header);
|
||||
data_ = std::make_shared<address_list>(*header);
|
||||
*stream_ >> *data_;
|
||||
};
|
||||
|
||||
auto dataIsAdddresPairList = [this, header] () {
|
||||
data_ = new address_pair_list(*header);
|
||||
data_ = std::make_shared<address_pair_list>(*header);
|
||||
*stream_ >> *data_;
|
||||
};
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
|
|||
// hase no header // header
|
||||
createData<llrp_data>(); // data
|
||||
|
||||
auto payload = static_cast<llrp_data*>(data_);
|
||||
auto payload = std::static_pointer_cast<llrp_data>(data_);
|
||||
switch (vector_) {
|
||||
case VECTOR_LLRP_PROBE_REQUEST:
|
||||
{
|
||||
|
|
|
@ -40,7 +40,7 @@ Target::Target()
|
|||
*/
|
||||
void Target::receiveLLRP(ACN::PDU::Message<Pdu> frame)
|
||||
{
|
||||
auto data = static_cast<llrp_data*>(frame->data());
|
||||
auto data = std::static_pointer_cast<llrp_data>(frame->data());
|
||||
switch (frame->vector()) {
|
||||
case VECTOR_LLRP_PROBE_REQUEST:
|
||||
receiveProbeRequest(std::static_pointer_cast<ProbeRequest::Pdu>(data->child));
|
||||
|
|
|
@ -50,7 +50,7 @@ Broker::Broker(UUID::uuid cid, RDM::UID uid)
|
|||
void Broker::rlpBrokerReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
|
||||
{
|
||||
root->createDataBlock<BrokerProtocol::Pdu>();
|
||||
auto block = static_cast<ACN::PDU::Block<BrokerProtocol::Pdu>*>(root->data());
|
||||
auto block = std::static_pointer_cast<ACN::PDU::Block<BrokerProtocol::Pdu>>(root->data());
|
||||
for(auto const &frame : *block->pdu)
|
||||
{
|
||||
switch(frame->vector()) {
|
||||
|
|
|
@ -148,14 +148,14 @@ void Component::rlpSend(ACN::RLP::message_transport& transport,
|
|||
const SDT::UDP::ipAddress& ip) const
|
||||
{
|
||||
// rlp header
|
||||
RLP::rlp_header header;
|
||||
header.cid = cid();
|
||||
auto header = std::make_shared<RLP::rlp_header>();
|
||||
header->cid = cid();
|
||||
|
||||
// rlp pdu
|
||||
auto rlp = std::shared_ptr<RLP::Pdu>(new RLP::Pdu());
|
||||
auto rlp = std::make_shared<RLP::Pdu>();
|
||||
rlp->setVector(vector);
|
||||
rlp->setHeader(&header);
|
||||
rlp->setData(data.get());
|
||||
rlp->setHeader(header);
|
||||
rlp->setData(data);
|
||||
|
||||
// root block
|
||||
PDU::Block<RLP::Pdu> block;
|
||||
|
@ -178,8 +178,8 @@ void Component::rlpSend(ACN::RLP::message_transport& transport,
|
|||
* @param stream
|
||||
* @param ip
|
||||
*
|
||||
* \attention Override this method in your derived class that can write
|
||||
* to the network.
|
||||
* \attention Override this method in the derived platform class that can
|
||||
* write to the network.
|
||||
*/
|
||||
void Component::rlpSend(const PDU::Stream stream,
|
||||
const SDT::UDP::ipAddress& ip) const
|
||||
|
|
|
@ -49,8 +49,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
|
|||
{
|
||||
RDMnet::Pdu::iStream(stream); // flags, length, and vector
|
||||
// hase no header // header
|
||||
data_ = new COMMAND::Pdu(); // data
|
||||
*stream_ >> *data_;
|
||||
createData<COMMAND::Pdu>(); // data
|
||||
}
|
||||
|
||||
} // namespace REQUEST
|
||||
|
@ -245,7 +244,7 @@ void Pdu::iStream(ACN::PDU::Stream stream)
|
|||
// the PDU. Do that now.
|
||||
if (!flags_.hasData)
|
||||
return;
|
||||
auto data = static_cast<rpt_data*>(data_);
|
||||
auto data = std::static_pointer_cast<rpt_data>(data_);
|
||||
switch (vector())
|
||||
{
|
||||
case VECTOR_RPT_REQUEST:
|
||||
|
|
|
@ -181,9 +181,9 @@ void Pdu::iStream(ACN::PDU::Stream stream)
|
|||
|
||||
if (data_)
|
||||
{
|
||||
auto data = static_cast<discovery_list_data*>(data_);
|
||||
auto root_header = static_cast<ACN::RLP::rlp_header*>(parent_->parent()->header());
|
||||
auto frame_header = static_cast<EXTENDED::discovery_header*>(parent_->header());
|
||||
auto data = std::static_pointer_cast<discovery_list_data>(data_);
|
||||
auto root_header = std::static_pointer_cast<ACN::RLP::rlp_header>(parent_->parent()->header());
|
||||
auto frame_header = std::static_pointer_cast<EXTENDED::discovery_header>(parent_->header());
|
||||
for ( auto & f : data->found )
|
||||
{
|
||||
f.source = root_header->cid;
|
||||
|
|
|
@ -136,7 +136,7 @@ void Receiver::dataReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
|
|||
// a PDU::Block is guaranteed to have been instantiated, but if the input
|
||||
// stream failed, it will not list any PDU. OK to loop without checking
|
||||
// the state of the stream.
|
||||
auto block = static_cast<ACN::PDU::Block<DATA::Pdu>*>(root->data());
|
||||
auto block = std::static_pointer_cast<ACN::PDU::Block<DATA::Pdu>>(root->data());
|
||||
for(auto const &frame : *block->pdu)
|
||||
{
|
||||
/// > \cite sACN 6.2.1 E1.31 Data Packet: Vector
|
||||
|
@ -167,7 +167,7 @@ void Receiver::extendedReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
|
|||
// a PDU::Block is guaranteed to have been instantiated, but if the input
|
||||
// stream failed, it will not list any PDU. OK to loop without checking
|
||||
// the state of the stream.
|
||||
auto block = static_cast<ACN::PDU::Block<EXTENDED::Pdu>*>(root->data());
|
||||
auto block = std::static_pointer_cast<ACN::PDU::Block<EXTENDED::Pdu>>(root->data());
|
||||
for(auto const &frame : *block->pdu)
|
||||
{
|
||||
switch(frame->vector()) {
|
||||
|
@ -197,8 +197,7 @@ void Receiver::extendedReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
|
|||
*
|
||||
*/
|
||||
void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
|
||||
auto header = static_cast<DATA::data_header*>(frame->header());
|
||||
auto source = std::shared_ptr<DATA::data_header>(header);
|
||||
auto source = std::static_pointer_cast<DATA::data_header>(frame->header());
|
||||
|
||||
if (!universes_.count(source->universe))
|
||||
return;
|
||||
|
@ -253,7 +252,7 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
|
|||
}
|
||||
|
||||
// PDU data will be a block of DMP
|
||||
auto block = static_cast<ACN::PDU::Block<ACN::DMP::Pdu>*>(frame->data());
|
||||
auto block = std::static_pointer_cast<ACN::PDU::Block<ACN::DMP::Pdu>>(frame->data());
|
||||
for (auto const &dmp : *block->pdu)
|
||||
{
|
||||
/// > \cite sACN 7.2 DMP Layer: Vector
|
||||
|
@ -279,7 +278,7 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
|
|||
*/
|
||||
void Receiver::syncFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame)
|
||||
{
|
||||
auto header = static_cast<EXTENDED::sync_header*>(frame->header());
|
||||
auto header = std::static_pointer_cast<EXTENDED::sync_header>(frame->header());
|
||||
universes_.at(header->sync_address)->synchronize(header->sequence_number);
|
||||
}
|
||||
|
||||
|
@ -289,7 +288,7 @@ void Receiver::syncFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame)
|
|||
* @param frame
|
||||
*/
|
||||
void Receiver::discoveryFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame) {
|
||||
auto block = static_cast<ACN::PDU::Block<EXTENDED::DISCOVERY::Pdu>*>(frame->data());
|
||||
auto block = std::static_pointer_cast<ACN::PDU::Block<EXTENDED::DISCOVERY::Pdu>>(frame->data());
|
||||
for(auto const &pdu : *block->pdu)
|
||||
{
|
||||
/// > \cite sACN 8 Universe Discovery Layer
|
||||
|
@ -313,8 +312,8 @@ void Receiver::discoveryFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame) {
|
|||
* @param pdu
|
||||
*/
|
||||
void Receiver::discoveryListHanlder(ACN::PDU::Message<EXTENDED::DISCOVERY::Pdu> pdu) {
|
||||
auto header = static_cast<EXTENDED::DISCOVERY::discovery_list_header*>(pdu->header());
|
||||
auto data = static_cast<EXTENDED::DISCOVERY::discovery_list_data*>(pdu->data());
|
||||
auto header = std::static_pointer_cast<EXTENDED::DISCOVERY::discovery_list_header>(pdu->header());
|
||||
auto data = std::static_pointer_cast<EXTENDED::DISCOVERY::discovery_list_data>(pdu->data());
|
||||
|
||||
for (auto& found : data->found)
|
||||
discovered.insert(found);
|
||||
|
|
|
@ -118,11 +118,11 @@ void Source::discoveryAnnounce()
|
|||
return;
|
||||
|
||||
// framing layer header
|
||||
auto frmheader = new EXTENDED::discovery_header;
|
||||
auto frmheader = std::make_shared<EXTENDED::discovery_header>();
|
||||
frmheader->source_name = name();
|
||||
|
||||
// universe discovery layer
|
||||
EXTENDED::DISCOVERY::discovery_list_header header;
|
||||
auto header = std::make_shared<EXTENDED::DISCOVERY::discovery_list_header>();
|
||||
|
||||
// known universes
|
||||
std::vector<EXTENDED::DISCOVERY::discoveredUniverse> list;
|
||||
|
@ -150,28 +150,28 @@ void Source::discoveryAnnounce()
|
|||
/// > The Universe Discovery Layer's Last Page field is an 8-bit field
|
||||
/// > indicating the number of the final page being to be transmitted. ...
|
||||
/// > Page numbers are indexed starting at 0.
|
||||
header.last_page = list.size() / 512;
|
||||
for (size_t i = 0; i <= header.last_page; i++)
|
||||
header->last_page = list.size() / 512;
|
||||
for (size_t i = 0; i <= header->last_page; i++)
|
||||
{
|
||||
/// > The Universe Discovery Layer's Page field is an 8-bit field
|
||||
/// > indicating the page number of this E1.31 Universe Discovery Packet.
|
||||
/// > Page numbers are indexed, starting at 0.
|
||||
header.page = i;
|
||||
header->page = i;
|
||||
|
||||
// universe discover layer data
|
||||
EXTENDED::DISCOVERY::discovery_list_data data;
|
||||
auto data = std::make_shared<EXTENDED::DISCOVERY::discovery_list_data>();
|
||||
for (size_t n = i * 512; n < (i * 512) + 512; n++)
|
||||
{
|
||||
if (n > list.size())
|
||||
break;
|
||||
data.found.push_back(list.at(n));
|
||||
data->found.push_back(list.at(n));
|
||||
}
|
||||
|
||||
// framing layer data
|
||||
auto dlistpdu = new EXTENDED::DISCOVERY::Pdu;
|
||||
auto dlistpdu = std::make_shared<EXTENDED::DISCOVERY::Pdu>();
|
||||
dlistpdu->setVector(VECTOR_UNIVERSE_DISCOVERY_UNIVERSE_LIST);
|
||||
dlistpdu->setHeader(&header);
|
||||
dlistpdu->setData(&data);
|
||||
dlistpdu->setHeader(header);
|
||||
dlistpdu->setData(data);
|
||||
|
||||
// framing layer
|
||||
sendExtendedFrame(VECTOR_E131_EXTENDED_DISCOVERY, frmheader, dlistpdu,
|
||||
|
@ -190,8 +190,8 @@ void Source::discoveryAnnounce()
|
|||
* @param ip
|
||||
*/
|
||||
void Source::sendExtendedFrame(const uint16_t vector,
|
||||
ACN::PDU::pdu_header* header,
|
||||
ACN::PDU::pdu_data* data,
|
||||
std::shared_ptr<ACN::PDU::pdu_header> header,
|
||||
std::shared_ptr<ACN::PDU::pdu_data> data,
|
||||
const ACN::SDT::UDP::ipAddress& ip) const
|
||||
{
|
||||
if (!(vector == VECTOR_E131_EXTENDED_DISCOVERY ||
|
||||
|
|
|
@ -60,8 +60,8 @@ protected:
|
|||
virtual void discoveryAnnounce();
|
||||
|
||||
void sendExtendedFrame(const uint16_t vector,
|
||||
ACN::PDU::pdu_header *header,
|
||||
ACN::PDU::pdu_data *data,
|
||||
std::shared_ptr<ACN::PDU::pdu_header> header,
|
||||
std::shared_ptr<ACN::PDU::pdu_data> data,
|
||||
const ACN::SDT::UDP::ipAddress&) const;
|
||||
|
||||
private:
|
||||
|
|
|
@ -64,7 +64,7 @@ void Universe::set(ACN::PDU::Message<ACN::DMP::Pdu> dmp,
|
|||
/// > Receivers shall discard the packet if the received value is not 0xa1.
|
||||
if (!dmp->header())
|
||||
return;
|
||||
auto type = static_cast<ACN::DMP::address_type*>(dmp->header());
|
||||
auto type = std::static_pointer_cast<ACN::DMP::address_type>(dmp->header());
|
||||
if (type->relative) return;
|
||||
if (type->data_type != ACN::DMP::ARRAY) return;
|
||||
if (type->address_length != ACN::DMP::TWO) return;
|
||||
|
@ -72,7 +72,7 @@ void Universe::set(ACN::PDU::Message<ACN::DMP::Pdu> dmp,
|
|||
// only act on the first property pair in the data
|
||||
if (!dmp->data())
|
||||
return;
|
||||
auto set_data = static_cast<ACN::DMP::address_pair_list*>(dmp->data());
|
||||
auto set_data = std::static_pointer_cast<ACN::DMP::address_pair_list>(dmp->data());
|
||||
const auto& [range, data] = set_data->properties.front();
|
||||
|
||||
/// > \cite sACN 7.4 First Property Address
|
||||
|
@ -202,14 +202,14 @@ void Universe::synchronize(uint8_t sequence_number)
|
|||
void Universe::sACNsend() const
|
||||
{
|
||||
// header
|
||||
ACN::DMP::address_type addrtyp;
|
||||
addrtyp.byte = 0;
|
||||
addrtyp.address_length = ACN::DMP::TWO;
|
||||
addrtyp.data_type = ACN::DMP::ARRAY;
|
||||
addrtyp.relative = false;
|
||||
auto addrtyp = std::make_shared<ACN::DMP::address_type>();
|
||||
addrtyp->byte = 0;
|
||||
addrtyp->address_length = ACN::DMP::TWO;
|
||||
addrtyp->data_type = ACN::DMP::ARRAY;
|
||||
addrtyp->relative = false;
|
||||
|
||||
// property range
|
||||
ACN::DMP::range pr(addrtyp);
|
||||
ACN::DMP::range pr(*addrtyp);
|
||||
pr.address = 0;
|
||||
pr.incriment = 1;
|
||||
pr.count = (active_data_slots <= 513 ? active_data_slots : 513);
|
||||
|
@ -220,20 +220,20 @@ void Universe::sACNsend() const
|
|||
std::back_inserter(pd));
|
||||
|
||||
// data segment
|
||||
ACN::DMP::address_pair_list addrlst(addrtyp);
|
||||
addrlst.properties.push_back(ACN::DMP::address_data_pair(pr, pd));
|
||||
auto addrlst = std::make_shared<ACN::DMP::address_pair_list>(*addrtyp);
|
||||
addrlst->properties.push_back(ACN::DMP::address_data_pair(pr, pd));
|
||||
|
||||
// DMP layer
|
||||
auto dmp = std::make_shared<ACN::DMP::Pdu>();
|
||||
dmp->setVector(ACN::DMP::SET_PROPERTY);
|
||||
dmp->setHeader(&addrtyp);
|
||||
dmp->setData(&addrlst);
|
||||
dmp->setHeader(addrtyp);
|
||||
dmp->setData(addrlst);
|
||||
|
||||
// sACN Framing Layer
|
||||
auto frame = std::make_shared<DATA::Pdu>();
|
||||
frame->setVector(VECTOR_E131_DATA_PACKET);
|
||||
frame->setHeader(provenance_.get());
|
||||
frame->setData(dmp.get());
|
||||
frame->setHeader(provenance_);
|
||||
frame->setData(dmp);
|
||||
|
||||
// send
|
||||
switch (destination.type)
|
||||
|
|
|
@ -53,7 +53,7 @@ Leader::Leader(UUID::uuid cid)
|
|||
void Leader::SdtReceiver(PDU::Message<RLP::Pdu> root)
|
||||
{
|
||||
root->createDataBlock<SDT::Pdu>();
|
||||
auto block = static_cast<PDU::Block<SDT::Pdu>*>(root->data());
|
||||
auto block = std::static_pointer_cast<PDU::Block<SDT::Pdu>>(root->data());
|
||||
|
||||
for(auto const &sdt : *block->pdu) {
|
||||
switch(sdt->vector()) {
|
||||
|
|
|
@ -129,7 +129,7 @@ void Pdu::iStream(PDU::Stream stream)
|
|||
{
|
||||
if (!data_)
|
||||
return;
|
||||
auto data = static_cast<wrapper_data*>(data_);
|
||||
auto data = std::static_pointer_cast<wrapper_data>(data_);
|
||||
data->block.setParent(shared_from_this());
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue