#include #include #include #include namespace S { class Bus::Impl { private: std::unordered_map< std::type_index , std::unique_ptr > signals; public: S::Detail::SignalBase& get_signal( std::type_index type , std::function< std::unique_ptr() > make ) { auto it = signals.find(type); if (it == signals.end()) { auto ins = signals.emplace(type, make()); it = ins.first; } return *it->second; } }; Bus::~Bus() { } Bus::Bus() : pimpl(Util::make_unique()) { } Bus::Bus(Bus&& o) : pimpl(std::move(o.pimpl)) { } S::Detail::SignalBase& Bus::get_signal( std::type_index type , std::function< std::unique_ptr() > make ) { assert(pimpl); return pimpl->get_signal(type, std::move(make)); } }