44 using Registration = std::shared_ptr<void>;
53 using UniversalPtr = std::shared_ptr<void>;
63 template <
typename Deleter>
66 return UniversalPtr((
void*) 0xDEADC0DE, deleter);
89 std::weak_ptr<UniversalPtr::element_type> weakHeartBeat(heartBeat_);
98 if (
auto isBeating = weakHeartBeat.lock())
108 UniversalPtr heartBeat_;
111 template<
typename EventTypeBase>
120 std::weak_ptr<UniversalPtr::element_type> weakHeartBeat(heartBeat_);
129 if (
auto isBeating = weakHeartBeat.lock())
136 std::map<EventTypeBase, std::vector<UniversalPtr>>
observers_;
139 UniversalPtr heartBeat_;
146 template <
typename SignatureFunc>
153 template <
typename Return,
typename... Params>
156 using F = std::function<Return (Params...)>;
157 using FPtr = std::shared_ptr<F>;
159 void operator()(Params... params)
161 for (
auto const & observer : observers_)
163 FPtr
const fptr = std::static_pointer_cast<F>(observer);
168 Registration registerObserver(F f)
170 FPtr fptr(
new F(std::move(f)));
171 return SubjectBase::registerObserver(fptr);
176 template <
typename SignatureEventType,
typename SignatureFunc>
179 template <
typename EventType,
typename Return,
typename... Params>
183 using F = std::function<Return (Params...)>;
184 using FPtr = std::shared_ptr<F>;
186 void operator()(EventType
const & e, Params... params)
190 for (
auto const & observer : this->observers_.at(e))
192 FPtr
const fptr = std::static_pointer_cast<F>(observer);
196 catch(std::out_of_range
const & e)
202 Registration registerObserver(EventType
const & e, F f)
204 FPtr fptr(
new F(std::move(f)));
211 #endif // OBSERVER_HPP