.. _program_listing_file_microlith_services.h: Program Listing for File services.h =================================== |exhale_lsh| :ref:`Return to documentation for file ` (``microlith/services.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef INCLUDE_MICROLITH_SERVICES_H_ #define INCLUDE_MICROLITH_SERVICES_H_ #include #include #include // noreorder #include #include "detail/log.h" #include "detail/macros.h" namespace microlith { using interface_id = std::string; using service_id = std::string; namespace detail { template interface_id get_interface_id() { return ctti::nameof().str(); } template service_id get_service_id() { return ctti::nameof().str(); } } // namespace detail class MICROLITH_EXPORT abstract_service { public: virtual ~abstract_service(); virtual service_id id() const; virtual std::unordered_set provides() const; virtual std::unordered_set receives() const; virtual void _receive_services(std::shared_ptr service); }; // class abstract_service template class service : public virtual abstract_service { public: service_id id() const override { return detail::get_service_id(); } }; // class service template class service_interface : public virtual abstract_service { public: }; // class service_interface template class provides_service : public T, public virtual abstract_service { public: }; // class provides_service template class receives_service : public virtual abstract_service { public: virtual void receive(std::shared_ptr /* service */) {} void _receive_service(std::shared_ptr service) { const auto &receives = this->receives(); for (auto provider : service->provides()) { if (receives.find(provider) == std::end(receives)) { continue; } MICROLITH_TRACE("{} receiving {} as {}", abstract_service::id(), service->id(), provider); receive(std::dynamic_pointer_cast(service)); } } }; // class receives_service template class provides_services : public provides_service... { public: std::unordered_set provides() const override { return {detail::get_interface_id()...}; } }; // class provides_service template class receives_services : public receives_service... { public: std::unordered_set receives() const override { return {detail::get_interface_id()...}; } void _receive_services(std::shared_ptr service) { (receives_service::_receive_service(service), ...); } }; // class receives_services class service_discovery_interface; class service_discovery_interface : public service_interface { public: virtual void discover(std::shared_ptr service) = 0; }; // class service_discovery_interface } // namespace microlith #endif // INCLUDE_MICROLITH_SERVICES_H_