#include #include #include using ctor_map = std::unordered_map>; static ctor_map* INIT_MAP=nullptr; namespace rng::init { const std::function& apply_raw(std::string_view name, std::function fn) noexcept { if(!INIT_MAP) INIT_MAP = new ctor_map(); auto& map = *INIT_MAP; map[name] = std::move(fn); return map[name]; } std::function& get(std::string_view name) { if(UNLIKELY(!INIT_MAP)) throw DCLookupFailed ( name ); auto& map = *INIT_MAP; if(map.contains(name)) return map[name]; else throw DCLookupFailed ( name ); } namespace { __attribute__((destructor)) static void _rng_ctor__fini() noexcept{ if(LIKELY(INIT_MAP)) { delete INIT_MAP; INIT_MAP = nullptr; } } } }