// 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_IMPORT_H namespace ircd::mods { template struct import; } /// Representation of a symbol in a loaded shared library /// template struct ircd::mods::import :sym_ptr { template auto operator()(args&&... a) const; template auto operator()(args&&... a); const T *operator->() const; const T &operator*() const; operator const T &() const; T *operator->(); T &operator*(); operator T &(); using sym_ptr::sym_ptr; }; template ircd::mods::import::operator T &() { return sym_ptr::operator*(); } template T & ircd::mods::import::operator*() { return sym_ptr::operator*(); } template T * ircd::mods::import::operator->() { return sym_ptr::operator->(); } template ircd::mods::import::operator const T &() const { return sym_ptr::operator*(); } template const T & ircd::mods::import::operator*() const { return sym_ptr::operator*(); } template const T * ircd::mods::import::operator->() const { return sym_ptr::operator->(); } template template auto ircd::mods::import::operator()(args&&... a) { return sym_ptr::operator()(std::forward(a)...); } template template auto ircd::mods::import::operator()(args&&... a) const { return sym_ptr::operator()(std::forward(a)...); }