use dynamic casts if RTTI is an available feature

This commit is contained in:
Kevin Matz 2022-12-09 16:04:31 -05:00
parent 4975c7e809
commit 0c9c85830e
5 changed files with 71 additions and 10 deletions

View File

@ -1,6 +1,7 @@
project(${PROJECT_NAME}_sacn VERSION 0.3.1 LANGUAGES CXX) project(${PROJECT_NAME}_sacn VERSION 0.3.1 LANGUAGES CXX)
add_library(${PROJECT_NAME} SHARED) add_library(${PROJECT_NAME} SHARED)
configure_file(../../config.h.in config.h)
target_sources(${PROJECT_NAME} target_sources(${PROJECT_NAME}
PUBLIC PUBLIC

View File

@ -24,6 +24,7 @@
#include "arbitratinguniverse.h" #include "arbitratinguniverse.h"
#include <map> #include <map>
#include "config.h"
namespace sACN { namespace sACN {
@ -151,7 +152,11 @@ void ArbitratingUniverse::deleteSourceUniverse(const DATA::data_header& src)
*/ */
void ArbitratingUniverse::dataChangedNotifier(DMX::Universe* dmx) void ArbitratingUniverse::dataChangedNotifier(DMX::Universe* dmx)
{ {
#ifdef RTTI_ENABLED
auto sacn = dynamic_cast<sACN::Universe*>(dmx);
#else
auto sacn = static_cast<sACN::Universe*>(dmx); auto sacn = static_cast<sACN::Universe*>(dmx);
#endif
auto universe = dominant_(); auto universe = dominant_();
if (!universe) if (!universe)
return; return;

View File

@ -22,6 +22,7 @@
SOFTWARE. SOFTWARE.
*/ */
#include "config.h"
#include "pdu.h" #include "pdu.h"
#include "receiver.h" #include "receiver.h"
@ -137,7 +138,11 @@ void Receiver::dataReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
// a PDU::Block is guaranteed to have been instantiated, but if the input // 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 // stream failed, it will not list any PDU. OK to loop without checking
// the state of the stream. // the state of the stream.
#ifdef RTTI_ENABLED
auto block = std::dynamic_pointer_cast<ACN::PDU::Block<DATA::Pdu>>(root->data());
#else
auto block = std::static_pointer_cast<ACN::PDU::Block<DATA::Pdu>>(root->data()); auto block = std::static_pointer_cast<ACN::PDU::Block<DATA::Pdu>>(root->data());
#endif
for(auto const &frame : *block->pdu) for(auto const &frame : *block->pdu)
{ {
/// > \cite sACN 6.2.1 E1.31 Data Packet: Vector /// > \cite sACN 6.2.1 E1.31 Data Packet: Vector
@ -168,7 +173,11 @@ void Receiver::extendedReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
// a PDU::Block is guaranteed to have been instantiated, but if the input // 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 // stream failed, it will not list any PDU. OK to loop without checking
// the state of the stream. // the state of the stream.
#ifdef RTTI_ENABLED
auto block = std::dynamic_pointer_cast<ACN::PDU::Block<EXTENDED::Pdu>>(root->data());
#else
auto block = std::static_pointer_cast<ACN::PDU::Block<EXTENDED::Pdu>>(root->data()); auto block = std::static_pointer_cast<ACN::PDU::Block<EXTENDED::Pdu>>(root->data());
#endif
for(auto const &frame : *block->pdu) for(auto const &frame : *block->pdu)
{ {
switch(frame->vector()) { switch(frame->vector()) {
@ -196,10 +205,13 @@ void Receiver::extendedReceiver(ACN::PDU::Message<ACN::RLP::Pdu> root)
* *
* Merging will be based on frame header. PDU data will be read as a block of * Merging will be based on frame header. PDU data will be read as a block of
* DMP PDUs and passed to the universe. * DMP PDUs and passed to the universe.
*
*/ */
void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) { void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
auto metadata = std::static_pointer_cast<DATA::data_header>(frame->header()); #ifdef RTTI_ENABLED
auto metadata = std::dynamic_pointer_cast<DATA::data_header>(frame->header());
#else
auto metadata = std::static_pointer_cast<DATA::data_header>(frame->header());
#endif
if (!universes_.count(metadata->universe)) if (!universes_.count(metadata->universe))
return; // not subscribed to this universe return; // not subscribed to this universe
@ -263,11 +275,20 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
else else
{ {
subscribe(metadata->sync_address); subscribe(metadata->sync_address);
#ifdef RTTI_ENABLED
auto block = std::dynamic_pointer_cast<ACN::PDU::Block<ACN::DMP::Pdu>>(frame->data());
#else
auto block = std::static_pointer_cast<ACN::PDU::Block<ACN::DMP::Pdu>>(frame->data()); auto block = std::static_pointer_cast<ACN::PDU::Block<ACN::DMP::Pdu>>(frame->data());
#endif
if (!block->pdu->empty()) if (!block->pdu->empty())
{ {
#ifdef RTTI_ENABLED
auto dmp = std::dynamic_pointer_cast<ACN::DMP::Pdu>(block->pdu->front());
auto list = std::dynamic_pointer_cast<ACN::DMP::address_pair_list>(dmp->data());
#else
auto dmp = std::static_pointer_cast<ACN::DMP::Pdu>(block->pdu->front()); auto dmp = std::static_pointer_cast<ACN::DMP::Pdu>(block->pdu->front());
auto list = std::static_pointer_cast<ACN::DMP::address_pair_list>(dmp->data()); auto list = std::static_pointer_cast<ACN::DMP::address_pair_list>(dmp->data());
#endif
if (!list->properties.empty()) if (!list->properties.empty())
{ {
const auto & [_, data] = list->properties.front(); const auto & [_, data] = list->properties.front();
@ -293,7 +314,11 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
return; // too far out of sequence return; // too far out of sequence
// PDU data will be a block of DMP // PDU data will be a block of DMP
#ifdef RTTI_ENABLED
auto block = std::dynamic_pointer_cast<ACN::PDU::Block<ACN::DMP::Pdu>>(frame->data());
#else
auto block = std::static_pointer_cast<ACN::PDU::Block<ACN::DMP::Pdu>>(frame->data()); auto block = std::static_pointer_cast<ACN::PDU::Block<ACN::DMP::Pdu>>(frame->data());
#endif
universe->setMetadata(metadata); universe->setMetadata(metadata);
universe->DmpReceiver(block); universe->DmpReceiver(block);
} }
@ -305,7 +330,11 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
*/ */
void Receiver::syncFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame) void Receiver::syncFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame)
{ {
#ifdef RTTI_ENABLED
auto header = std::dynamic_pointer_cast<EXTENDED::sync_header>(frame->header());
#else
auto header = std::static_pointer_cast<EXTENDED::sync_header>(frame->header()); auto header = std::static_pointer_cast<EXTENDED::sync_header>(frame->header());
#endif
universes_.at(header->sync_address)->synchronize(header->sequence_number); universes_.at(header->sync_address)->synchronize(header->sequence_number);
} }
@ -315,7 +344,11 @@ void Receiver::syncFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame)
* @param frame * @param frame
*/ */
void Receiver::discoveryFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame) { void Receiver::discoveryFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame) {
#ifdef RTTI_ENABLED
auto block = std::dynamic_pointer_cast<ACN::PDU::Block<EXTENDED::DISCOVERY::Pdu>>(frame->data());
#else
auto block = std::static_pointer_cast<ACN::PDU::Block<EXTENDED::DISCOVERY::Pdu>>(frame->data()); auto block = std::static_pointer_cast<ACN::PDU::Block<EXTENDED::DISCOVERY::Pdu>>(frame->data());
#endif
for(auto const &pdu : *block->pdu) for(auto const &pdu : *block->pdu)
{ {
/// > \cite sACN 8 Universe Discovery Layer /// > \cite sACN 8 Universe Discovery Layer
@ -339,14 +372,25 @@ void Receiver::discoveryFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame) {
* @param pdu * @param pdu
*/ */
void Receiver::discoveryListHanlder(ACN::PDU::Message<EXTENDED::DISCOVERY::Pdu> pdu) { void Receiver::discoveryListHanlder(ACN::PDU::Message<EXTENDED::DISCOVERY::Pdu> pdu) {
auto rlpHeader = std::static_pointer_cast<ACN::RLP::rlp_header> #ifdef RTTI_ENABLED
(pdu->parent()->parent()->header()); auto rlpHeader = std::dynamic_pointer_cast<ACN::RLP::rlp_header>
auto frameHeader = std::static_pointer_cast<EXTENDED::discovery_header> (pdu->parent()->parent()->header());
(pdu->parent()->header()); auto frameHeader = std::dynamic_pointer_cast<EXTENDED::discovery_header>
auto header = std::static_pointer_cast<EXTENDED::DISCOVERY::discovery_list_header> (pdu->parent()->header());
(pdu->header()); auto header = std::dynamic_pointer_cast<EXTENDED::DISCOVERY::discovery_list_header>
auto data = std::static_pointer_cast<EXTENDED::DISCOVERY::discovery_list_data> (pdu->header());
(pdu->data()); auto data = std::dynamic_pointer_cast<EXTENDED::DISCOVERY::discovery_list_data>
(pdu->data());
#else
auto rlpHeader = std::static_pointer_cast<ACN::RLP::rlp_header>
(pdu->parent()->parent()->header());
auto frameHeader = std::static_pointer_cast<EXTENDED::discovery_header>
(pdu->parent()->header());
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());
#endif
// on the first page: // on the first page:
if (header->page == 0) if (header->page == 0)

View File

@ -22,6 +22,7 @@
SOFTWARE. SOFTWARE.
*/ */
#include "config.h"
#include "universe.h" #include "universe.h"
namespace sACN { namespace sACN {
@ -278,7 +279,11 @@ void Universe::rxDmpSetProperty(ACN::PDU::Message<ACN::DMP::Pdu> message)
// only act on the first property pair in the data // only act on the first property pair in the data
if (!message->data()) if (!message->data())
return; return;
#ifdef RTTI_ENABLED
auto set_data = std::dynamic_pointer_cast<ACN::DMP::address_pair_list>(message->data());
#else
auto set_data = std::static_pointer_cast<ACN::DMP::address_pair_list>(message->data()); auto set_data = std::static_pointer_cast<ACN::DMP::address_pair_list>(message->data());
#endif
if (set_data->properties.empty()) if (set_data->properties.empty())
return; return;
const auto& [range, data] = set_data->properties.front(); const auto& [range, data] = set_data->properties.front();

View File

@ -21,6 +21,8 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#include "config.h"
#include "universesender.h" #include "universesender.h"
#include "universe.h" #include "universe.h"
#include "source.h" #include "source.h"
@ -199,7 +201,11 @@ void UniverseSender::update_dmp_()
std::unique_lock lk_ctl(mtx_control); std::unique_lock lk_ctl(mtx_control);
// header segment // header segment
#ifdef RTTI_ENABLED
auto addrtyp = std::dynamic_pointer_cast<ACN::DMP::address_type>(dmp_->header());
#else
auto addrtyp = std::static_pointer_cast<ACN::DMP::address_type>(dmp_->header()); auto addrtyp = std::static_pointer_cast<ACN::DMP::address_type>(dmp_->header());
#endif
// property range // property range
ACN::DMP::Range pr(*addrtyp); ACN::DMP::Range pr(*addrtyp);