Commit fbfab7ff authored by Andrii Grynenko's avatar Andrii Grynenko Committed by Facebook GitHub Bot

Unwrap Observer in SimpleObservable cache

Summary: Cache unwrapped observer instead of unwrapping it on every getObserver call.

Reviewed By: jmswen

Differential Revision: D24325934

fbshipit-source-id: d8a023e59c933222a5f43aaacbd9c955236739b3
parent 2bf4a236
...@@ -73,5 +73,15 @@ using ResultOfUnwrapSharedPtr = ...@@ -73,5 +73,15 @@ using ResultOfUnwrapSharedPtr =
template <typename F> template <typename F>
using ResultOfUnwrapObserver = using ResultOfUnwrapObserver =
typename UnwrapObserver<invoke_result_t<F>>::type; typename UnwrapObserver<invoke_result_t<F>>::type;
template <typename T>
struct Unwrap {
using type = T;
};
template <typename T>
struct Unwrap<observer::Observer<T>> {
using type = T;
};
} // namespace observer_detail } // namespace observer_detail
} // namespace folly } // namespace folly
...@@ -75,9 +75,9 @@ auto SimpleObservable<T>::getObserver() { ...@@ -75,9 +75,9 @@ auto SimpleObservable<T>::getObserver() {
SimpleObservable<T>::Wrapper wrapper; SimpleObservable<T>::Wrapper wrapper;
wrapper.context = context_; wrapper.context = context_;
ObserverCreator<SimpleObservable<T>::Wrapper> creator(std::move(wrapper)); ObserverCreator<SimpleObservable<T>::Wrapper> creator(std::move(wrapper));
observer_ = std::move(creator).getObserver(); observer_ = unwrap(std::move(creator).getObserver());
}); });
return unwrap(*observer_); return *observer_;
} }
} // namespace observer } // namespace observer
} // namespace folly } // namespace folly
...@@ -43,7 +43,8 @@ class SimpleObservable { ...@@ -43,7 +43,8 @@ class SimpleObservable {
std::shared_ptr<Context> context_; std::shared_ptr<Context> context_;
std::once_flag observerInit_; std::once_flag observerInit_;
folly::Optional<Observer<T>> observer_; folly::Optional<Observer<typename observer_detail::Unwrap<T>::type>>
observer_;
}; };
} // namespace observer } // namespace observer
} // namespace folly } // namespace folly
......
...@@ -570,6 +570,30 @@ TEST(Observer, Unwrap) { ...@@ -570,6 +570,30 @@ TEST(Observer, Unwrap) {
EXPECT_EQ(**observer, 4); EXPECT_EQ(**observer, 4);
} }
TEST(Observer, UnwrapSimpleObservable) {
SimpleObservable<int> a{1};
SimpleObservable<int> b{2};
SimpleObservable<Observer<int>> observable{a.getObserver()};
auto o = observable.getObserver();
EXPECT_EQ(1, **o);
a.setValue(3);
folly::observer_detail::ObserverManager::waitForAllUpdates();
EXPECT_EQ(3, **o);
observable.setValue(b.getObserver());
folly::observer_detail::ObserverManager::waitForAllUpdates();
EXPECT_EQ(2, **o);
b.setValue(4);
folly::observer_detail::ObserverManager::waitForAllUpdates();
EXPECT_EQ(4, **o);
}
TEST(Observer, WithJitterMonotoneProgress) { TEST(Observer, WithJitterMonotoneProgress) {
SimpleObservable<int> observable(0); SimpleObservable<int> observable(0);
auto observer = observable.getObserver(); auto observer = observable.getObserver();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment