Moved base classes into own header

This commit is contained in:
0xFEEDC0DE64
2018-09-01 16:50:01 +02:00
parent acaa6372d7
commit b5bd365834
5 changed files with 197 additions and 96 deletions

View 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
View 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;
};

View File

@@ -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 +=

View File

@@ -7,3 +7,34 @@ const QMap<QString, MyMessage::FieldGetterMethod> 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<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;
}

View File

@@ -1,85 +1,19 @@
#pragma once
#include <algorithm>
#include <QString>
#include <QDateTime>
#include <QMap>
#include <QVariant>
#include <QDebug>
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<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;
};
#include "dbmsglib.h"
class MyMessage : public DbMsgBase
{
public:
MyMessage() : DbMsgBase() {}
typedef DbMsgFieldBase &(MyMessage::*FieldGetterMethod)();
static const QMap<QString, FieldGetterMethod> 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<QString, DbMsgFieldBase*> getFields() 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;
}
QMap<QString, DbMsgFieldBase*> getFields() override;
QMap<QString, const DbMsgFieldBase*> getFields() const override;
private:
typedef DbMsgFieldBase &(MyMessage::*FieldGetterMethod)();
static const QMap<QString, FieldGetterMethod> m_fields;
DbMsgField<QString> m_name;
DbMsgField<QDate> m_birthday;
DbMsgField<QDateTime> m_sendTimestamp;