#ifndef seafire__common__extension_context_hxx_ #define seafire__common__extension_context_hxx_ #include #include #include namespace seafire::common { /// Implements a context tracking extensions. /// /// Ownership of registered extensions is not assumed. /// class extension_context_t { public: template E& use(); template E const& use() const; template void extend(E* ptr); template void erase(); private: void* use(std::type_index const& key) const; void extend(std::type_index const& key, void* ptr); void erase_extension(std::type_index const& key); std::map extensions_; }; class extension_not_found_t : public std::runtime_error { public: extension_not_found_t(); }; class duplicate_extension_t : public std::runtime_error { public: duplicate_extension_t(); }; /// Provides extending an extension context using RAII. /// template class extend_t { public: using extension_type = typename std::decay_t; extend_t(extension_context_t&, extension_type&); extend_t(extend_t const&) = delete; extend_t(extend_t&&) = delete; ~extend_t() noexcept; extend_t& operator=(extend_t const&) = delete; extend_t& operator=(extend_t&&) = delete; private: extension_context_t& target_; }; } // namespace seafire::common #include #endif