#pragma once #define DECLARE_DBFIELD(TYPE, NAME, UPPER_NAME) \ private: \ DbMsgField m_##NAME;\ \ public: \ inline TYPE get##UPPER_NAME() const { return m_##NAME.getValue(); } \ inline void set##UPPER_NAME(const TYPE &NAME) { m_##NAME.setValue(NAME); } \ inline bool has##UPPER_NAME() const { return m_##NAME.hasValue(); } \ inline void clear##UPPER_NAME() { m_##NAME.clear(); } \ \ inline DbMsgField &NAME##Field() { return m_##NAME; } \ inline const DbMsgField &NAME##Field() const { return m_##NAME; } \ inline DbMsgFieldBase &NAME##FieldBase() { return m_##NAME; } \ inline const DbMsgFieldBase &NAME##FieldBase() const { return m_##NAME; } #define DECLARE_DBMESSAGE(ClassName) \ public: \ ClassName() = default; \ ClassName(const ClassName &) = default; \ ClassName(ClassName &&) = default; \ protected: \ QMap getFields() override; \ QMap getFields() const override; \ private: \ typedef DbMsgFieldBase &(ClassName::*FieldGetterMethod)(); \ static const QMap ALL_FIELDS; #define IMPLEMENT_DBMESSAGE(ClassName) \ QMap ClassName::getFields() \ { \ QMap fields; \ \ for(auto iter = ALL_FIELDS.cbegin(); iter != ALL_FIELDS.cend(); iter++) \ fields.insert(iter.key(), &(this->*iter.value())()); \ \ return fields; \ } \ \ QMap ClassName::getFields() const \ { \ QMap fields; \ \ for(auto iter = ALL_FIELDS.cbegin(); iter != ALL_FIELDS.cend(); iter++) \ fields.insert(iter.key(), &(const_cast(this)->*iter.value())()); \ \ return fields; \ } \ \ const QMap ClassName::ALL_FIELDS