From 65d52b2d57de3d00019989eb23707721b95c64a4 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sat, 30 Jan 2021 18:25:46 +0100 Subject: [PATCH] Improve customization point for clearing tag field * Allow customizing clearing only the value * Use same naming scheme as in other places * Avoid having to add an empty reset() function in subclasses --- generictagfield.h | 25 +++++++++++++++++++++++-- id3/id3v2frame.cpp | 14 +++++++++++--- id3/id3v2frame.h | 3 ++- matroska/matroskatagfield.h | 10 ---------- mp4/mp4tagfield.cpp | 17 +++++++++++++---- mp4/mp4tagfield.h | 3 ++- vorbis/vorbiscommentfield.h | 8 -------- 7 files changed, 51 insertions(+), 29 deletions(-) diff --git a/generictagfield.h b/generictagfield.h index a58d8b6..af42081 100644 --- a/generictagfield.h +++ b/generictagfield.h @@ -64,6 +64,10 @@ public: std::vector &nestedFields(); bool supportsNestedFields() const; +protected: + void internallyClearValue(); + void internallyClearFurtherData(); + private: IdentifierType m_id; TagValue m_value; @@ -164,7 +168,7 @@ template inline void TagField::se */ template inline void TagField::clearValue() { - m_value.clearDataAndMetadata(); + static_cast(this)->internallyClearValue(); } /*! @@ -224,10 +228,10 @@ template void TagField::clear() { clearId(); clearValue(); + static_cast(this)->internallyClearFurtherData(); m_typeInfo = TypeInfoType(); m_typeInfoAssigned = false; m_default = true; - static_cast(this)->reset(); } /*! @@ -267,6 +271,23 @@ template inline bool TagField::su return static_cast(this)->supportsNestedFields(); } +/*! + * \brief Clears the assigned value; called via clearValue() and clear(). + * \remarks Shadow when subclassing to customize clearning a value. + */ +template void TagField::internallyClearValue() +{ + m_value.clearDataAndMetadata(); +} + +/*! + * \brief Clears further data; called via clear(). + * \remarks Shadow when subclassing to clear further data the subclass has. + */ +template void TagField::internallyClearFurtherData() +{ +} + } // namespace TagParser #endif // TAG_PARSER_TAGFIELD_H diff --git a/id3/id3v2frame.cpp b/id3/id3v2frame.cpp index 4ef5396..db7dffe 100644 --- a/id3/id3v2frame.cpp +++ b/id3/id3v2frame.cpp @@ -398,9 +398,18 @@ void Id3v2Frame::make(BinaryWriter &writer, std::uint8_t version, Diagnostics &d } /*! - * \brief Resets ID3v2-specific values. Called via clear(). + * \brief Clears ID3v2-specific values. Called via clear() and clearValue(). */ -void Id3v2Frame::reset() +void Id3v2Frame::internallyClearValue() +{ + value().clearDataAndMetadata(); + m_additionalValues.clear(); +} + +/*! + * \brief Clears ID3v2-specific values. Called via clear(). + */ +void Id3v2Frame::internallyClearFurtherData() { m_flag = 0; m_group = 0; @@ -408,7 +417,6 @@ void Id3v2Frame::reset() m_dataSize = 0; m_totalSize = 0; m_padding = false; - m_additionalValues.clear(); } /*! diff --git a/id3/id3v2frame.h b/id3/id3v2frame.h index d7546ce..c789732 100644 --- a/id3/id3v2frame.h +++ b/id3/id3v2frame.h @@ -144,7 +144,8 @@ public: static std::string fieldIdToString(IdentifierType id); private: - void reset(); + void internallyClearValue(); + void internallyClearFurtherData(); std::string ignoreAdditionalValuesDiagMsg() const; std::vector m_additionalValues; diff --git a/matroska/matroskatagfield.h b/matroska/matroskatagfield.h index 80d31ab..545df03 100644 --- a/matroska/matroskatagfield.h +++ b/matroska/matroskatagfield.h @@ -79,9 +79,6 @@ public: static typename std::string fieldIdFromString(const char *idString, std::size_t idStringSize = std::string::npos); static std::string fieldIdToString(const std::string &id); - -private: - void reset(); }; /*! @@ -118,13 +115,6 @@ inline std::string MatroskaTagField::fieldIdToString(const std::string &id) return id; } -/*! - * \brief Resets Matroska-specific values. Called via clear(). - */ -inline void MatroskaTagField::reset() -{ -} - } // namespace TagParser #endif // TAG_PARSER_MATROSKATAGFIELD_H diff --git a/mp4/mp4tagfield.cpp b/mp4/mp4tagfield.cpp index 30ee6d1..e9effd6 100644 --- a/mp4/mp4tagfield.cpp +++ b/mp4/mp4tagfield.cpp @@ -464,15 +464,24 @@ std::uint32_t Mp4TagField::appropriateRawDataTypeForValue(const TagValue &value) } /*! - * \brief Resets MP4-specific values. Called via clear(). + * \brief Clears MP4-specific values. Called via clear() and clearValue(). */ -void Mp4TagField::reset() +void Mp4TagField::internallyClearValue() +{ + value().clearDataAndMetadata(); + m_additionalData.clear(); + m_countryIndicator = 0; + m_langIndicator = 0; +} + +/*! + * \brief Clears MP4-specific values. Called via clear() and clearValue(). + */ +void Mp4TagField::internallyClearFurtherData() { m_name.clear(); m_mean.clear(); m_parsedRawDataType = RawDataType::Reserved; - m_countryIndicator = 0; - m_langIndicator = 0; } /// \cond diff --git a/mp4/mp4tagfield.h b/mp4/mp4tagfield.h index 3c4973d..b478110 100644 --- a/mp4/mp4tagfield.h +++ b/mp4/mp4tagfield.h @@ -147,7 +147,8 @@ public: static std::string fieldIdToString(IdentifierType id); private: - void reset(); + void internallyClearValue(); + void internallyClearFurtherData(); std::string m_name; std::string m_mean; std::vector m_additionalData; diff --git a/vorbis/vorbiscommentfield.h b/vorbis/vorbiscommentfield.h index f463376..c959038 100644 --- a/vorbis/vorbiscommentfield.h +++ b/vorbis/vorbiscommentfield.h @@ -62,7 +62,6 @@ public: static std::string fieldIdToString(const std::string &id); private: - void reset(); template void internalParse(StreamType &stream, std::uint64_t &maxSize, Diagnostics &diag); }; @@ -100,13 +99,6 @@ inline std::string VorbisCommentField::fieldIdToString(const std::string &id) return id; } -/*! - * \brief Resets Vorbis Comment-specific values. Called via clear(). - */ -inline void VorbisCommentField::reset() -{ -} - } // namespace TagParser #endif // TAG_PARSER_VORBISCOMMENTFIELD_H