From f33809585f5ca760d8224cdbaada0f314e678bcd Mon Sep 17 00:00:00 2001 From: Alexey Sokolov Date: Sat, 21 Nov 2015 10:50:52 +0000 Subject: [PATCH] Move Message sizes asserts to their definitions, and add missing ones. --- include/znc/Message.h | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/include/znc/Message.h b/include/znc/Message.h index 403b1cf4..155c34d9 100644 --- a/include/znc/Message.h +++ b/include/znc/Message.h @@ -118,17 +118,22 @@ private: bool m_bColon = false; }; +// The various CMessage subclasses are "mutable views" to the data held by CMessage. +// They provide convenient access to message type speficic attributes, but are not +// allowed to hold extra data of their own. class CTargetMessage : public CMessage { public: CString GetTarget() const { return GetParam(0); } void SetTarget(const CString& sTarget) { SetParam(0, sTarget); } }; +static_assert(sizeof(CTargetMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CActionMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1).TrimPrefix_n("\001ACTION ").TrimSuffix_n("\001"); } void SetText(const CString& sText) { SetParam(1, "\001ACTION " + sText + "\001"); } }; +static_assert(sizeof(CActionMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CCTCPMessage : public CTargetMessage { public: @@ -136,17 +141,20 @@ public: CString GetText() const { return GetParam(1).TrimPrefix_n("\001").TrimSuffix_n("\001"); } void SetText(const CString& sText) { SetParam(1, "\001" + sText + "\001"); } }; +static_assert(sizeof(CCTCPMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CJoinMessage : public CTargetMessage { public: CString GetKey() const { return GetParam(1); } void SetKey(const CString& sKey) { SetParam(1, sKey); } }; +static_assert(sizeof(CJoinMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CModeMessage : public CTargetMessage { public: CString GetModes() const { return GetParams(1).TrimPrefix_n(":"); } }; +static_assert(sizeof(CModeMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CNickMessage : public CMessage { public: @@ -154,17 +162,20 @@ public: CString GetNewNick() const { return GetParam(0); } void SetNewNick(const CString& sNick) { SetParam(0, sNick); } }; +static_assert(sizeof(CNickMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CNoticeMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1); } void SetText(const CString& sText) { SetParam(1, sText); } }; +static_assert(sizeof(CNoticeMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CNumericMessage : public CMessage { public: unsigned int GetCode() const { return GetCommand().ToUInt(); } }; +static_assert(sizeof(CNumericMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CKickMessage : public CTargetMessage { public: @@ -173,44 +184,34 @@ public: CString GetReason() const { return GetParam(2); } void SetReason(const CString& sReason) { SetParam(2, sReason); } }; +static_assert(sizeof(CKickMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CPartMessage : public CTargetMessage { public: CString GetReason() const { return GetParam(1); } void SetReason(const CString& sReason) { SetParam(1, sReason); } }; +static_assert(sizeof(CPartMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CQuitMessage : public CMessage { public: CString GetReason() const { return GetParam(0); } void SetReason(const CString& sReason) { SetParam(0, sReason); } }; +static_assert(sizeof(CQuitMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CTextMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1); } void SetText(const CString& sText) { SetParam(1, sText); } }; +static_assert(sizeof(CTextMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); class CTopicMessage : public CTargetMessage { public: CString GetTopic() const { return GetParam(1); } void SetTopic(const CString& sTopic) { SetParam(1, sTopic); } }; - -// The various CMessage subclasses are "mutable views" to the data held by CMessage. -// They provide convenient access to message type speficic attributes, but are not -// allowed to hold extra data of their own. -static_assert(sizeof(CActionMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CCTCPMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CJoinMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CNoticeMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CPartMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CNickMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CKickMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CQuitMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CTargetMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); -static_assert(sizeof(CTextMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); static_assert(sizeof(CTopicMessage) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); #endif // !ZNC_MESSAGE_H