From b657cd22aa64f24f2e0f9f31ef8a5d4e38a26a3a Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Tue, 1 May 2018 17:06:20 +0900 Subject: Event and Room: further abstract event pointers So that eventual switch from std::unique_ptr to some other pointer (as a case - QSharedPointer) would be as painless as possible. --- lib/events/event.cpp | 16 ++++++++-------- lib/events/event.h | 30 +++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 11 deletions(-) (limited to 'lib/events') diff --git a/lib/events/event.cpp b/lib/events/event.cpp index 31520fc9..193250de 100644 --- a/lib/events/event.cpp +++ b/lib/events/event.cpp @@ -67,16 +67,17 @@ const QJsonObject Event::contentJson() const } template -inline BaseEventT* makeIfMatches(const QJsonObject&, const QString&) +inline event_ptr_tt makeIfMatches(const QJsonObject&, const QString&) { return nullptr; } template -inline BaseEventT* makeIfMatches(const QJsonObject& o, const QString& selector) +inline event_ptr_tt makeIfMatches(const QJsonObject& o, + const QString& selector) { if (selector == EventT::TypeId) - return new EventT(o); + return _impl::create(o); return makeIfMatches(o, selector); } @@ -86,11 +87,11 @@ EventPtr _impl::doMakeEvent(const QJsonObject& obj) { // Check more specific event types first if (auto e = doMakeEvent(obj)) - return EventPtr(move(e)); + return e; - return EventPtr { makeIfMatches( - obj, obj["type"].toString()) }; + obj, obj["type"].toString()); } RoomEvent::RoomEvent(Event::Type type) : Event(type) { } @@ -118,8 +119,7 @@ RoomEvent::RoomEvent(Type type, const QJsonObject& rep) auto redaction = unsignedData.value("redacted_because"); if (redaction.isObject()) { - _redactedBecause = - std::make_unique(redaction.toObject()); + _redactedBecause = _impl::create(redaction.toObject()); return; } diff --git a/lib/events/event.h b/lib/events/event.h index 4e2b1071..396406f1 100644 --- a/lib/events/event.h +++ b/lib/events/event.h @@ -26,8 +26,32 @@ namespace QMatrixClient template using event_ptr_tt = std::unique_ptr; + template + inline EventT* rawPtr(const event_ptr_tt& ptr) + { + return ptr.get(); + } + + template + inline TargetEventT* weakPtr(const event_ptr_tt& ptr) + { + return static_cast(rawPtr(ptr)); + } + + template + inline event_ptr_tt ptrCast(event_ptr_tt&& ptr) + { + return unique_ptr_cast(ptr); + } + namespace _impl { + template + inline event_ptr_tt create(ArgTs&&... args) + { + return std::make_unique(std::forward(args)...); + } + template event_ptr_tt doMakeEvent(const QJsonObject& obj); } @@ -94,7 +118,7 @@ namespace QMatrixClient { auto e = _impl::doMakeEvent(obj); if (!e) - e = std::make_unique(EventType::Unknown, obj); + e = _impl::create(EventType::Unknown, obj); return e; } @@ -174,9 +198,9 @@ namespace QMatrixClient QString roomId() const; QString senderId() const; bool isRedacted() const { return bool(_redactedBecause); } - const RedactionEvent* redactedBecause() const + const event_ptr_tt& redactedBecause() const { - return _redactedBecause.get(); + return _redactedBecause; } QString redactionReason() const; const QString& transactionId() const { return _txnId; } -- cgit v1.2.3