0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-01 01:28:54 +02:00

ircd::mods: Add shared_from mod& sym_ptr ctor; adjust conversions.

This commit is contained in:
Jason Volk 2018-03-25 15:25:32 -07:00
parent bdd5006f32
commit 291b6dc286
4 changed files with 31 additions and 10 deletions

View file

@ -19,8 +19,8 @@ namespace ircd::mods
struct ircd::mods::module
:std::shared_ptr<mod>
{
operator const mod &() const;
operator mod &();
explicit operator const mod &() const;
explicit operator mod &();
string_view name() const;
string_view path() const;
@ -47,7 +47,8 @@ template<class T>
T &
ircd::mods::module::get(const string_view &sym)
{
return mods::get<T>(*this, sym);
mod &mod{*this};
return mods::get<T>(mod, sym);
}
template<class T>
@ -55,14 +56,16 @@ const T &
ircd::mods::module::get(const string_view &sym)
const
{
return mods::get<T>(*this, sym);
const mod &mod{*this};
return mods::get<T>(mod, sym);
}
template<class T>
T *
ircd::mods::module::ptr(const string_view &sym)
{
return mods::ptr<T>(*this, sym);
mod &mod{*this};
return mods::ptr<T>(mod, sym);
}
template<class T>
@ -70,7 +73,8 @@ const T *
ircd::mods::module::ptr(const string_view &sym)
const
{
return mods::ptr<T>(*this, sym);
const mod &mod{*this};
return mods::ptr<T>(mod, sym);
}
inline ircd::mods::module::operator

View file

@ -36,9 +36,10 @@ class ircd::mods::sym_ptr
template<class T> T *operator->();
template<class T> T &operator*();
sym_ptr() = default;
explicit sym_ptr(mod &, const string_view &symname);
sym_ptr(module, const string_view &symname);
sym_ptr(const string_view &modname, const string_view &symname);
sym_ptr() = default;
};
template<class T>

View file

@ -204,6 +204,15 @@ ircd::mods::sym_ptr::sym_ptr(const string_view &modname,
{
}
ircd::mods::sym_ptr::sym_ptr(mod &mod,
const string_view &symname)
:sym_ptr
{
module(shared_from(mod)), symname
}
{
}
ircd::mods::sym_ptr::sym_ptr(module module,
const string_view &symname)
:std::weak_ptr<mod>
@ -275,21 +284,24 @@ ircd::string_view
ircd::mods::module::path()
const
{
return mods::path(*this);
const mod &mod(*this);
return mods::path(mod);
}
ircd::string_view
ircd::mods::module::name()
const
{
return mods::name(*this);
const mod &mod(*this);
return mods::name(mod);
}
bool
ircd::mods::module::has(const string_view &name)
const
{
return mods::has(*this, name);
const mod &mod(*this);
return mods::has(mod, name);
}
///////////////////////////////////////////////////////////////////////////////

View file

@ -66,5 +66,9 @@ struct ircd::mods::mod
mod(const filesystem::path &,
const load_mode::type & = load_mode::rtld_local | load_mode::rtld_now);
mod(mod &&) = delete;
mod(const mod &) = delete;
mod &operator=(mod &&) = delete;
mod &operator=(const mod &) = delete;
~mod() noexcept;
};