Lua Utils
Biblioteca utilitária para facilitar a integração de Lua com C++
luaTable.h
Go to the documentation of this file.
1 /************************************************************************
2 **
3 ** Copyright (C) 2009 K2FS Sistemas e Projetos Ltd.
4 ** All rights reserved.
5 **
6 ************************************************************************/
7 
18 #ifndef _LUATABLE_H_
19 #define _LUATABLE_H_
20 
21 #include <QVariant>
22 
23 #include "luaObjRef.h"
24 
25 class QStringList;
26 
30 class LUAUTILS_API_EXPORT LuaTable : public LuaObjRef
31 {
32 public:
33  LuaTable();
34  LuaTable(const LuaTable& other);
35  LuaTable(LuaEnv* lua, int index, bool ref = false);
36  LuaTable(LuaEnv* lua);
37  ~LuaTable();
38 
39  QVariant getIndex(int index, LuaEnv::StackOption opt = LuaEnv::STACK_AUTO);
40  QVariant getField(const char* name, LuaEnv::StackOption opt = LuaEnv::STACK_AUTO);
41  void pushField(const char* name);
42 
44  QVariant getField(QString name, LuaEnv::StackOption opt = LuaEnv::STACK_AUTO) { return getField(luaPrintable(name), opt); }
45 
47  void pushField(QString name) { pushField(luaPrintable(name)); }
48 
50  QVariant toVariant() const { QVariant v; v.setValue(*this); return v; }
51 
52  QStringList toStringList();
53  QList<double> toDoubleList();
54  QList<bool> toBoolList();
55  QVariantList toVariantList();
56  void fromStringList (const QStringList& list);
57  void fromVariantList(const QVariantList& list);
58  void fromVariantMap (const QVariantMap& map, bool useIntegerKeys = false);
59 
60  void setIndex(int index, const QVariant& val, bool raw = false);
61  void setField(const char* name, const QVariant& val, bool raw = false);
62  void setField(const QVariant& key, const QVariant& val, bool raw = false);
63 
65  void setField(QString name, const QVariant& val, bool raw = false) { setField(luaPrintable(name), val, raw); }
66 
67  bool callMethod(const char* name, int nresults, QString& err);
68  bool callMethod(const char* name, QVariant a1, int nresults, QString& err);
69  bool callMethod(const char* name, QVariant a1, QVariant a2, int nresults, QString& err);
70  bool callMethod(const char* name, QVariant a1, QVariant a2, QVariant a3, int nresults, QString& err);
71  bool callMethod(const char* name, QVariant a1, QVariant a2, QVariant a3, QVariant a4, int nresults, QString& err);
72  bool callMethod(const char* name, QVariant a1, QVariant a2, QVariant a3, QVariant a4, QVariant a5, int nresults, QString& err);
73  bool callMethod(const char* name, QVariant a1, QVariant a2, QVariant a3, QVariant a4, QVariant a5, QVariant a6, int nresults, QString& err);
74  bool callMethod(const char* name, QVariant a1, QVariant a2, QVariant a3, QVariant a4, QVariant a5, QVariant a6, QVariant a7, int nresults, QString& err);
75 
76  bool callFunction(const char* name, int nresults, QString& err);
77  bool callFunction(const char* name, QVariant a1, int nresults, QString& err);
78  bool callFunction(const char* name, QVariant a1, QVariant a2, int nresults, QString& err);
79  bool callFunction(const char* name, QVariant a1, QVariant a2, QVariant a3, int nresults, QString& err);
80  bool callFunction(const char* name, QVariant a1, QVariant a2, QVariant a3, QVariant a4, int nresults, QString& err);
81  bool callFunction(const char* name, QVariant a1, QVariant a2, QVariant a3, QVariant a4, QVariant a5, int nresults, QString& err);
82  bool callFunction(const char* name, QVariant a1, QVariant a2, QVariant a3, QVariant a4, QVariant a5, QVariant a6, int nresults, QString& err);
83  bool callFunction(const char* name, QVariant a1, QVariant a2, QVariant a3, QVariant a4, QVariant a5, QVariant a6, QVariant a7, int nresults, QString& err);
84 
85  int size();
86 
87  template <class T> bool traverse(T& obj);
88 
89  bool callMethodPrepare(const char* name, bool pushTable, QString& err);
90 };
91 
94 
95 
105 template <class T> bool LuaTable::traverse(T& obj)
106 {
107  lua_State* L = _lua->state();
108  int top1 = lua_gettop(L); Q_UNUSED(top1); // top1 is used for assert only
109  bool ret = true;
110 
111  // Faz pos apontar para a tabela a ser consultada
112  int pos = objectPos();
113 
114  lua_pushnil(L);
115  while(lua_next(L, pos) != 0)
116  {
117  // Chave está em -2 e valor em -1
120 
121  int top2 = lua_gettop(L); Q_UNUSED(top2); // top2 is used for assert only
122  ret = obj(key, val);
123  assert(top2 == lua_gettop(L));
124  if(!ret)
125  {
126  lua_pop(L, 1);
127  break;
128  }
129  }
130 
131  // Se estamos operando com uma ref., remove tabela colocada na pilha por objectPos()
132  if(_ref != LUA_NOREF)
133  lua_remove(L, pos);
134  assert(top1 == lua_gettop(L));
135  return ret;
136 }
137 
138 
139 #endif
140 
QVariant getField(QString name, LuaEnv::StackOption opt=LuaEnv::STACK_AUTO)
Método sobrecarregado recebendo um QString.
Definition: luaTable.h:44
void setField(QString name, const QVariant &val, bool raw=false)
Método sobrecarregado recebendo um QString.
Definition: luaTable.h:65
lua_State * state()
Retorna o estado Lua armazenado.
Definition: luaEnv.h:93
QVariant toVariant() const
Retorna um Qvariant.
Definition: luaTable.h:50
int objectPos()
Se o objeto já está na pilha (_ref == LUA_NOREF), simplesmente retorna sua posição....
Definition: luaObjRef.cpp:142
Valor será ou não removido da pilha dependendo de seu tipo.
Definition: luaEnv.h:43
int _ref
Referencia para o objeto.
Definition: luaObjRef.h:57
void setValue(const T &value)
Classe para interface com ambientes Lua.
Definition: luaEnv.h:34
LuaEnv * _lua
Estado Lua que contém o objeto.
Definition: luaObjRef.h:55
void pushField(QString name)
Método sobrecarregado recebendo um QString.
Definition: luaTable.h:47
Indica que o valor não deve ser removido da pilha.
Definition: luaEnv.h:42
bool traverse(T &obj)
Passa por todos os itens da tabela chamando obj(Qvariant key, QVariant val), onde key e val contém o ...
Definition: luaTable.h:105
Classe para interface com ambientes Lua, modelando uma referência para um objeto.
Definition: luaObjRef.h:27
QVariant toVariant(StackOption opt, int index=-1)
Retorna o valor contido no topo da pilha como um QVariant. Se index for diferente de -1,...
Definition: luaEnv.cpp:517
Classe para interface com ambientes Lua, modelando uma tabela.
Definition: luaTable.h:30
StackOption
Opções de manipulação de pilha.
Definition: luaEnv.h:39
Indica que o valor deve ser removido da pilha.
Definition: luaEnv.h:41
Definicao da classe LuaObjRef.
Q_DECLARE_METATYPE(LuaTable)
Cadastra tipo para este poder ser utilizado em um QVariant.