Moved base classes into own header
This commit is contained in:
51
messagingcorelib/dbmsglib.cpp
Normal file
51
messagingcorelib/dbmsglib.cpp
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
#include "dbmsglib.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
103
messagingcorelib/dbmsglib.h
Normal file
103
messagingcorelib/dbmsglib.h
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QVariant>
|
||||||
|
#include <QMap>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class DbMsgFieldBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DbMsgFieldBase();
|
||||||
|
virtual ~DbMsgFieldBase();
|
||||||
|
|
||||||
|
bool touched() const;
|
||||||
|
void setTouched(bool touched);
|
||||||
|
|
||||||
|
virtual QVariant getVariant() const = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_touched;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
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<typename T>
|
||||||
|
DbMsgField<T>::DbMsgField() :
|
||||||
|
DbMsgFieldBase(),
|
||||||
|
m_hasValue(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
DbMsgField<T>::DbMsgField(const T &value) :
|
||||||
|
DbMsgFieldBase(),
|
||||||
|
m_value(value), m_hasValue(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T &DbMsgField<T>::getValue()
|
||||||
|
{
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
const T &DbMsgField<T>::getValue() const
|
||||||
|
{
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void DbMsgField<T>::setValue(const T &value)
|
||||||
|
{
|
||||||
|
m_hasValue = true;
|
||||||
|
m_value = value;
|
||||||
|
setTouched(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
bool DbMsgField<T>::hasValue() const
|
||||||
|
{
|
||||||
|
return m_hasValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
QVariant DbMsgField<T>::getVariant() const
|
||||||
|
{
|
||||||
|
return getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
class DbMsgBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DbMsgBase();
|
||||||
|
virtual ~DbMsgBase();
|
||||||
|
|
||||||
|
bool touched() const;
|
||||||
|
|
||||||
|
void setTouched(bool touched);
|
||||||
|
|
||||||
|
void debug() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual QMap<QString, DbMsgFieldBase*> getFields() = 0;
|
||||||
|
virtual QMap<QString, const DbMsgFieldBase*> getFields() const = 0;
|
||||||
|
};
|
@@ -9,10 +9,12 @@ PROJECT_ROOT = ..
|
|||||||
DEFINES += MESSAGINGCORELIB_LIBRARY
|
DEFINES += MESSAGINGCORELIB_LIBRARY
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
mymessage.cpp
|
mymessage.cpp \
|
||||||
|
dbmsglib.cpp
|
||||||
|
|
||||||
HEADERS += messagingcorelib_global.h \
|
HEADERS += messagingcorelib_global.h \
|
||||||
mymessage.h
|
mymessage.h \
|
||||||
|
dbmsglib.h
|
||||||
|
|
||||||
FORMS +=
|
FORMS +=
|
||||||
|
|
||||||
|
@@ -7,3 +7,34 @@ const QMap<QString, MyMessage::FieldGetterMethod> MyMessage::m_fields {
|
|||||||
{ "age", &MyMessage::ageFieldBase },
|
{ "age", &MyMessage::ageFieldBase },
|
||||||
{ "weight", &MyMessage::weightFieldBase }
|
{ "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<QString, DbMsgFieldBase *> MyMessage::getFields()
|
||||||
|
{
|
||||||
|
QMap<QString, DbMsgFieldBase*> fields;
|
||||||
|
|
||||||
|
for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++)
|
||||||
|
fields.insert(iter.key(), &(this->*iter.value())());
|
||||||
|
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
QMap<QString, const DbMsgFieldBase *> MyMessage::getFields() const
|
||||||
|
{
|
||||||
|
QMap<QString, const DbMsgFieldBase*> fields;
|
||||||
|
|
||||||
|
for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++)
|
||||||
|
fields.insert(iter.key(), &(const_cast<MyMessage*>(this)->*iter.value())());
|
||||||
|
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
@@ -1,85 +1,19 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QVariant>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
class DbMsgFieldBase
|
#include "dbmsglib.h"
|
||||||
{
|
|
||||||
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<typename T>
|
|
||||||
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<QString, DbMsgFieldBase*> getFields() = 0;
|
|
||||||
virtual QMap<QString, const DbMsgFieldBase*> getFields() const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class MyMessage : public DbMsgBase
|
class MyMessage : public DbMsgBase
|
||||||
{
|
{
|
||||||
public:
|
typedef DbMsgFieldBase &(MyMessage::*FieldGetterMethod)();
|
||||||
MyMessage() : DbMsgBase() {}
|
static const QMap<QString, FieldGetterMethod> m_fields;
|
||||||
|
|
||||||
MyMessage(const QString &name, const QDate &birthday, const QDateTime &sendTimestamp, int age, double weight) :
|
public:
|
||||||
DbMsgBase(),
|
MyMessage();
|
||||||
m_name(name), m_birthday(birthday), m_sendTimestamp(sendTimestamp), m_age(age), m_weight(weight)
|
MyMessage(const QString &name, const QDate &birthday, const QDateTime &sendTimestamp, int age, double weight);
|
||||||
{}
|
|
||||||
|
|
||||||
QString getName() const { return m_name.getValue(); }
|
QString getName() const { return m_name.getValue(); }
|
||||||
void setName(const QString &name) { m_name.setValue(name); }
|
void setName(const QString &name) { m_name.setValue(name); }
|
||||||
@@ -117,30 +51,10 @@ public:
|
|||||||
const DbMsgFieldBase &weightFieldBase() const { return m_weight; }
|
const DbMsgFieldBase &weightFieldBase() const { return m_weight; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QMap<QString, DbMsgFieldBase*> getFields() override
|
QMap<QString, DbMsgFieldBase*> getFields() override;
|
||||||
{
|
QMap<QString, const DbMsgFieldBase*> getFields() const override;
|
||||||
QMap<QString, DbMsgFieldBase*> fields;
|
|
||||||
|
|
||||||
for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++)
|
|
||||||
fields.insert(iter.key(), &(this->*iter.value())());
|
|
||||||
|
|
||||||
return fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
QMap<QString, const DbMsgFieldBase*> getFields() const override
|
|
||||||
{
|
|
||||||
QMap<QString, const DbMsgFieldBase*> fields;
|
|
||||||
|
|
||||||
for(auto iter = m_fields.cbegin(); iter != m_fields.cend(); iter++)
|
|
||||||
fields.insert(iter.key(), &(const_cast<MyMessage*>(this)->*iter.value())());
|
|
||||||
|
|
||||||
return fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef DbMsgFieldBase &(MyMessage::*FieldGetterMethod)();
|
|
||||||
static const QMap<QString, FieldGetterMethod> m_fields;
|
|
||||||
|
|
||||||
DbMsgField<QString> m_name;
|
DbMsgField<QString> m_name;
|
||||||
DbMsgField<QDate> m_birthday;
|
DbMsgField<QDate> m_birthday;
|
||||||
DbMsgField<QDateTime> m_sendTimestamp;
|
DbMsgField<QDateTime> m_sendTimestamp;
|
||||||
|
Reference in New Issue
Block a user