#pragma once #include #include namespace phosphor { namespace inventory { namespace manager { class Manager; namespace actions { namespace details { namespace holder { /** @struct Base * @brief Event action functor holder base. * * Provides an un-templated holder for actionsof any type with the correct * function call signature. */ struct Base { Base() = default; virtual ~Base() = default; Base(const Base&) = delete; Base& operator=(const Base&) = delete; Base(Base&&) = default; Base& operator=(Base&&) = default; virtual void operator()(Manager &mgr) const = 0; virtual void operator()(Manager &mgr) { const_cast(*this)(mgr); } }; /** @struct Holder * @brief Event action functor holder. * * Adapts a functor of any type (with the correct function call * signature) to a non-templated type usable by the manager for * actions. * * @tparam T - The functor type. */ template struct Holder final : public Base { Holder() = delete; ~Holder() = default; Holder(const Holder&) = delete; Holder & operator=(const Holder&) = delete; Holder(Holder&&) = default; Holder& operator=(Holder&&) = default; explicit Holder(T &&func) : _func(std::forward(func)) {} virtual void operator()(Manager &mgr) const override { _func(mgr); } virtual void operator()(Manager &mgr) override { _func(mgr); } private: T _func; }; } // namespace holder /** @struct Wrapper * @brief Provides implicit type conversion from action functors. * * Converts action functors to ptr-to-holder. */ struct Wrapper { template Wrapper(T &&func) : _ptr(static_cast>( std::make_shared>( std::forward(func)))) { } ~Wrapper() = default; Wrapper(const Wrapper&) = default; Wrapper& operator=(const Wrapper&) = delete; Wrapper(Wrapper&&) = default; Wrapper& operator=(Wrapper&&) = default; void operator()(Manager &mgr) { (*_ptr)(mgr); } void operator()(Manager &mgr) const { (*_ptr)(mgr); } private: std::shared_ptr _ptr; }; } // namespace details /** @brief The default action. */ inline void noop(Manager &mgr) noexcept { } /** @brief Destroy an object action. */ inline auto destroyObject(const char *path) { return [path](auto &m){m.destroyObject(path);}; } } // namespace actions } // namespace manager } // namespace inventory } // namespace phosphor // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4