// Matrix Construct // // Copyright (C) Matrix Construct Developers, Authors & Contributors // Copyright (C) 2016-2018 Jason Volk // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice is present in all copies. The // full license for this software is available in the LICENSE file. #pragma once #define HAVE_IRCD_MODS_SYM_PTR_H namespace ircd::mods { struct sym_ptr; } /// Representation of a symbol in a loaded library (non-template; low level). /// class ircd::mods::sym_ptr :std::weak_ptr { void *ptr {nullptr}; public: bool operator!() const; operator bool() const; template const T *get() const; template const T *operator->() const; template const T &operator*() const; template auto operator()(args&&... a) const; template T *get(); template T *operator->(); template T &operator*(); sym_ptr() = default; sym_ptr(module, const std::string &symname); sym_ptr(const std::string &modname, const std::string &symname); ~sym_ptr() noexcept; }; template T & ircd::mods::sym_ptr::operator*() { if(unlikely(expired())) throw expired_symbol("The reference to a symbol in another module is no longer valid"); return *get(); } template T * ircd::mods::sym_ptr::operator->() { return get(); } template T * ircd::mods::sym_ptr::get() { return reinterpret_cast(ptr); } template auto ircd::mods::sym_ptr::operator()(args&&... a) const { return (*get())(std::forward(a)...); } template const T & ircd::mods::sym_ptr::operator*() const { if(unlikely(expired())) throw expired_symbol("The const reference to a symbol in another module is no longer valid"); return *get(); } template const T * ircd::mods::sym_ptr::operator->() const { return get(); } template const T * ircd::mods::sym_ptr::get() const { return reinterpret_cast(ptr); } inline ircd::mods::sym_ptr::operator bool() const { return !bool(*this); } inline bool ircd::mods::sym_ptr::operator!() const { return !ptr || expired(); }