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) } ////////////////////////////////////////////////////////////////////////////////