The Battle for Wesnoth  1.15.0-dev
lua_rng.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2014 - 2018 by Chris Beck <render787@gmail.com>
3  Part of the Battle for Wesnoth Project http://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
15 #include "scripting/lua_rng.hpp"
16 
17 #include "log.hpp"
18 #include "mt_rng.hpp"
20 #include "scripting/lua_common.hpp" // for new(L)
21 
22 #include <new>
23 #include <string>
24 
25 #include "lua/lua.h"
26 #include "lua/lauxlib.h"
27 
28 static lg::log_domain log_lua("scripting/lua");
29 #define ERR_LUA LOG_STREAM(err, log_lua)
30 
31 // Begin lua rng bindings
32 namespace lua_rng {
33 
34 using randomness::mt_rng;
35 
36 static const char * Rng = "Rng";
37 
39 {
40  uint32_t seed = lua_kernel_base::get_lua_kernel<lua_kernel_base>(L).get_random_seed();
41  new(L) mt_rng(seed);
42  luaL_setmetatable(L, Rng);
43 
44  return 1;
45 }
46 
48 {
49  mt_rng * d = static_cast< mt_rng *> (luaL_testudata(L, 1, Rng));
50  if (d == nullptr) {
51  ERR_LUA << "rng_destroy called on data of type: " << lua_typename( L, lua_type( L, 1 ) ) << std::endl;
52  ERR_LUA << "This may indicate a memory leak, please report at bugs.wesnoth.org" << std::endl;
53  lua_pushstring(L, "Rng object garbage collection failure");
54  lua_error(L);
55  } else {
56  d->~mt_rng();
57  }
58  return 0;
59 }
60 
62 {
63  mt_rng * rng = static_cast<mt_rng *>(luaL_checkudata(L, 1, Rng));
64  std::string seed = luaL_checkstring(L, 2);
65 
66  rng->seed_random(seed);
67  return 0;
68 }
69 
71 {
72  mt_rng * rng = static_cast<mt_rng *>(luaL_checkudata(L, 1, Rng));
73 
75  return 1;
76 }
77 
78 // End Lua Rng bindings
79 
81 {
82  luaL_newmetatable(L, Rng);
83 
84  static luaL_Reg const callbacks[] {
85  { "create", &impl_rng_create},
86  { "__gc", &impl_rng_destroy},
87  { "seed", &impl_rng_seed},
88  { "draw", &impl_rng_draw},
89  { nullptr, nullptr }
90  };
91  luaL_setfuncs(L, callbacks, 0);
92 
93  lua_pushvalue(L, -1); //make a copy of this table, set it to be its own __index table
94  lua_setfield(L, -2, "__index");
95 
96  lua_setglobal(L, Rng);
97 }
98 
99 } // end namespace lua_map_rng
LUALIB_API void * luaL_checkudata(lua_State *L, int ud, const char *tname)
Definition: lauxlib.cpp:333
LUA_API int lua_type(lua_State *L, int idx)
Definition: lapi.cpp:251
int impl_rng_destroy(lua_State *L)
Definition: lua_rng.cpp:47
uint32_t get_next_random()
Get a new random number.
Definition: mt_rng.cpp:62
#define d
LUALIB_API void luaL_setmetatable(lua_State *L, const char *tname)
Definition: lauxlib.cpp:312
static lg::log_domain log_lua("scripting/lua")
LUA_API void lua_setglobal(lua_State *L, const char *name)
Definition: lapi.cpp:758
LUALIB_API void * luaL_testudata(lua_State *L, int ud, const char *tname)
Definition: lauxlib.cpp:318
LUA_API void lua_pushnumber(lua_State *L, lua_Number n)
Definition: lapi.cpp:458
LUALIB_API int luaL_newmetatable(lua_State *L, const char *tname)
Definition: lauxlib.cpp:299
static const char * Rng
Definition: lua_rng.cpp:36
int impl_rng_seed(lua_State *L)
Definition: lua_rng.cpp:61
LUA_API void lua_pushvalue(lua_State *L, int idx)
Definition: lapi.cpp:237
#define ERR_LUA
Definition: lua_rng.cpp:29
LUA_API int lua_error(lua_State *L)
Definition: lapi.cpp:1113
Standard logging facilities (interface).
void seed_random(const std::string &seed, const unsigned int call_count=0)
Same as uint32_t version, but uses a stringstream to convert given hex string.
Definition: mt_rng.cpp:88
LUALIB_API void luaL_setfuncs(lua_State *L, const luaL_Reg *l, int nup)
Definition: lauxlib.cpp:934
int impl_rng_create(lua_State *L)
Implementations for lua callbacks.
Definition: lua_rng.cpp:38
int impl_rng_draw(lua_State *L)
Definition: lua_rng.cpp:70
void load_tables(lua_State *L)
Creates the metatable for RNG objects, and adds the Rng table which contains the constructor.
Definition: lua_rng.cpp:80
LUA_API const char * lua_pushstring(lua_State *L, const char *s)
Definition: lapi.cpp:491
LUA_API void lua_setfield(lua_State *L, int idx, const char *k)
Definition: lapi.cpp:776
LUA_API const char * lua_typename(lua_State *L, int t)
Definition: lapi.cpp:257
#define luaL_checkstring(L, n)
Definition: lauxlib.h:124