From e026d797e09252ce10c8cada1bfb7d9235b793cd Mon Sep 17 00:00:00 2001 From: Tsuda Kageyu Date: Tue, 13 Jun 2017 17:01:53 +0900 Subject: [PATCH] Use a macro to pretend virtual functions. --- taglib/audioproperties.cpp | 123 +++++++++++-------------------------- 1 file changed, 35 insertions(+), 88 deletions(-) diff --git a/taglib/audioproperties.cpp b/taglib/audioproperties.cpp index 217d9287..c29051a6 100644 --- a/taglib/audioproperties.cpp +++ b/taglib/audioproperties.cpp @@ -43,6 +43,39 @@ using namespace TagLib; +// This macro is a workaround for the fact that we can't add virtual functions. +// Should be true virtual functions in taglib2. + +#define VIRTUAL_FUNCTION_WORKAROUND(function_name, default_value) \ + if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else if(dynamic_cast(this)) \ + return dynamic_cast(this)->function_name(); \ + else \ + return (default_value); + class AudioProperties::AudioPropertiesPrivate { @@ -59,98 +92,12 @@ AudioProperties::~AudioProperties() int AudioProperties::lengthInSeconds() const { - // This is an ugly workaround but we can't add a virtual function. - // Should be virtual in taglib2. - - if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if (dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInSeconds(); - - else - return 0; + VIRTUAL_FUNCTION_WORKAROUND(lengthInSeconds, 0) } int AudioProperties::lengthInMilliseconds() const { - // This is an ugly workaround but we can't add a virtual function. - // Should be virtual in taglib2. - - if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else if(dynamic_cast(this)) - return dynamic_cast(this)->lengthInMilliseconds(); - - else - return 0; + VIRTUAL_FUNCTION_WORKAROUND(lengthInMilliseconds, 0) } ////////////////////////////////////////////////////////////////////////////////