/* * Copyright (C) 2016 Charybdis Development Team * Copyright (C) 2016 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. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #pragma once #define HAVE_IRCD_MAPI_H #ifdef __cplusplus namespace ircd { namespace mapi { enum flags { NO_FLAGS = 0x00, RELAXED_INIT = 0x01, }; using export_vector = std::vector>; using metadata = std::map; struct init :std::function { using std::function::function; }; struct fini :std::function { using std::function::function; }; struct exports :export_vector { template exports(List&&... list); }; const char *const header_symbol_name { "IRCD_MODULE" }; struct header { static constexpr const magic_t MAGIC { 0x4D41 }; magic_t magic; // The magic must match MAGIC version_t version; // Version indicator enum flags flags; // Option flags int64_t timestamp; // Module's compile epoch struct exports exports; // Generated export vector metadata meta; // Various key-value metadata // get and set metadata auto &operator[](const std::string &s) const; auto &operator[](const std::string &s); template header(const char *const &desc, const enum flags &flags, Exports&&... exports); header(const char *const &desc = ""); ~header() noexcept; }; inline header::header(const char *const &desc) :header { desc, NO_FLAGS } { } template header::header(const char *const &desc, const enum flags &flags, Exports&&... exports) :magic(MAGIC) ,version(4) ,flags(flags) ,timestamp(RB_DATECODE) ,exports{std::forward(exports)...} ,meta { { "description", desc } } { } inline header::~header() noexcept { mods::static_destruction = true; } inline auto & header::operator[](const std::string &key) { return meta[key]; } inline auto & header::operator[](const std::string &key) const { return meta.at(key); } template exports::exports(List&&... list) { const std::vector types { typeid(List)... }; const std::vector ptrs { std::forward(list)... }; assert(types.size() == ptrs.size()); for(size_t i(0); i < types.size(); ++i) this->emplace_back(ptrs.at(i), types.at(i)); } } // namespace mapi } // namespace ircd #endif // __cplusplus