mirror of
https://github.com/ThePhD/sol2.git
synced 2024-03-22 13:10:44 +08:00
add singleton example
This commit is contained in:
parent
475b285347
commit
a67974250e
69
examples/singleton.cpp
Normal file
69
examples/singleton.cpp
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#define SOL_CHECK_ARGUMENTS 1
|
||||||
|
#include <sol.hpp>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
struct SomeLib {
|
||||||
|
private:
|
||||||
|
SomeLib() {}
|
||||||
|
public:
|
||||||
|
static std::shared_ptr<SomeLib> getInstance();
|
||||||
|
|
||||||
|
int doSomething() const {
|
||||||
|
return 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
// destructor must be public to work with
|
||||||
|
// std::shared_ptr and friends
|
||||||
|
// if you need it to be private, you must implement
|
||||||
|
// a custom deleter with access to the private members
|
||||||
|
// (e.g., a deleter struct defined in this class)
|
||||||
|
~SomeLib() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::shared_ptr<SomeLib> SomeLib::getInstance() {
|
||||||
|
static std::weak_ptr<SomeLib> instance;
|
||||||
|
static std::mutex m;
|
||||||
|
|
||||||
|
m.lock();
|
||||||
|
auto ret = instance.lock();
|
||||||
|
if (!ret) {
|
||||||
|
ret.reset(new SomeLib());
|
||||||
|
instance = ret;
|
||||||
|
}
|
||||||
|
m.unlock();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int, char*[]) {
|
||||||
|
std::cout << "=== singleton example ===" << std::endl;
|
||||||
|
|
||||||
|
sol::state lua;
|
||||||
|
lua.open_libraries(sol::lib::base);
|
||||||
|
|
||||||
|
lua.new_usertype<SomeLib>("SomeLib",
|
||||||
|
"new", sol::no_constructor,
|
||||||
|
"getInstance", &SomeLib::getInstance,
|
||||||
|
"doSomething", &SomeLib::doSomething
|
||||||
|
);
|
||||||
|
|
||||||
|
lua.script(R"(
|
||||||
|
|
||||||
|
-- note we use the `.` here, not `:` (there's no self to access)
|
||||||
|
local sli = SomeLib.getInstance()
|
||||||
|
|
||||||
|
-- we use the `:` here because there is something to access
|
||||||
|
local value = sli:doSomething()
|
||||||
|
|
||||||
|
-- check
|
||||||
|
print('sli:doSomething() returned:', value)
|
||||||
|
assert(value == 20)
|
||||||
|
)");
|
||||||
|
|
||||||
|
std::cout << std::endl;
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user