diff --git a/src/blackmisc/valueobject.h b/src/blackmisc/valueobject.h index eef30e061..e3243bc26 100644 --- a/src/blackmisc/valueobject.h +++ b/src/blackmisc/valueobject.h @@ -557,6 +557,65 @@ namespace BlackMisc class CompareByTuple {}; + /*! + * CRTP class template from which a derived class can inherit string streaming operations. + */ + template + class String + { + public: + //! Stream << overload to be used in debugging messages + friend QDebug operator<<(QDebug debug, const Derived &obj) + { + debug << obj.stringForStreaming(); + return debug; + } + + //! Operator << when there is no debug stream + friend QNoDebug operator<<(QNoDebug nodebug, const Derived &obj) + { + Q_UNUSED(obj); + return nodebug; + } + + //! Operator << based on text stream + friend QTextStream &operator<<(QTextStream &stream, const Derived &obj) + { + stream << obj.stringForStreaming(); + return stream; + } + + //! Operator << for QDataStream + friend QDataStream &operator<<(QDataStream &stream, const Derived &obj) + { + stream << obj.stringForStreaming(); + return stream; + } + + //! Stream operator << for std::cout + friend std::ostream &operator<<(std::ostream &ostr, const Derived &obj) + { + ostr << obj.stringForStreaming().toStdString(); + return ostr; + } + + //! Cast as QString + QString toQString(bool i18n = false) const { return derived()->convertToQString(i18n); } + + //! Cast to pretty-printed QString + virtual QString toFormattedQString(bool i18n = false) const { return derived()->toQString(i18n); } + + //! To std string + std::string toStdString(bool i18n = false) const { return derived()->convertToQString(i18n).toStdString(); } + + //! String for streaming operators + virtual QString stringForStreaming() const { return derived()->convertToQString(); } + + private: + const Derived *derived() const { return static_cast(this); } + Derived *derived() { return static_cast(this); } + }; + } /*! @@ -577,47 +636,13 @@ namespace BlackMisc public Mixin::JsonByTuple::value>, public Mixin::EqualsByTuple::value>, public Mixin::LessThanByTuple::value>, - public Mixin::CompareByTuple::value> + public Mixin::CompareByTuple::value>, + public Mixin::String { static_assert(std::is_same::value || IsValueObject::value, "Base must be either CEmpty or derived from CValueObject"); using PropertyIndexPolicy = typename CValueObjectPolicy::PropertyIndex; - //! Stream << overload to be used in debugging messages - friend QDebug operator<<(QDebug debug, const Derived &obj) - { - debug << obj.stringForStreaming(); - return debug; - } - - //! Operator << when there is no debug stream - friend QNoDebug operator<<(QNoDebug nodebug, const Derived &obj) - { - Q_UNUSED(obj); - return nodebug; - } - - //! Operator << based on text stream - friend QTextStream &operator<<(QTextStream &textStream, const Derived &obj) - { - textStream << obj.stringForStreaming(); - return textStream; - } - - //! Operator << for QDataStream - friend QDataStream &operator<<(QDataStream &stream, const Derived &valueObject) - { - stream << valueObject.stringForStreaming(); - return stream; - } - - //! Stream operator << for std::cout - friend std::ostream &operator<<(std::ostream &ostr, const Derived &obj) - { - ostr << obj.stringForStreaming().toStdString(); - return ostr; - } - public: //! Base class using base_type = Base; @@ -633,14 +658,14 @@ namespace BlackMisc IndexString }; - //! Cast as QString - QString toQString(bool i18n = false) const { return this->convertToQString(i18n); } + //! \copydoc BlackMisc::Mixin::String::toQString + using Mixin::String::toQString; - //! Cast to pretty-printed QString - virtual QString toFormattedQString(bool i18n = false) const { return this->toQString(i18n); } + //! \copydoc BlackMisc::Mixin::String::toFormattedQString + virtual QString toFormattedQString(bool i18n = false) const override { return this->Mixin::String::toQString(i18n); } - //! To std string - std::string toStdString(bool i18n = false) const { return this->convertToQString(i18n).toStdString(); } + //! \copydoc BlackMisc::Mixin::String::toStdString + using Mixin::String::toStdString; //! Update by variant map //! \return number of values changed, with skipEqualValues equal values will not be changed @@ -700,13 +725,13 @@ namespace BlackMisc //! Copy assignment operator. CValueObject &operator =(const CValueObject &) = default; - //! String for streaming operators - virtual QString stringForStreaming() const { return this->convertToQString(); } - //! \copydoc BlackMisc::Mixin::MetaType::getMetaTypeId using Mixin::MetaType::getMetaTypeId; public: + //! \copydoc BlackMisc::Mixin::String::stringForStreaming + virtual QString stringForStreaming() const override { return this->Mixin::String::stringForStreaming(); } + //! \copydoc BlackMisc::Mixin::DBusByTuple::marshallToDbus using Mixin::DBusByTuple::value>::marshallToDbus;