1a6f7ed7aSWilliam A. Kennington III #include <sdeventplus/internal/cexec.hpp>
25a7365c6SWilliam A. Kennington III #include <sdeventplus/internal/sdevent.hpp>
35a7365c6SWilliam A. Kennington III #include <sdeventplus/source/event.hpp>
45320b1f5SWilliam A. Kennington III #include <sdeventplus/types.hpp>
5*a8c11e3cSPatrick Williams 
6*a8c11e3cSPatrick Williams #include <memory>
75a7365c6SWilliam A. Kennington III #include <utility>
85a7365c6SWilliam A. Kennington III 
95a7365c6SWilliam A. Kennington III namespace sdeventplus
105a7365c6SWilliam A. Kennington III {
115a7365c6SWilliam A. Kennington III namespace source
125a7365c6SWilliam A. Kennington III {
135a7365c6SWilliam A. Kennington III 
set_callback(Callback && callback)14b53ef902SWilliam A. Kennington III void EventBase::set_callback(Callback&& callback)
15b53ef902SWilliam A. Kennington III {
165320b1f5SWilliam A. Kennington III     get_userdata().callback = std::move(callback);
175320b1f5SWilliam A. Kennington III }
185320b1f5SWilliam A. Kennington III 
EventBase(const EventBase & other,sdeventplus::internal::NoOwn)195320b1f5SWilliam A. Kennington III EventBase::EventBase(const EventBase& other, sdeventplus::internal::NoOwn) :
205320b1f5SWilliam A. Kennington III     Base(other, sdeventplus::internal::NoOwn())
21*a8c11e3cSPatrick Williams {}
22b53ef902SWilliam A. Kennington III 
EventBase(const char * name,CreateFunc create,const Event & event,Callback && callback)2386be5dd8SWilliam A. Kennington III EventBase::EventBase(const char* name, CreateFunc create, const Event& event,
2486be5dd8SWilliam A. Kennington III                      Callback&& callback) :
255320b1f5SWilliam A. Kennington III     Base(event, create_source(name, create, event), std::false_type())
265a7365c6SWilliam A. Kennington III {
275320b1f5SWilliam A. Kennington III     set_userdata(
285320b1f5SWilliam A. Kennington III         std::make_unique<detail::EventBaseData>(*this, std::move(callback)));
295320b1f5SWilliam A. Kennington III }
305320b1f5SWilliam A. Kennington III 
get_userdata() const315320b1f5SWilliam A. Kennington III detail::EventBaseData& EventBase::get_userdata() const
325320b1f5SWilliam A. Kennington III {
335320b1f5SWilliam A. Kennington III     return static_cast<detail::EventBaseData&>(Base::get_userdata());
345a7365c6SWilliam A. Kennington III }
355a7365c6SWilliam A. Kennington III 
get_callback()36220b5dabSWilliam A. Kennington III EventBase::Callback& EventBase::get_callback()
375a7365c6SWilliam A. Kennington III {
385320b1f5SWilliam A. Kennington III     return get_userdata().callback;
395a7365c6SWilliam A. Kennington III }
405a7365c6SWilliam A. Kennington III 
create_source(const char * name,CreateFunc create,const Event & event)4186be5dd8SWilliam A. Kennington III sd_event_source* EventBase::create_source(const char* name, CreateFunc create,
4286be5dd8SWilliam A. Kennington III                                           const Event& event)
435a7365c6SWilliam A. Kennington III {
445a7365c6SWilliam A. Kennington III     sd_event_source* source;
45a6f7ed7aSWilliam A. Kennington III     SDEVENTPLUS_CHECK(name, std::invoke(create, event.getSdEvent(), event.get(),
46a6f7ed7aSWilliam A. Kennington III                                         &source, eventCallback, nullptr));
475a7365c6SWilliam A. Kennington III     return source;
485a7365c6SWilliam A. Kennington III }
495a7365c6SWilliam A. Kennington III 
eventCallback(sd_event_source * source,void * userdata)5086be5dd8SWilliam A. Kennington III int EventBase::eventCallback(sd_event_source* source, void* userdata)
515a7365c6SWilliam A. Kennington III {
525320b1f5SWilliam A. Kennington III     return sourceCallback<Callback, detail::EventBaseData,
535320b1f5SWilliam A. Kennington III                           &EventBase::get_callback>("eventCallback", source,
545320b1f5SWilliam A. Kennington III                                                     userdata);
555a7365c6SWilliam A. Kennington III }
565a7365c6SWilliam A. Kennington III 
575320b1f5SWilliam A. Kennington III namespace detail
585320b1f5SWilliam A. Kennington III {
595320b1f5SWilliam A. Kennington III 
EventBaseData(const EventBase & base,EventBase::Callback && callback)605320b1f5SWilliam A. Kennington III EventBaseData::EventBaseData(const EventBase& base,
615320b1f5SWilliam A. Kennington III                              EventBase::Callback&& callback) :
625320b1f5SWilliam A. Kennington III     EventBase(base, sdeventplus::internal::NoOwn()),
635320b1f5SWilliam A. Kennington III     BaseData(base), callback(std::move(callback))
64*a8c11e3cSPatrick Williams {}
655320b1f5SWilliam A. Kennington III 
665320b1f5SWilliam A. Kennington III } // namespace detail
675320b1f5SWilliam A. Kennington III 
Defer(const Event & event,Callback && callback)6886be5dd8SWilliam A. Kennington III Defer::Defer(const Event& event, Callback&& callback) :
6986be5dd8SWilliam A. Kennington III     EventBase("sd_event_add_defer", &internal::SdEvent::sd_event_add_defer,
7086be5dd8SWilliam A. Kennington III               event, std::move(callback))
71*a8c11e3cSPatrick Williams {}
7286be5dd8SWilliam A. Kennington III 
Post(const Event & event,Callback && callback)7386be5dd8SWilliam A. Kennington III Post::Post(const Event& event, Callback&& callback) :
7486be5dd8SWilliam A. Kennington III     EventBase("sd_event_add_post", &internal::SdEvent::sd_event_add_post, event,
755a7365c6SWilliam A. Kennington III               std::move(callback))
76*a8c11e3cSPatrick Williams {}
775a7365c6SWilliam A. Kennington III 
Exit(const Event & event,Callback && callback)7886be5dd8SWilliam A. Kennington III Exit::Exit(const Event& event, Callback&& callback) :
7986be5dd8SWilliam A. Kennington III     EventBase("sd_event_add_exit", &internal::SdEvent::sd_event_add_exit, event,
805a7365c6SWilliam A. Kennington III               std::move(callback))
81*a8c11e3cSPatrick Williams {}
825a7365c6SWilliam A. Kennington III 
835a7365c6SWilliam A. Kennington III } // namespace source
845a7365c6SWilliam A. Kennington III } // namespace sdeventplus
85