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

View File

@ -48,6 +48,8 @@ void FinishCallback() {
}
ObservedEventRegistrator<PeerUpdate::Flags, PeerUpdateHandler> creator(StartCallback, FinishCallback);
base::Observable<PeerUpdate, PeerUpdatedHandler> PeerUpdatedObservable;
} // namespace
namespace internal {
@ -116,10 +118,20 @@ void peerUpdatedSendDelayed() {
for_const (auto &update, allList) {
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()) {
std::swap(smallList, *SmallUpdates);
SmallUpdates->resize(0);
}
}
base::Observable<PeerUpdate, PeerUpdatedHandler> &PeerUpdated() {
return PeerUpdatedObservable;
}
} // namespace Notify

View File

@ -102,4 +102,22 @@ void registerPeerObserver(PeerUpdate::Flags events, ObserverType *observer, Lamb
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

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)) {
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);
});
}));
createControls();
}