3#include "../FoundationBase.h"
32 void* handle =
nullptr;
37 static void load(
const std::string & path, LoadStatus & status,
void*& handle );
38 static void unload(
void* handle);
46 template<
typename T = Module>
47 static T load(
const std::string & path ) {
50 load( path, instance.status, instance.handle );
52 if( instance.status == LoadStatus::Loaded ) {
60 ptr =
reinterpret_cast< T >( getProcAddress( procName ) );
63 void* getProcAddress(
const char* procName );
64 static void* getProcAddress(
void* handle,
const char* procName );
66 bool operator ==(
const Module & rhs )
const {
return ( status == rhs.
status ) && ( handle == rhs.
handle ); }
69 template<
typename RET,
typename FN,
typename... ARGS>
70 RET
Call(FN* fn, ARGS... args)
const {
72 return (*fn)(args...);
120 api =
static_cast<const API*
>(apiPtr);
124 *
this = load<ModuleAPI>(moduleName);
128 return const_cast<API*
>(
api);
132 const void* (*fn)() =
reinterpret_cast<const void* (*)()
>(
getProcAddress(
handle,
"getPublicAPI"));
135 api =
static_cast<const API*
>(fn());
#define COGSFOUNDATION_API
Definition: FoundationBase.h:31
Helper class for shared libraries that implement the getPublicAPI function and provide a structure of...
Definition: Module.h:113
ModuleAPI(void *h, const void *apiPtr)
Definition: Module.h:117
virtual void initPtrs() override
Definition: Module.h:131
ModuleAPI(const std::string &moduleName)
Definition: Module.h:123
API * operator->()
Definition: Module.h:127
const API * api
Definition: Module.h:140
Base class for managing libraries dynamically loaded at runtime.
Definition: Module.h:23
static T load(const std::string &path)
Loads the named shared library.
Definition: Module.h:47
RET Call(FN *fn, ARGS... args) const
Definition: Module.h:70
LoadStatus status
Definition: Module.h:31
void getProcAddress(T &ptr, const char *procName)
Definition: Module.h:59
LoadStatus
Definition: Module.h:25
virtual void initPtrs()
Definition: Module.h:35
virtual ~Module()=default
void * handle
Definition: Module.h:32
Main Cogs namespace.
Definition: MortonCode.h:5