aboutsummaryrefslogtreecommitdiff
path: root/lib/events/event.h
diff options
context:
space:
mode:
authorAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-07-27 20:19:44 +0200
committerAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-09-04 18:42:11 +0200
commita26147582ce8cbd6a5206aee4b59de98c9dfe9b6 (patch)
tree5206d0c2f8cbcb5baf7f8aeb5c1f0bda12e6e662 /lib/events/event.h
parentdbc78d185c4bafe03b458f9eeb7ef3af35ce2eb2 (diff)
downloadlibquotient-a26147582ce8cbd6a5206aee4b59de98c9dfe9b6.tar.gz
libquotient-a26147582ce8cbd6a5206aee4b59de98c9dfe9b6.zip
DEFINE_SIMPLE_EVENT: support custom JSON keys
Diffstat (limited to 'lib/events/event.h')
-rw-r--r--lib/events/event.h46
1 files changed, 24 insertions, 22 deletions
diff --git a/lib/events/event.h b/lib/events/event.h
index b7454337..711f8fd4 100644
--- a/lib/events/event.h
+++ b/lib/events/event.h
@@ -6,6 +6,7 @@
#include "converters.h"
#include "logging.h"
#include "function_traits.h"
+#include "single_key_value.h"
namespace Quotient {
// === event_ptr_tt<> and type casting facilities ===
@@ -258,6 +259,13 @@ template <typename EventT>
using EventsArray = std::vector<event_ptr_tt<EventT>>;
using Events = EventsArray<Event>;
+#define QUO_CONTENT_GETTER_X(PartType_, PartName_, JsonKey_) \
+ PartType_ PartName_() const \
+ { \
+ static const auto PartName_##JsonKey = JsonKey_; \
+ return contentPart<PartType_>(PartName_##JsonKey); \
+ }
+
//! \brief Define an inline method obtaining a content part
//!
//! This macro adds a const method that extracts a JSON value at the key
@@ -266,12 +274,8 @@ using Events = EventsArray<Event>;
//! \code
//! contentPart<PartType_>(Quotient::toSnakeCase(#PartName_##_ls));
//! \endcode
-#define QUO_CONTENT_GETTER(PartType_, PartName_) \
- PartType_ PartName_() const \
- { \
- static const auto JsonKey = toSnakeCase(#PartName_##_ls); \
- return contentPart<PartType_>(JsonKey); \
- }
+#define QUO_CONTENT_GETTER(PartType_, PartName_) \
+ QUO_CONTENT_GETTER_X(PartType_, PartName_, toSnakeCase(#PartName_##_ls))
// === Facilities for event class definitions ===
@@ -301,22 +305,20 @@ using Events = EventsArray<Event>;
/// To retrieve the value the getter uses a JSON key name that corresponds to
/// its own (getter's) name but written in snake_case. \p GetterName_ must be
/// in camelCase, no quotes (an identifier, not a literal).
-#define DEFINE_SIMPLE_EVENT(Name_, Base_, TypeId_, ValueType_, GetterName_) \
- class QUOTIENT_API Name_ : public Base_ { \
- public: \
- using content_type = ValueType_; \
- DEFINE_EVENT_TYPEID(TypeId_, Name_) \
- explicit Name_(const QJsonObject& obj) : Base_(TypeId, obj) {} \
- explicit Name_(const content_type& content) \
- : Name_(Base_::basicJson(TypeId, { { JsonKey, toJson(content) } })) \
- {} \
- auto GetterName_() const \
- { \
- return contentPart<content_type>(JsonKey); \
- } \
- static inline const auto JsonKey = toSnakeCase(#GetterName_##_ls); \
- }; \
- REGISTER_EVENT_TYPE(Name_) \
+#define DEFINE_SIMPLE_EVENT(Name_, Base_, TypeId_, ValueType_, GetterName_, \
+ JsonKey_) \
+ class QUOTIENT_API Name_ : public Base_ { \
+ public: \
+ DEFINE_EVENT_TYPEID(TypeId_, Name_) \
+ using value_type = ValueType_; \
+ explicit Name_(const QJsonObject& obj) : Base_(TypeId, obj) {} \
+ explicit Name_(const value_type& v) \
+ : Name_(Base_::basicJson(TypeId, { { JsonKey, toJson(v) } })) \
+ {} \
+ QUO_CONTENT_GETTER_X(ValueType_, GetterName_, JsonKey) \
+ static inline const auto JsonKey = toSnakeCase(#GetterName_##_ls); \
+ }; \
+ REGISTER_EVENT_TYPE(Name_) \
// End of macro
// === is<>(), eventCast<>() and switchOnType<>() ===