From 3fd5abfa1a24d1ff8eaaee5a894f3c23e5aa09a7 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sat, 13 Oct 2018 00:32:14 +0200 Subject: [PATCH] Avoid using dynamic_cast in source code --- ChangeLog | 5 +++++ src/fmenuitem.cpp | 30 +++++++++++++++++++++++++----- src/include/final/fmenuitem.h | 3 +++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 15a9d1b4..0fbc99a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-10-13 Markus Gans + * Avoid using dynamic_cast so that you can compile Final Cut + without Run-Time Type Information (RTTI). + Thanks to user1095108 for reporting that. + 2018-10-11 Markus Gans * FKeyboard now uses references for keyboard buffer passing diff --git a/src/fmenuitem.cpp b/src/fmenuitem.cpp index 6bf0a942..a012f21e 100644 --- a/src/fmenuitem.cpp +++ b/src/fmenuitem.cpp @@ -101,7 +101,7 @@ FMenuItem::~FMenuItem() // destructor { if ( super_menu && (isMenu(super_menu) || isMenuBar(super_menu)) ) { - FMenuList* menu_list = dynamic_cast(super_menu); + FMenuList* menu_list = getFMenuList(*super_menu); if ( menu_list ) menu_list->remove(this); @@ -150,7 +150,7 @@ bool FMenuItem::setFocus (bool on) { if ( ! selected ) { - FMenuList* menu_list = dynamic_cast(getSuperMenu()); + FMenuList* menu_list = getFMenuList(*getSuperMenu()); setSelected(); if ( menu_list ) @@ -559,6 +559,27 @@ bool FMenuItem::isMenu (FWidget* w) const // private methods of FMenuItem +//---------------------------------------------------------------------- +FMenuList* FMenuItem::getFMenuList (FWidget& widget) +{ + FMenuList* menu_list; + + if ( isMenu(&widget) ) + { + FMenu* menu = static_cast(&widget); + menu_list = static_cast(menu); + } + else if ( isMenuBar(&widget) ) + { + FMenuBar* menubar = static_cast(&widget); + menu_list = static_cast(menubar); + } + else + menu_list = 0; + + return menu_list; +} + //---------------------------------------------------------------------- void FMenuItem::init (FWidget* parent) { @@ -573,13 +594,12 @@ void FMenuItem::init (FWidget* parent) if ( ! parent ) return; - FMenuList* menu_list; setSuperMenu (parent); if ( accel_key ) addAccelerator (accel_key); - menu_list = dynamic_cast(parent); + FMenuList* menu_list = getFMenuList(*parent); if ( menu_list ) menu_list->insert(this); @@ -616,7 +636,7 @@ uChar FMenuItem::hotKey() length = text.getLength(); - for (uInt i = 0; i < length; i++) + for (std::size_t i = 0; i < length; i++) { try { diff --git a/src/include/final/fmenuitem.h b/src/include/final/fmenuitem.h index 493c48aa..28deba43 100644 --- a/src/include/final/fmenuitem.h +++ b/src/include/final/fmenuitem.h @@ -166,6 +166,9 @@ class FMenuItem : public FWidget // Disable assignment operator (=) FMenuItem& operator = (const FMenuItem&); + // Accessor + FMenuList* getFMenuList (FWidget&); + // Methods void init (FWidget*); uChar hotKey();