diff --git a/messagingcorelib/dbmsglib.cpp b/messagingcorelib/dbmsglib.cpp new file mode 100644 index 0000000..f5b1a68 --- /dev/null +++ b/messagingcorelib/dbmsglib.cpp @@ -0,0 +1,51 @@ +#include "dbmsglib.h" + +#include + +#include + +DbMsgFieldBase::DbMsgFieldBase() : + m_touched(false) +{ +} + +DbMsgFieldBase::~DbMsgFieldBase() +{ +} + +bool DbMsgFieldBase::touched() const +{ + return m_touched; +} + +void DbMsgFieldBase::setTouched(bool touched) +{ + m_touched = touched; +} + +DbMsgBase::DbMsgBase() +{ +} + +DbMsgBase::~DbMsgBase() +{ +} + +bool DbMsgBase::touched() const +{ + const auto fields = getFields(); + return std::any_of(fields.cbegin(), fields.cend(), [](const DbMsgFieldBase *field) { return field->touched(); }); +} + +void DbMsgBase::setTouched(bool touched) +{ + for(DbMsgFieldBase *field : getFields()) + field->setTouched(touched); +} + +void DbMsgBase::debug() const +{ + const auto fields = getFields(); + for(auto iter = fields.cbegin(); iter != fields.cend(); iter++) + qDebug() << iter.key() << iter.value()->getVariant() << iter.value()->touched(); +} diff --git a/messagingcorelib/dbmsglib.h b/messagingcorelib/dbmsglib.h new file mode 100644 index 0000000..dc83505 --- /dev/null +++ b/messagingcorelib/dbmsglib.h @@ -0,0 +1,103 @@ +#pragma once + +#include +#include +#include + +class DbMsgFieldBase +{ +public: + DbMsgFieldBase(); + virtual ~DbMsgFieldBase(); + + bool touched() const; + void setTouched(bool touched); + + virtual QVariant getVariant() const = 0; + +private: + bool m_touched; +}; + +template +class DbMsgField : public DbMsgFieldBase +{ +public: + DbMsgField(); + DbMsgField(const T &value); + + T &getValue(); + const T &getValue() const; + void setValue(const T &value); + + bool hasValue() const; + + QVariant getVariant() const; + +private: + T m_value; + bool m_hasValue; +}; + +template +DbMsgField::DbMsgField() : + DbMsgFieldBase(), + m_hasValue(false) +{ +} + +template +DbMsgField::DbMsgField(const T &value) : + DbMsgFieldBase(), + m_value(value), m_hasValue(true) +{ +} + +template +T &DbMsgField::getValue() +{ + return m_value; +} + +template +const T &DbMsgField::getValue() const +{ + return m_value; +} + +template +void DbMsgField::setValue(const T &value) +{ + m_hasValue = true; + m_value = value; + setTouched(true); +} + +template +bool DbMsgField::hasValue() const +{ + return m_hasValue; +} + +template +QVariant DbMsgField::getVariant() const +{ + return getValue(); +} + +class DbMsgBase +{ +public: + DbMsgBase(); + virtual ~DbMsgBase(); + + bool touched() const; + + void setTouched(bool touched); + + void debug() const; + +protected: + virtual QMap getFields() = 0; + virtual QMap getFields() const = 0; +}; diff --git a/messagingcorelib/messagingcorelib.pro b/messagingcorelib/messagingcorelib.pro index 50ff422..20e465c 100644 --- a/messagingcorelib/messagingcorelib.pro +++ b/messagingcorelib/messagingcorelib.pro @@ -9,10 +9,12 @@ PROJECT_ROOT = .. DEFINES += MESSAGINGCORELIB_LIBRARY SOURCES += \ - mymessage.cpp + mymessage.cpp \ + dbmsglib.cpp HEADERS += messagingcorelib_global.h \ - mymessage.h + mymessage.h \ + dbmsglib.h FORMS += diff --git a/messagingcorelib/mymessage.cpp b/messagingcorelib/mymessage.cpp index e62be2f..600f299 100644 --- a/messagingcorelib/mymessage.cpp +++ b/messagingcorelib/mymessage.cpp @@ -7,3 +7,34 @@ const QMap MyMessage::m_fields { { "age", &MyMessage::ageFieldBase }, { "weight", &MyMessage::weightFieldBase } }; + +MyMessage::MyMessage() : + DbMsgBase() +{ +} + +MyMessage::MyMessage(const QString &name, const QDate &birthday, const QDateTime &sendTimestamp, int age, double weight) : + DbMsgBase(), + m_name(name), m_birthday(birthday), m_sendTimestamp(sendTimestamp), m_age(age), m_weight(weight) +{ +} + +QMap MyMessage::getFields() +{ + QMap fields; + + for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++) + fields.insert(iter.key(), &(this->*iter.value())()); + + return fields; +} + +QMap MyMessage::getFields() const +{ + QMap fields; + + for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++) + fields.insert(iter.key(), &(const_cast(this)->*iter.value())()); + + return fields; +} diff --git a/messagingcorelib/mymessage.h b/messagingcorelib/mymessage.h index c3e393c..77a1959 100644 --- a/messagingcorelib/mymessage.h +++ b/messagingcorelib/mymessage.h @@ -1,85 +1,19 @@ #pragma once -#include - #include #include #include -#include -#include -class DbMsgFieldBase -{ -public: - DbMsgFieldBase() : m_touched(false) {} - - bool touched() const { return m_touched; } - void setTouched(bool touched) { m_touched = touched; } - - virtual QVariant getVariant() const = 0; - -private: - bool m_touched; -}; - -template -class DbMsgField : public DbMsgFieldBase -{ -public: - DbMsgField() : DbMsgFieldBase(), m_hasValue(false) {} - DbMsgField(const T &value) : DbMsgFieldBase(), m_value(value), m_hasValue(true) {} - - T &getValue() { return m_value; } - const T &getValue() const { return m_value; } - void setValue(const T &value) { m_hasValue = true; m_value = value; setTouched(true); } - - bool hasValue() const { return m_hasValue; } - - QVariant getVariant() const { return getValue(); } - -private: - T m_value; - bool m_hasValue; -}; - -class DbMsgBase -{ -public: - DbMsgBase() {} - - bool touched() const - { - const auto fields = getFields(); - return std::any_of(fields.cbegin(), fields.cend(), [](const DbMsgFieldBase *field) { return field->touched(); }); - } - - void setTouched(bool touched) - { - for(DbMsgFieldBase *field : getFields()) - field->setTouched(touched); - } - - void debug() const - { - const auto fields = getFields(); - for(auto iter = fields.cbegin(); iter != fields.cend(); iter++) - qDebug() << iter.key() << iter.value()->getVariant() << iter.value()->touched(); - } - -protected: - virtual QMap getFields() = 0; - virtual QMap getFields() const = 0; -}; +#include "dbmsglib.h" class MyMessage : public DbMsgBase { -public: - MyMessage() : DbMsgBase() {} + typedef DbMsgFieldBase &(MyMessage::*FieldGetterMethod)(); + static const QMap m_fields; - MyMessage(const QString &name, const QDate &birthday, const QDateTime &sendTimestamp, int age, double weight) : - DbMsgBase(), - m_name(name), m_birthday(birthday), m_sendTimestamp(sendTimestamp), m_age(age), m_weight(weight) - {} +public: + MyMessage(); + MyMessage(const QString &name, const QDate &birthday, const QDateTime &sendTimestamp, int age, double weight); QString getName() const { return m_name.getValue(); } void setName(const QString &name) { m_name.setValue(name); } @@ -117,30 +51,10 @@ public: const DbMsgFieldBase &weightFieldBase() const { return m_weight; } protected: - QMap getFields() override - { - QMap fields; - - for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++) - fields.insert(iter.key(), &(this->*iter.value())()); - - return fields; - } - - QMap getFields() const override - { - QMap fields; - - for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++) - fields.insert(iter.key(), &(const_cast(this)->*iter.value())()); - - return fields; - } + QMap getFields() override; + QMap getFields() const override; private: - typedef DbMsgFieldBase &(MyMessage::*FieldGetterMethod)(); - static const QMap m_fields; - DbMsgField m_name; DbMsgField m_birthday; DbMsgField m_sendTimestamp;