Advertisement
egor230

luabridge

Feb 18th, 2019
138
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 34.96 KB | None
  1. //LuaBridge. работа со стеком.
  2.  
  3. int main() {lua_State* L = luaL_newstate();
  4.  
  5.     char x[] = "firts";// массив char.
  6.     string str = "second";
  7.     int a = 30;
  8.  
  9.     Stack<char const*>::push(L, x);// отправить в стек и получить из стека можно
  10.     Stack<string>::push(L, str);// по char const* и string.
  11.     Stack<int>::push(L, a); // отправить в стек переменную a.
  12.     string y = Stack<string>::get(L, -3); //получить из стека
  13.     cout << y << endl;// выводится firts
  14.  
  15.     cout << lua_tostring(L, -2) << endl;// выводится second.
  16.     int a1 = Stack<int>::get(L, -1);
  17.     cout << a1 << endl;// выводится 30.
  18.  
  19.  
  20.     lua_pcall(L, 0, 0, 0);
  21.     lua_close(L);// закрыть состояние
  22.     cin.get();//ожидает ввода символа программа завершается.
  23.     return 0;
  24. }
  25.  
  26. lua api c++. Работа со стеком.
  27.  
  28. #include<iostream>
  29. #include"lua/lua.hpp"
  30. using namespace std;
  31.  
  32. //Стек(англ.stack — стопка; читается стэк) — абстрактный тип данных, представляющий собой список элементов,
  33. //организованных по принципу LIFO(англ.last in — first out, «последний вошёл — первым вышел»)
  34. int main(int argc, char *argv[]) {
  35.  
  36.     lua_State *lua = luaL_newstate();/*Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией-*/
  37.     lua_pushnumber(L, 10);// отправить в стек число.
  38.     lua_pushnumber(L, 20);// отправить в стек число.
  39.     lua_pushnumber(L, 30);// отправить в стек число.
  40.     int number = lua_tonumber(L, -3);// получить 10 из стека 1
  41.     cout << number << endl;
  42.     int number2 = lua_tonumber(L, -2);// получить 20 из стека 2
  43.     cout << number2 << endl;
  44.     int number3 = lua_tonumber(L, -1);// получить 30 из стека 3
  45.     cout << number3 << endl;
  46.  
  47.     lua_close(L);// закрыть состояние
  48.     cin.get();//ожидает ввода символа программа завершается.
  49.  
  50. return 0;
  51. }
  52.  
  53. 163 108
  54. LuaBridge. Получение значения переменных из lua.
  55. /* Класс LuaRef.
  56. LuaRef Класс представляет собой контейнер, который ссылается на любой тип Lua. Он может содержать все,
  57. что может содержать переменная Lua : nil, число, логическое значение, строка, таблица, функция, поток,
  58. userdata и lightuserdata. Поскольку для выполнения своей работы LuaRef используются Stack шаблоны специализаций,
  59. классы, функции и данные, экспортируемые в Lua посредством регистрации пространства имен, также могут быть сохранены
  60. (это экземпляры пользовательских данных). В общем, a LuaRef может представлять любой конвертируемый тип C++, а также все типы Lua.
  61. */
  62.  
  63. int main() {
  64.     lua_State* L = luaL_newstate();
  65.  
  66.     luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в котором все происходит.
  67.     LuaRef s = getGlobal(L, "x"); // получить значение переменной x в LuaRef.
  68. //  cout << s << endl;
  69. //  int a = s.cast<int>();
  70.     int a1 = s.type();// узнать тип переменной.
  71.     cout <<a1<< endl;
  72.  
  73.  
  74.     lua_pcall(L, 0, 0, 0);
  75.     lua_close(L);// закрыть состояние
  76.     cin.get();//ожидает ввода символа программа завершается.
  77.     return 0;
  78. }
  79.  
  80.  
  81.  
  82. lua c++ api. Получение значения переменных из lua с помощью отрицательных индексов стека.
  83. int main() {int t;
  84.     lua_State *L = luaL_newstate();
  85.     luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  86.     lua_getglobal(L, "x");// получить значение глобальной переменной x.
  87.    
  88.     t = lua_type(L, -1);
  89.     if (LUA_TSTRING == t) { cout << "string x " << lua_tostring(L, -1) << endl; }
  90.     else { cout << "not string  x " << endl; }
  91.  
  92.     lua_getglobal(L, "y");// получить значение глобальной переменной x.
  93.     t = lua_type(L, -1);
  94.     if (LUA_TSTRING == t) { cout << "string y " << lua_tostring(L, -1) << endl; }
  95.     else { cout << "not string  y " << endl; }
  96.  
  97.     int n = lua_gettop(L);/* получаем количество элементов в стеке.*/
  98.     cout <<"\nthe number on the stack = "  << n<<"\n";
  99.     lua_settop(L, 0);// уст кол-во элементов в стеке. 0 - очистить стек.
  100.  
  101.        n = lua_gettop(L);/* получаем количество элементов в стеке.*/
  102.     cout << "\nthe number on the stack = " << n << "\n";
  103.  
  104.     lua_close(L);// закрыть состояние
  105.     cin.get();//ожидает ввода символа программа завершается.
  106.  
  107.     return 0;
  108. }
  109.  
  110. Lua
  111. y="i str"
  112. x=23
  113. z = true
  114.  
  115.  
  116.  
  117.  
  118. LuaBridge. работа с таблицей, вывод ключа и значение, добавление нового.
  119.  
  120. void showtab(LuaRef v, lua_State* L) {
  121.     v.push(L); push(L, Nil());// отправить nill на вершину стека.
  122.     while (lua_next(L, -2)) {
  123.         LuaRef key = LuaRef::fromStack(L, -2); // получить из стека и записать в LuaRef.
  124.         LuaRef val = LuaRef::fromStack(L, -1);
  125.         cout << key << " = " << val << endl;
  126.         lua_pop(L, 1);} // Удалить из стека.
  127.     cout << endl;
  128. }
  129. int main() {lua_State* L = luaL_newstate();
  130. luaL_openlibs(L);
  131. luaL_dofile(L, "main.lua");
  132. LuaRef t = getGlobal(L, "t");
  133.     if (!t.isTable()) { cout << "error this is nou tab" << endl; }
  134.     else{showtab(t, L);
  135.     t["x"] = 10;
  136.     cout << "after add\n" << endl;
  137.     showtab(t, L);  }
  138.     lua_pcall(L, 0, 0, 0);
  139.     lua_close(L);// закрыть состояние
  140.     cin.get();//ожидает ввода символа программа завершается.
  141.     return 0;
  142. }
  143.  
  144. lua c++ api. функция вывода ключей и значений таблицы.
  145.  
  146.  
  147. int pri(lua_State *L, const char t[] ) {// передаем указатель на состояние.
  148.     lua_getglobal(L, t);// получить значение глобальной переменной, таблица.
  149.     lua_assert(lua_istable(L, -1));// проверить является 1 элемент стека таблицей.
  150.     if (LUA_TTABLE == lua_type(L, -1)) {// это таблица.
  151.     lua_pushnil(L);//кладем на вершину стека NULL
  152.   while (lua_next(L, 1) != 0) {/* получает ключ из стека и отправляет пару ключ - значение из таблицы.
  153.       Ключ имеет - 2, а значение - 1.*/
  154.         if (LUA_TSTRING == lua_type(L, -2)) {// если ключ строка.
  155.         if (LUA_TNUMBER == lua_type(L, -1)) {// значение число.
  156.         cout << "key " << lua_tostring(L, -2) << " value " << lua_tonumber(L, -1) << endl;}
  157.         lua_pop(L, 1);// удалить n элементы из стека.
  158.         }
  159.     }
  160. }
  161. return 1;// вернуть 1.
  162. }
  163. int main() {
  164.     lua_State *L = luaL_newstate();
  165.     luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  166.     pri(L,"t");// вывести ключи и значения таблицы.
  167.     lua_pcall(L, 0, 0, 0);// вызов функции в lua файле. 1 параметр кол-во передаваемых, кол-во возвращаемых, обработчик ошибок.
  168.     lua_close(L);// закрыть состояние
  169.     cin.get();//ожидает ввода символа программа завершается.
  170.     return 0;}
  171.  
  172.  
  173.  
  174.  
  175. lua
  176.  
  177. t = {a = "str", b = 11, c = "yes", d =true };
  178. t1={23,52,75,96}
  179.  
  180.  
  181.  
  182. LuaBridge. Создание собственного пространства имен, которое представляет таблицу, регистрация переменных.
  183.  
  184. int varx = 10;// глоб переменная.
  185.  
  186. int vary = 20;// глоб переменная.
  187.  
  188. int main() {
  189.     lua_State *L = luaL_newstate();
  190.     luaL_openlibs(L);
  191.     getGlobalNamespace(L).beginNamespace("t")// имя таблицы в в lua.
  192.     .addVariable("x", &varx)// приравнять переменную globalVar к ключю таблицы t.x в lua.
  193.     .addVariable("y", &vary, false) //переменная vary только для чтения.
  194.     .endNamespace();// закрыть пространство имен таблицы.
  195.  
  196.     luaL_dofile(L, "main.lua");
  197.     lua_pcall(L, 0, 0, 0);
  198.     cout << "\nvarx = "<<varx << "\nvary = " <<vary << endl;
  199.     lua_close(L);// закрыть состояние
  200.     cin.get();//ожидает ввода символа программа завершается.
  201.     return 0;
  202. }
  203. lua
  204. print("varx = "..t.x)
  205. t.x = 999 --globalVar присвовить 999
  206.  
  207. --t.y = 16.1110--присвоение запрещено
  208. print("vary = "..t.y)
  209.  
  210.  
  211. LuaBridge. Пространства имен, регистрация функций.
  212.  
  213. string str = "i c++\n";// исходная строка.
  214. void set(string s) { str = s; }
  215. string get() { cout << "this is str in func get " << str << endl; return str; }
  216.  
  217. int main() {lua_State *L = luaL_newstate();
  218.     luaL_openlibs(L);
  219.     getGlobalNamespace(L).beginNamespace("t")// имя таблицы в в lua.
  220.         .addProperty("set", get, set)// ключ таблицы вызывает функция.
  221.         .addProperty("get", get)// ключ таблицы вызывает функция.
  222.         .endNamespace();// закрыть пространство имен таблицы.
  223.  
  224.     luaL_dofile(L, "main.lua");
  225.     lua_pcall(L, 0, 0, 0);
  226.     lua_close(L);// закрыть состояние
  227.     cin.get();//ожидает ввода символа программа завершается.
  228.     return 0;
  229. }
  230.  
  231. lua
  232.  
  233. a = t.get -- получить исходную строку.
  234. print("in lua "..a.."\n")
  235. t.set = "new string"
  236. a = t.get-- измененную строку.
  237.  
  238. print("in lua "..a.."\n")
  239.  
  240.  
  241.  
  242.  
  243. LuaBridge. Регистрация функций.
  244.  
  245. void foo() {
  246.     cout << "i func foo\n" << endl;}
  247.  
  248. int main() {lua_State* L = luaL_newstate();
  249. luaL_openlibs(L);
  250. getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  251. .addFunction("foo", foo);// название функции в lua и c++.
  252.  
  253. luaL_dofile(L, "main.lua");
  254.  
  255. lua_pcall(L, 0, 0, 0);
  256. lua_close(L);// закрыть состояние
  257. cin.get();//ожидает ввода символа программа завершается.
  258. return 0;}
  259.  
  260. lua
  261.  
  262. foo()
  263.  
  264. lua c++ api. Регистрация новой функции в lua.
  265.  
  266. int q(lua_State *lua) {// передаем указатель на состояние.
  267.     int x = lua_tonumber(lua, 1); // получаем 1 элемент из стека.
  268.     x = x * x;
  269.    //cout << x << endl;
  270.     lua_pushnumber(lua, x);// умножаем x и отправляет в стек.
  271.     return 1;// вернуть 1.
  272. }
  273. int main() {
  274.     lua_State *L = luaL_newstate();
  275.     luaL_openlibs(L);//открыть все стандартные библиотеки lua.
  276.     lua_register(L, "q", q);// регистрируем функцию- имя состояние, имя функ в lua, имя функ тут.
  277.     luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  278.     lua_pcall(L, 0, 0, 0);// вызов функции в lua файле. 1 параметр кол-во передаваемых, кол-во возвращаемых, обработчик ошибок.
  279.     lua_close(L);// закрыть состояние
  280.     cin.get();//ожидает ввода символа программа завершается.
  281.     return 0;}
  282.  
  283.  
  284. lua
  285. x = q(2)
  286. print(x)
  287.  
  288. LuaBridge. Функция, принимающая аргументы.
  289.  
  290. void foo(int x, int y) {
  291.     cout << x+y<<"\n" << endl;}
  292.  
  293. int main() {lua_State* L = luaL_newstate();
  294. luaL_openlibs(L);
  295. getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  296. .addFunction("foo", foo);// название функции в lua и c++.
  297.  
  298. luaL_dofile(L, "main.lua");
  299.  
  300. lua_pcall(L, 0, 0, 0);
  301. lua_close(L);// закрыть состояние
  302. cin.get();//ожидает ввода символа программа завершается.
  303. return 0;}
  304.  
  305.  
  306. lua
  307.  
  308. foo(20,36)
  309.  
  310. LuaBridge. функция, возвращающая значение.
  311.  
  312. int sum(int x, int y) {
  313.     int sum = x + y;
  314.     cout <<sum <<"\n" << endl;
  315.     return sum;
  316. }
  317.  
  318. int main() {lua_State* L = luaL_newstate();
  319. luaL_openlibs(L);
  320. getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  321. .addFunction("sum", sum);// название функции в lua и c++.
  322.  
  323. luaL_dofile(L, "main.lua");
  324.  
  325. lua_pcall(L, 0, 0, 0);
  326. lua_close(L);// закрыть состояние
  327. cin.get();//ожидает ввода символа программа завершается.
  328. return 0;}
  329.  
  330. lua
  331.  
  332. s=sum(5,5)
  333.  
  334. int s; // глобальная переменная для вывода результата функции.
  335. int sum(int x, int y, lua_State* L) {
  336.     int sum = x + y;
  337.     s = sum; // сохраняем значение sum в переменную s.
  338.     return sum;}
  339.  
  340. int main() {lua_State* L = luaL_newstate();
  341.     luaL_openlibs(L);
  342.     getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  343.     .addFunction("sum", sum);// название функции в lua и c++.
  344.     luaL_dofile(L, "main.lua");
  345.     lua_pcall(L, 0, 0, 0);
  346.     cout << s << endl;
  347.  
  348.     lua_close(L);// закрыть состояние
  349.     cin.get();//ожидает ввода символа программа завершается.
  350.     return 0;
  351. }
  352.  
  353.  
  354. lua
  355.  
  356. s=sum(5,5)
  357.  
  358.  
  359.  
  360. LuaBridge. Регистрация func функций.
  361.  
  362. void writelog(const char x[]) {
  363.     string path = "log.txt";
  364.     fstream f1; {f1.open(path, fstream::in | fstream::out | fstream::app);
  365.     f1 << x << "\n"; }
  366.     f1.close();
  367. };
  368. int foo(lua_State* L) {
  369. try {if (LUA_TNUMBER == lua_type(L, -1)) {// значение число.
  370.         double x = lua_tonumber(L, -1);
  371.         int x2 = (int)x;
  372.         if (x == x2) { cout << x2 << endl; }// int
  373.         else { throw "bad argument in function"; }
  374.     }
  375.     else{throw "bad argument in function";  }
  376. }
  377. catch (const char* x) {
  378.     writelog(x);}
  379.     return 0;
  380. }
  381.  
  382. int main() {
  383.     lua_State* L = luaL_newstate();
  384.     luaL_openlibs(L);
  385.     getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  386.         .addCFunction("foo", foo);// название функции в lua и c++.
  387.  
  388.     luaL_dofile(L, "main.lua");
  389.  
  390.     lua_pcall(L, 0, 0, 0);
  391.     lua_close(L);// закрыть состояние
  392.     cin.get();//ожидает ввода символа программа завершается.
  393.     return 0;
  394. }
  395.  
  396. Lua
  397.  
  398. foo(5)
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406. api lua c++. Структура конструктор по умолчанию.
  407.  
  408. struct a {  int x = 30;
  409. a() { this->x = x; }//конструктор по умолчанию
  410.     void show() { cout << "x = " << x << endl; }    
  411. ~a() { cout << "destory object " << this << endl << endl; }
  412. };
  413. int destroy(lua_State* L) {// Функция вызывает деструктор для объекта.
  414.     a* st = (a*)lua_touserdata(L, -1);/* Если значение в данном приемлемом индексе является полными данными пользователя.*/
  415.     st->~a();//вызов метода деструктор.
  416.     return 0;};
  417.  
  418. int create(lua_State* L) {//Функция создания объекта структуры.
  419.     void* st = lua_newuserdata(L, sizeof(a));/*Эта функция выделяет новый блок памяти с заданным размером,*/
  420.     new (st) a();// Выделить память под польз. данные.
  421.     luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
  422.     lua_setmetatable(L, 1);//получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
  423.     return 1;};
  424.  
  425. int show(lua_State* L) {
  426.     a* st = (a*)lua_touserdata(L, -1);// получаем польз. данные.
  427.     st->show();// вызов метода.
  428.     return 0;};
  429.  
  430. int main() {
  431.     lua_State* L = luaL_newstate();
  432.     lua_newtable(L);
  433.     lua_pushcfunction(L, create);//уст указатель на функцию C++ и создает внутри Lua
  434.     lua_setglobal(L, "get"); //получает значение из стека и уст значение global name.
  435.     lua_pushcfunction(L, show);
  436.     lua_setglobal(L, "show"); //получает значение из стека и уст значение global name.
  437.     luaL_newmetatable(L, "mt");/*int luaL_newmetatable (lua_State * L, const char * t); */
  438.     lua_pushstring(L, "__gc");
  439.     lua_pushcfunction(L, destroy);
  440.     lua_settable(L, 2);
  441.        luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  442.     lua_close(L);// закрыть состояние
  443.     cin.get();//ожидает ввода символа программа завершается.
  444. return 0;}
  445.  
  446. lua
  447. a= get()
  448. show(a)
  449.  
  450.  
  451. LuaBridge. Реализация ОПП. Создание класса.
  452.  
  453. Объект зарегистрированного класса T может быть передан Lua как:
  454.  
  455. T   Передано по значению (копия), со временем жизни Lua.
  456. T const Передано по значению (копия), со временем жизни Lua.
  457. T*  Передано по ссылке, со временем жизни C ++ .
  458. T&  Передано по ссылке, со временем жизни C ++ .
  459. T const*    Передается по константной ссылке, со временем жизни C ++ .
  460. T const& Передается по константной ссылке, со временем жизни C ++ .
  461.  
  462.  
  463. struct a {int x = 10;
  464.     a() { this->x = x; cout <<"create object " << this << "\ncall default constructor\n" << endl; }
  465.     void set(int x) {
  466.         this->x = x;    }
  467.     void show() const {/* время жизни lua.*/
  468.         cout << "x = " << x << endl;    }
  469.  
  470. ~a() { cout << "destory object " << this << endl; }//вызов деструктора.
  471.  
  472. };
  473.  
  474. int main() {
  475.     lua_State *L = luaL_newstate();
  476.     luaL_openlibs(L);
  477.     luabridge::getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  478.         .beginClass<a>("st")//имя класса в c++ и lua.
  479.         .addConstructor<void(*)()>()// вызов конструктора по умолчанию.
  480.         .addFunction("show", &a::show)// вызов метода get.
  481.         .addFunction("set", &a::set)// вызов метода set.
  482.         .endClass();// закрыть пространство создание класса
  483.  
  484.     luaL_dofile(L, "main.lua");
  485.     lua_pcall(L, 0, 0, 0);
  486.  
  487.     lua_close(L);// закрыть состояние
  488.     cin.get();//ожидает ввода символа программа завершается.
  489.     return 0;
  490. }
  491. Lua
  492.  
  493. p = st()
  494.  
  495. p:show()
  496. p:set(42)
  497.  
  498. p:show()
  499.  
  500. p1 = st()
  501.  
  502. p1:show()
  503. p1:set(100)
  504.  
  505. p1:show()
  506.  
  507. LuaBridge. Вызов конструктора c параметром.
  508.  
  509. struct a {int x;
  510.     a(int x) { this->x = x; cout <<"create object " << this << "\ncall constructor with parameters\n\n"; }
  511.     void set(int x) {
  512.         this->x = x;    }
  513.     void show() const {/* время жизни lua.*/
  514.         cout << "x = " << x << endl;    }
  515.  
  516. ~a() { cout << "destory object " << this << endl; }//вызов деструктора.
  517.  
  518. };
  519.  
  520. int main() {
  521.     lua_State *L = luaL_newstate();
  522.     luaL_openlibs(L);
  523.     luabridge::getGlobalNamespace(L)//Пространства имен LuaBridge для регистрации функции и классов, видны только сценариям Lua.
  524.         .beginClass<a>("st")//имя класса в c++ и lua.
  525.         .addConstructor<void(*)(int)>()// вызов конструктора c параметром.
  526.         .addFunction("show", &a::show)// вызов метода get.
  527.         .addFunction("set", &a::set)// вызов метода set.
  528.         .endClass();// закрыть пространство создание класса
  529.  
  530.     luaL_dofile(L, "main.lua");
  531.     lua_pcall(L, 0, 0, 0);
  532.  
  533.     lua_close(L);// закрыть состояние
  534.     cin.get();//ожидает ввода символа программа завершается.
  535.     return 0;
  536. }
  537.  
  538. Lua
  539.  
  540. p = st(23)
  541.  
  542. p:show()
  543. p:set(42)
  544.  
  545. p:show(36)
  546.  
  547.  
  548. p1 = st(76)
  549.  
  550. p1:show()
  551. p1:set(100)
  552.  
  553. p1:show()
  554.  
  555.  
  556. api lua. ООП.
  557.  
  558. struct a{int x=0;
  559.   a() : x() { cout <<"create object "<< this << endl; }//конструктор по умолчанию
  560.  
  561.     void set(int x){this->x = x;}//уст значение x.
  562.  
  563.     void show() {cout << "object - " << this << " x = " << x << endl;}
  564.     //вывести значение x на экран.
  565.     ~a() {cout <<"destory object "<< this << endl;  }//вызов деструктора.
  566. };
  567.  
  568. int create(lua_State* L){// Функция создания объекта структуры.
  569.     void* pointerToAa = lua_newuserdata(L, sizeof(a));/*Эта функция выделяет новый блок памяти с заданным размером,
  570. помещает в стек новые полные пользовательские данные с адресом блока и возвращает этот адрес. Пользовательские данные
  571. представляют значения C в Lua. Полный UserData представляет собой блок памяти. Это объект (например, таблица):
  572. вы должны создать его, у него может быть свой собственный метатабль, и вы можете определить, когда он собирается.
  573. Полные пользовательские данные равны только себе (при необработанном равенстве). Когда Lua собирает полные данные
  574. пользователя с gcметаметодом, Lua вызывает метаметод и помечает данные пользователя как завершенные.
  575. Когда эти пользовательские данные собираются снова, Lua освобождает соответствующую память.*/
  576.     new (pointerToAa) a();// Выделить память под польз. данные.
  577.     luaL_getmetatable(L, "aMetaTable"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.
  578.     Если индекс не является действительным, или если значение не имеет метатаблицы, функция возвращает 0 и не отправляет ничего в стеке.*/
  579.     lua_assert(lua_istable(L, 2));//ловит исключения если ли условия ложное.
  580.     lua_setmetatable(L, 1);//получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
  581.     return 1;
  582. };
  583.  
  584. int destroy(lua_State* L){// Функция вызывает деструктор для объекта.
  585.     a* st = (a*)lua_touserdata(L, 1);/* Если значение в данном приемлемом индексе является полными данными пользователя,
  586.     возвращает адрес его блока. Если значение является легким userdata, возвращает его указатель.В противном случае возвращается NULL.*/
  587.     st->~a();//вызов метода деструктор.
  588.     return 0;};
  589.  
  590. int set(lua_State* L){
  591.     a* st = (a*)lua_touserdata(L, 1);
  592.     lua_Number x = lua_tonumber(L, 2);
  593.     st->set((int)x);
  594.     return 0;};
  595.  
  596. int show(lua_State* L){
  597.     a* st = (a*)lua_touserdata(L, 1);
  598.     st->show();
  599.     return 0;};
  600.  
  601. int index(lua_State* L){
  602.     lua_assert(lua_isuserdata(L, 1));
  603.     lua_assert(lua_isstring(L, 2));
  604.  
  605.     a* st = (a*)lua_touserdata(L, 1);
  606.     const char* index = lua_tostring(L, 2);
  607.     if (strcmp(index, "x") == 0){
  608.         lua_pushnumber(L, st->x);
  609.         return 1;   }
  610.     else{lua_getglobal(L, "a");
  611.         lua_pushstring(L, index);
  612.         lua_rawget(L, 3);// Аналогично lua_settable, но делает необработанное назначение(т.Е.Без метаметодов).
  613.         return 1;   }
  614. };
  615.  
  616. int newindex(lua_State* L){
  617.     lua_assert(lua_isuserdata(L, -3));
  618.     lua_assert(lua_isstring(L, -2));//
  619.     a* st = (a*)lua_touserdata(L, -3);
  620.     const char* index = lua_tostring(L, -2);
  621.     if (strcmp(index, "x") == 0){
  622.         st->x = (int)lua_tonumber(L, -1);   }
  623.     else{lua_assert(false); }
  624.     return 0;
  625. };
  626.  
  627. int main() {
  628.     lua_State* L = luaL_newstate();
  629.     lua_newtable(L);
  630.     int stTableIdx = lua_gettop(L);
  631.     lua_pushvalue(L, stTableIdx);// отправляет копию элемента с заданным допустимым индексом в стек.
  632.     lua_setglobal(L, "a");// Установить значение глобальной переменной.
  633.  
  634.     lua_pushcfunction(L, create);/* отправляет функцию C в стек. функция получает указатель на функцию C и отправляет в стек
  635.      значение типа Lua, function которое при вызове вызывает соответствующую функцию C.   Любая функция, которая должна быть
  636.      зарегистрирована в Lua, должна следовать правильному протоколу, чтобы получать свои параметры и возвращать свои результаты*/
  637.     lua_setfield(L, 1, "new");/*(lua_State * L, int index, const char * k); Соответствует ли t[k] = v, где t значение данного
  638.     заданного допустимого индекса и vзначение в верхней части стека. Эта функция извлекает значение из стека. Как и в Lua,
  639.     эта функция может запускать метаметод для события «newindex» (см. §2.8 ). уст ключ для new.   */
  640.     lua_pushcfunction(L, set);
  641.     lua_setfield(L, 1, "set");
  642.     lua_pushcfunction(L, show);
  643.     lua_setfield(L, 1, "show");
  644.  
  645.     luaL_newmetatable(L, "aMetaTable");/*int luaL_newmetatable (lua_State * L, const char * t); Если в реестре уже есть ключ t,
  646.      возвращает 0. В противном случае создает новую таблицу, которая будет использоваться в качестве метатаблицы
  647.      для пользовательских данных, добавляет ее в реестр с ключом tnameи возвращает 1. В обоих случаях помещает в стек
  648.      окончательное значение, связанное с t реестром.*/
  649.     lua_pushstring(L, "__gc");
  650.     lua_pushcfunction(L, destroy);
  651.     lua_settable(L, 2);
  652.  
  653.     lua_pushstring(L, "__index");
  654.     lua_pushcfunction(L, index);
  655.     lua_settable(L, 2);
  656.  
  657.     lua_pushstring(L, "__newindex");
  658.     lua_pushcfunction(L, newindex);
  659.     lua_settable(L, 2);
  660.  
  661.     int x = luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  662.  
  663.     if (x == LUA_OK) {  lua_close(L);// если поллучилось открыть файл.
  664.         cin.get();}//ожидает ввода символа программа завершается.
  665.    
  666.     else {  cout << "Error: "<<lua_tostring(L, -1)<<endl;
  667.         lua_close(L);// закрыть состояние
  668.         cin.get();//ожидает ввода символа программа завершается.
  669.         return 0;   }
  670. }
  671. Lua
  672. st = a.new()
  673. --st:show()
  674. st:set(100)
  675. st:show()
  676. st1 = a.new()
  677. st1:set(200)   
  678. st1:show()
  679.  
  680.  
  681.  
  682.  
  683.  
  684. api lua. Реализация ООП через функции. Структура, конструктор с парамертами.
  685.  
  686.  
  687. struct a {  int x = 3010;
  688. a() { this->x = x; }//конструктор по умолчанию
  689.     void show() { cout << "x = " << x << endl; }
  690. };
  691.  
  692. int create(lua_State* L) {//    Функция создания объекта структуры.
  693.     void* st = lua_newuserdata(L, sizeof(a));/*Эта функция выделяет новый блок памяти с заданным размером,*/
  694.     new (st) a();// Выделить память под польз. данные.
  695.     luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
  696.     lua_setmetatable(L, 1);//получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
  697.     return 1;};
  698.  
  699. int destroy(lua_State* L) {// Функция вызывает деструктор для объекта.
  700.     a* st = (a*)lua_touserdata(L, 1);/* Если значение в данном приемлемом индексе является полными данными пользователя.*/
  701.     st->~a();//вызов метода деструктор.
  702.     return 0;};
  703.  
  704. int show(lua_State* L) {
  705.     a* st = (a*)lua_touserdata(L, -1);
  706.     st->show();
  707.     return 0;};
  708.  
  709. int main() {
  710.     lua_State* L = luaL_newstate();
  711.     lua_newtable(L);
  712.     lua_pushcfunction(L, create);//уст указатель на функцию C++ и создает внутри Lua
  713.     lua_setglobal(L, "get"); //получает значение из стека и уст значение global name.
  714.     lua_pushcfunction(L, show);
  715.     lua_setglobal(L, "show"); //получает значение из стека и уст значение global name.
  716.     luaL_newmetatable(L, "mt");/*int luaL_newmetatable (lua_State * L, const char * t); */
  717.     lua_pushstring(L, "__gc");
  718.     lua_pushcfunction(L, destroy);
  719.     lua_settable(L, 2);
  720.     luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  721.     lua_close(L);// закрыть состояние
  722.     cin.get();//ожидает ввода символа программа завершается.
  723. return 0;
  724. }
  725. Lua
  726.  
  727. a = get()
  728. show(a)
  729.  
  730.  
  731. lua api
  732.  
  733. struct a {  int x = 3010;
  734. a() { this->x = x; }//конструктор по умолчанию
  735.     void show() { cout << "x = " << x << endl; }
  736. };
  737.  
  738. int create(lua_State* L) {//    Функция создания объекта структуры.
  739.     void* st = lua_newuserdata(L, sizeof(a));/*Эта функция выделяет новый блок памяти с заданным размером,*/
  740.     new (st) a();// Выделить память под польз. данные.
  741.     luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
  742.     lua_setmetatable(L, 1);//получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
  743.     return 1;};
  744.  
  745. int destroy(lua_State* L) {// Функция вызывает деструктор для объекта.
  746.     a* st = (a*)lua_touserdata(L, 1);/* Если значение в данном приемлемом индексе является полными данными пользователя.*/
  747.     st->~a();//вызов метода деструктор.
  748.     return 0;};
  749.  
  750. int show(lua_State* L) {
  751.     a* st = (a*)lua_touserdata(L, -1);
  752.     st->show();
  753.     return 0;};
  754.  
  755. int main() {
  756.     lua_State* L = luaL_newstate();
  757.     lua_newtable(L);
  758.     lua_pushcfunction(L, create);//уст указатель на функцию C++ и создает внутри Lua
  759.     lua_setglobal(L, "get"); //получает значение из стека и уст значение global name.
  760.     lua_pushcfunction(L, show);
  761.     lua_setglobal(L, "show"); //получает значение из стека и уст значение global name.
  762.     luaL_newmetatable(L, "mt");/*int luaL_newmetatable (lua_State * L, const char * t); */
  763.     lua_pushstring(L, "__gc");
  764.     lua_pushcfunction(L, destroy);
  765.     lua_settable(L, 2);
  766.     luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
  767.     lua_close(L);// закрыть состояние
  768.     cin.get();//ожидает ввода символа программа завершается.
  769. return 0;
  770. }
  771. Lua
  772.  
  773. a = get()
  774. show(a)
  775.  
  776.  
  777.  
  778. luabridge. Реализация ООП через функции. Структура, конструктор с парамертами.
  779.  
  780.  
  781. struct a {
  782.     int x = 302;
  783.     a(int x) { this->x = x; cout << "call constructor with parameters\n" << endl; }
  784.     void get() const /* время жизни lua.*/ { cout << x << " " << endl; }
  785.     ~a() { cout << "desctor " << this << endl; }
  786. };
  787.  
  788. void pri(lua_State* L) {
  789.     a *b = (a*)Userdata::get<a>(L, 1, false);
  790.     b->get();// вызов метода переданного класса
  791. }
  792. int main() {
  793.     lua_State *L = luaL_newstate();
  794.     luaL_openlibs(L); getGlobalNamespace(L)// получить глоб место.
  795.         .beginClass<a>("st")// имя класса в lua.
  796.         .addConstructor<void(*)(int)>()// конструктор класса.
  797.         .addFunction("get", &a::get)// метод класса
  798.         .endClass()// закрыть регистрацию класса.
  799.         .addFunction("pri", &pri);// Регистрация функции.
  800.  
  801.     luaL_dofile(L, "main.lua");
  802.     lua_pcall(L, 0, 0, 0);
  803.     lua_close(L);// закрыть состояние
  804.     cin.get();//ожидает ввода символа программа завершается.
  805.     return 0;
  806. }
  807.  
  808. lua
  809.  
  810. a=st(21)
  811. pri(a)
  812. a1=st(21)
  813. pri(a1)
Advertisement
RAW Paste Data Copied
Advertisement