NB Broken! Moving from registerPeerObserver() to base::Subscriber.

This commit is contained in:
John Preston 2016-09-26 17:50:24 +03:00
parent 8546814a25
commit c91bdf3fef
5 changed files with 61 additions and 35 deletions

View File

@ -271,10 +271,10 @@ using SubscriptionHandler = typename SubscriptionHandlerHelper<EventType>::type;
class BaseObservableData { class BaseObservableData {
}; };
template <typename EventType> template <typename EventType, typename Handler>
class CommonObservableData; class CommonObservableData;
template <typename EventType> template <typename EventType, typename Handler>
class ObservableData; class ObservableData;
} // namespace internal } // namespace internal
@ -317,43 +317,41 @@ private:
Node *_node = nullptr; Node *_node = nullptr;
RemoveMethod _removeMethod; RemoveMethod _removeMethod;
template <typename EventType> template <typename EventType, typename Handler>
friend class internal::CommonObservableData; friend class internal::CommonObservableData;
template <typename EventType> template <typename EventType, typename Handler>
friend class internal::ObservableData; friend class internal::ObservableData;
}; };
template <typename EventType> template <typename EventType, typename Handler>
class Observable; class Observable;
namespace internal { namespace internal {
template <typename EventType> template <typename EventType, typename Handler>
class CommonObservable { class CommonObservable {
public: public:
using Handler = typename CommonObservableData<EventType>::Handler;
Subscription subscribe(Handler &&handler) { Subscription subscribe(Handler &&handler) {
if (!_data) { if (!_data) {
_data = MakeShared<ObservableData<EventType>>(this); _data = MakeShared<ObservableData<EventType, Handler>>(this);
} }
return _data->append(std_::forward<Handler>(handler)); return _data->append(std_::forward<Handler>(handler));
} }
private: private:
QSharedPointer<ObservableData<EventType>> _data; QSharedPointer<ObservableData<EventType, Handler>> _data;
friend class CommonObservableData<EventType>; friend class CommonObservableData<EventType, Handler>;
friend class Observable<EventType>; friend class Observable<EventType, Handler>;
}; };
} // namespace internal } // namespace internal
template <typename EventType> template <typename EventType, typename Handler = internal::SubscriptionHandler<EventType>>
class Observable : public internal::CommonObservable<EventType> { class Observable : public internal::CommonObservable<EventType, Handler> {
public: public:
void notify(EventType &&event, bool sync = false) { void notify(EventType &&event, bool sync = false) {
if (this->_data) { if (this->_data) {
@ -365,12 +363,10 @@ public:
namespace internal { namespace internal {
template <typename EventType> template <typename EventType, typename Handler>
class CommonObservableData : public BaseObservableData { class CommonObservableData : public BaseObservableData {
public: public:
using Handler = SubscriptionHandler<EventType>; CommonObservableData(CommonObservable<EventType, Handler> *observable) : _observable(observable) {
CommonObservableData(CommonObservable<EventType> *observable) : _observable(observable) {
} }
Subscription append(Handler &&handler) { Subscription append(Handler &&handler) {
@ -441,20 +437,20 @@ private:
} }
} }
CommonObservable<EventType> *_observable = nullptr; CommonObservable<EventType, Handler> *_observable = nullptr;
Node *_begin = nullptr; Node *_begin = nullptr;
Node *_current = nullptr; Node *_current = nullptr;
Node *_end = nullptr; Node *_end = nullptr;
ObservableCallHandlers _callHandlers; ObservableCallHandlers _callHandlers;
friend class ObservableData<EventType>; friend class ObservableData<EventType, Handler>;
}; };
template <typename EventType> template <typename EventType, typename Handler>
class ObservableData : public CommonObservableData<EventType> { class ObservableData : public CommonObservableData<EventType, Handler> {
public: public:
using CommonObservableData<EventType>::CommonObservableData; using CommonObservableData<EventType, Handler>::CommonObservableData;
void notify(EventType &&event, bool sync) { void notify(EventType &&event, bool sync) {
if (_handling) { if (_handling) {
@ -498,10 +494,10 @@ private:
}; };
template <> template <class Handler>
class ObservableData<void> : public CommonObservableData<void> { class ObservableData<void, Handler> : public CommonObservableData<void, Handler> {
public: public:
using CommonObservableData<void>::CommonObservableData; using CommonObservableData<void, Handler>::CommonObservableData;
void notify(bool sync) { void notify(bool sync) {
if (_handling) { if (_handling) {
@ -547,8 +543,8 @@ private:
} // namespace internal } // namespace internal
template <> template <typename Handler>
class Observable<void> : public internal::CommonObservable<void> { class Observable<void, Handler> : public internal::CommonObservable<void, Handler> {
public: public:
void notify(bool sync = false) { void notify(bool sync = false) {
if (_data) { if (_data) {
@ -560,14 +556,14 @@ public:
class Subscriber { class Subscriber {
protected: protected:
template <typename EventType, typename Lambda> template <typename EventType, typename Handler, typename Lambda>
int subscribe(base::Observable<EventType> &observable, Lambda &&handler) { int subscribe(base::Observable<EventType, Handler> &observable, Lambda &&handler) {
_subscriptions.push_back(observable.subscribe(std_::forward<Lambda>(handler))); _subscriptions.push_back(observable.subscribe(std_::forward<Lambda>(handler)));
return _subscriptions.size() - 1; return _subscriptions.size() - 1;
} }
template <typename EventType, typename Lambda> template <typename EventType, typename Handler, typename Lambda>
int subscribe(base::Observable<EventType> *observable, Lambda &&handler) { int subscribe(base::Observable<EventType, Handler> *observable, Lambda &&handler) {
return subscribe(*observable, std_::forward<Lambda>(handler)); return subscribe(*observable, std_::forward<Lambda>(handler));
} }

View File

@ -22,7 +22,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
class LayerWidget; class LayerWidget;
namespace base { namespace base {
template <typename Type> template <typename Type, typename>
class Observable; class Observable;
} // namespace base } // namespace base
namespace InlineBots { namespace InlineBots {

View File

@ -48,6 +48,8 @@ void FinishCallback() {
} }
ObservedEventRegistrator<PeerUpdate::Flags, PeerUpdateHandler> creator(StartCallback, FinishCallback); ObservedEventRegistrator<PeerUpdate::Flags, PeerUpdateHandler> creator(StartCallback, FinishCallback);
base::Observable<PeerUpdate, PeerUpdatedHandler> PeerUpdatedObservable;
} // namespace } // namespace
namespace internal { namespace internal {
@ -116,10 +118,20 @@ void peerUpdatedSendDelayed() {
for_const (auto &update, allList) { for_const (auto &update, allList) {
creator.notify(update.flags, update); creator.notify(update.flags, update);
} }
for (auto &update : smallList) {
PeerUpdated().notify(std_::move(update), true);
}
for (auto &update : allList) {
PeerUpdated().notify(std_::move(update), true);
}
if (SmallUpdates->isEmpty()) { if (SmallUpdates->isEmpty()) {
std::swap(smallList, *SmallUpdates); std::swap(smallList, *SmallUpdates);
SmallUpdates->resize(0); SmallUpdates->resize(0);
} }
} }
base::Observable<PeerUpdate, PeerUpdatedHandler> &PeerUpdated() {
return PeerUpdatedObservable;
}
} // namespace Notify } // namespace Notify

View File

@ -102,4 +102,22 @@ void registerPeerObserver(PeerUpdate::Flags events, ObserverType *observer, Lamb
observerRegistered(observer, connection); observerRegistered(observer, connection);
} }
class PeerUpdatedHandler {
public:
template <typename Lambda>
PeerUpdatedHandler(PeerUpdate::Flags events, Lambda &&handler) : _events(events), _handler(std_::move(handler)) {
}
void operator()(const PeerUpdate &update) const {
if (update.flags & _events) {
_handler(update);
}
}
private:
PeerUpdate::Flags _events;
base::lambda_unique<void(const PeerUpdate&)> _handler;
};
base::Observable<PeerUpdate, PeerUpdatedHandler> &PeerUpdated();
} // namespace Notify } // namespace Notify

View File

@ -34,9 +34,9 @@ using UpdateFlag = Notify::PeerUpdate::Flag;
InfoWidget::InfoWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_info)) { InfoWidget::InfoWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_info)) {
auto observeEvents = UpdateFlag::UsernameChanged | UpdateFlag::UserPhoneChanged; auto observeEvents = UpdateFlag::UsernameChanged | UpdateFlag::UserPhoneChanged;
Notify::registerPeerObserver(observeEvents, this, [this](const Notify::PeerUpdate &update) { subscribe(Notify::PeerUpdated(), Notify::PeerUpdatedHandler(observeEvents, [this](const Notify::PeerUpdate &update) {
notifyPeerUpdated(update); notifyPeerUpdated(update);
}); }));
createControls(); createControls();
} }