GemaLuaCoreLib
The GeMA Lua Core library
gmLuaValueAccessor.h
Go to the documentation of this file.
1 /************************************************************************
2 **
3 ** Copyright (C) 2014 by Carlos Augusto Teixera Mendes
4 ** All rights reserved.
5 **
6 ** This file is part of the "GeMA" software. It's use should respect
7 ** the terms in the license agreement that can be found together
8 ** with this source code.
9 ** It is provided AS IS, with NO WARRANTY OF ANY KIND,
10 ** INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR
11 ** A PARTICULAR PURPOSE.
12 **
13 ************************************************************************/
14 
25 #ifndef _GEMALUA_VALUE_ACCESSOR_H_
26 #define _GEMALUA_VALUE_ACCESSOR_H_
27 
28 #include "gmLuaObject.h"
29 #include <gmVector.h>
30 
31 #include <gmElementMesh.h>
32 
33 class GmValueAccessor;
34 class GmCellAccessor;
35 class GmGaussAccessor;
41 class GmCell;
42 class GmDiscontinuity;
43 
51 template <class T>
52 class GML_API_EXPORT GmLuaAccessorBase : public GmLuaObject
53 {
54 public:
55  virtual ~GmLuaAccessorBase();
56 
57  virtual QString toString() const;
58 
59  virtual void fillMetatable(lua_State* L, int index);
60 
62  T* accessor() const { return _ac; }
63 
64 protected:
65  GmLuaAccessorBase(T* ac, const GmLogCategory& logger, bool ownership);
66 
68  struct Options {
69  bool evalFunctions, defAsNil;
70  int width, prec;
71  char format;
72 
73  Options(GmValueInfo* info);
74  };
75 
76  void parseCoord (lua_State* L, int stackPos, QString fname, GmVector& coord);
77  void parseOptions(lua_State* L, int stackPos, Options& opt);
78  void pushResult (lua_State* L, const double* val);
79 
80  T* _ac;
81  bool _owner;
82 
83 private:
84  int size (lua_State* L);
85  int info (lua_State* L);
86  int isScalar (lua_State* L);
87  int unit (lua_State* L);
88  int valueSize(lua_State* L);
89  int defValue (lua_State* L);
90 };
91 
101 template <class T, class I>
102 class GML_API_EXPORT GmLuaAccessorIndex: public GmLuaAccessorBase<T>
103 {
104 public:
105  virtual void fillMetatable(lua_State* L, int index);
106 
107 protected:
108  GmLuaAccessorIndex(T* ac, const GmLogCategory& logger, bool ownership);
109 
115  virtual I parseIndex(lua_State* L, int stackPos, QString fname) const = 0;
116 
117 private:
118  int isDefValue (lua_State* L);
119  int isFunction (lua_State* L);
120  int setValue (lua_State* L);
121  int setValueAsDef(lua_State* L);
122  int functionId (lua_State* L);
123 };
124 
125 
127 class GML_API_EXPORT GmLuaValueAccessor: public GmLuaAccessorIndex<GmValueAccessor, int>
128 {
129 public:
130  GmLuaValueAccessor(GmValueAccessor* ac, const GmLogCategory& logger, bool ownership = true);
131 
132  // See comments on the base class
133  virtual const char* typeName() const { return "valueAccessor"; }
134 
136  virtual void* getClassMetatableID() { static int classID = 0; return &classID; }
137 
138  virtual void fillMetatable(lua_State* L, int index);
139 
140 private:
141  int adjustLinearIndex(lua_State* L);
142  int value (lua_State* L);
143  int valueStr (lua_State* L);
144 
145 protected:
146  virtual int parseIndex(lua_State* L, int stackPos, QString fname) const;
147 
148  bool _isGhostAc;
149 };
150 
152 class GML_API_EXPORT GmLuaCellAccessor: public GmLuaAccessorIndex<GmCellAccessor, const GmCell*>
153 {
154 public:
155  GmLuaCellAccessor(GmCellAccessor* ac, const GmLogCategory& logger, bool ownership = true);
156 
157  // See comments on the base class
158  virtual const char* typeName() const { return "cellAccessor"; }
159 
161  virtual void* getClassMetatableID() { static int classID = 0; return &classID; }
162 
163  virtual void fillMetatable(lua_State* L, int index);
164 
165 private:
166  int value (lua_State* L);
167  int valueStr(lua_State* L);
168 
169 protected:
170  virtual const GmCell* parseIndex(lua_State* L, int stackPos, QString fname) const;
171 };
172 
174 class GML_API_EXPORT GmLuaGaussAccessor: public GmLuaAccessorBase<GmGaussAccessor>
175 {
176 public:
177  GmLuaGaussAccessor(GmGaussAccessor* ac, GmElementMesh* mesh, const GmLogCategory& logger, bool ownership = true);
178 
179  // See comments on the base class
180  virtual const char* typeName() const { return "gaussAccessor"; }
181 
183  virtual void* getClassMetatableID() { static int classID = 0; return &classID; }
184 
185  virtual void fillMetatable(lua_State* L, int index);
186 
187 private:
190 
191  I parseIndex(lua_State* L, int stackPos, QString fname) const;
192 
193  int numPoints (lua_State* L);
194  int isDefValue (lua_State* L);
195  int isFunction (lua_State* L);
196  int value (lua_State* L);
197  int setValue (lua_State* L);
198  int setValueAsDef(lua_State* L);
199  int valueStr (lua_State* L);
200  int functionId (lua_State* L);
201 
203 };
204 
211 template <class T, class B>
212 class GML_API_EXPORT GmLuaBCAccessor : public GmLuaAccessorBase<T>
213 {
214 public:
215  virtual void fillMetatable(lua_State* L, int index);
216 
217 private:
218  int isDefValue (lua_State* L);
219  int isFunction (lua_State* L);
220  int setValue (lua_State* L);
221  int setValueAsDef(lua_State* L);
222  int functionId (lua_State* L);
223 
224 protected:
225  GmLuaBCAccessor(T* ac, const B* bc, const GmLogCategory& logger, bool ownership);
226 
227  int parseIndex1(lua_State* L, int stackPos, QString fname) const;
228 
229  const B* _bc;
230 };
231 
232 
234 class GML_API_EXPORT GmLuaBoundaryConditionAccessor : public GmLuaBCAccessor<GmBoundaryConditionAccessor, GmBoundaryCondition>
235 {
236 public:
239  : GmLuaBCAccessor<GmBoundaryConditionAccessor, GmBoundaryCondition>(ac, bc, logger, ownership) {}
240 
241  // See comments on the base class
242  virtual const char* typeName() const { return "bcAccessor"; }
243 
245  virtual void* getClassMetatableID() { static int classID = 0; return &classID; }
246 
247  virtual void fillMetatable(lua_State* L, int index);
248 
249 private:
252 
253  I parseIndex2(lua_State* L, int stackPos, QString fname) const;
254 
255  int value (lua_State* L);
256  int valueStr(lua_State* L);
257 };
258 
260 class GML_API_EXPORT GmLuaContactBoundaryConditionAccessor : public GmLuaBCAccessor<GmContactBoundaryConditionAccessor, GmContactBoundaryCondition>
261 {
262 public:
266 
267  // See comments on the base class
268  virtual const char* typeName() const { return "contactBcAccessor"; }
269 
271  virtual void* getClassMetatableID() { static int classID = 0; return &classID; }
272 
273  virtual void fillMetatable(lua_State* L, int index);
274 
275 private:
277  typedef struct { int ci; int bci; int li; } I;
278 
279  I parseIndex3(lua_State* L, int stackPos, QString fname) const;
280 
281  int value (lua_State* L);
282  int valueStr(lua_State* L);
283 };
284 
286 class GML_API_EXPORT GmLuaDiscontinuityAccessor : public GmLuaAccessorIndex<GmDiscontinuityAccessor, const GmDiscontinuity*>
287 {
288 public:
289  GmLuaDiscontinuityAccessor(GmDiscontinuityAccessor* ac, const GmLogCategory& logger, bool ownership = true);
290 
291  // See comments on the base class
292  virtual const char* typeName() const { return "discontinuityAccessor"; }
293 
295  virtual void* getClassMetatableID() { static int classID = 0; return &classID; }
296 
297  virtual void fillMetatable(lua_State* L, int index);
298 
299 private:
300  int value(lua_State* L);
301  int valueStr(lua_State* L);
302 
303 protected:
304  virtual const GmDiscontinuity* parseIndex(lua_State* L, int stackPos, QString fname) const;
305 };
306 
307 
308 #endif
T * accessor() const
Returns the wrapped accessor.
Definition: gmLuaValueAccessor.h:62
virtual const char * typeName() const
Returns the object type as will be stored in the object metatable.
Definition: gmLuaValueAccessor.h:242
A proxy class to export GmGaussAccessor methods to the Lua environment.
Definition: gmLuaValueAccessor.h:174
Declaration of the GmLuaObject class.
virtual I parseIndex(lua_State *L, int stackPos, QString fname) const =0
Returns the value used as index in accessor calls (either an int, a CmCell* or a GmDiscontinuity*)
T * _ac
The wrapped value accessor object.
Definition: gmLuaValueAccessor.h:80
A proxy class to export GmContactBoundaryConditionAccessor methods to the Lua environment.
Definition: gmLuaValueAccessor.h:260
virtual void fillMetatable(lua_State *L, int index)
Prepares the object metatable for calling methods.
Definition: gmLuaValueAccessor.cpp:98
virtual const char * typeName() const
Returns the object type as will be stored in the object metatable.
Definition: gmLuaValueAccessor.h:268
virtual void * getClassMetatableID()
Returns an unique identifier to identify an user object as a GmValueAccessor object.
Definition: gmLuaValueAccessor.h:295
A helper class for implementing the common behaviour between GmLuaValueAccessor, GmLuaCellAccessor an...
Definition: gmLuaValueAccessor.h:102
virtual void * getClassMetatableID()
Returns an unique identifier to identify an user object as a GmGaussAccessor object.
Definition: gmLuaValueAccessor.h:245
virtual void * getClassMetatableID()
Returns an unique identifier to identify an user object as a GmValueAccessor object.
Definition: gmLuaValueAccessor.h:161
virtual void fillMetatable(lua_State *L, int index)
Prepares the object metatable for calling methods.
Definition: gmLuaValueAccessor.cpp:260
A proxy class to export GmValueAccessor methods to the Lua environment.
Definition: gmLuaValueAccessor.h:127
Options for valueStr()
Definition: gmLuaValueAccessor.h:68
A proxy class to export GmDiscontinuityAccessor methods to the Lua environment.
Definition: gmLuaValueAccessor.h:286
QPair< int, int > I
Type for an object index. Makes the implementation follow closer the one in GmLuaAccessorIndex.
Definition: gmLuaValueAccessor.h:251
GmLuaBoundaryConditionAccessor(GmBoundaryConditionAccessor *ac, const GmBoundaryCondition *bc, const GmLogCategory &logger, bool ownership=true)
Constructor. See comments on the base class.
Definition: gmLuaValueAccessor.h:238
A proxy class to export to the Lua environment the common methods between a GmBoundaryConditionAccess...
Definition: gmLuaValueAccessor.h:212
virtual void fillMetatable(lua_State *L, int index)=0
Function called by populateMetatable() to fill the metatable with exported methods by derived classes...
virtual const char * typeName() const
Returns the object type as will be stored in the object metatable.
Definition: gmLuaValueAccessor.h:180
GmLuaContactBoundaryConditionAccessor(GmContactBoundaryConditionAccessor *ac, const GmContactBoundaryCondition *bc, const GmLogCategory &logger, bool ownership=true)
Constructor. See comments on the base class.
Definition: gmLuaValueAccessor.h:264
virtual void * getClassMetatableID()
Returns an unique identifier to identify an user object as a GmGaussAccessor object.
Definition: gmLuaValueAccessor.h:271
Type for an object index. Makes the implementation follow closer the one in GmLuaAccessorIndex.
Definition: gmLuaValueAccessor.h:277
A proxy class to export GmBoundaryConditionAccessor methods to the Lua environment.
Definition: gmLuaValueAccessor.h:234
QPair< const GmCell *, int > I
Type for an object index. Makes the implementation follow closer the one in GmLuaAccessorIndex.
Definition: gmLuaValueAccessor.h:189
virtual const char * typeName() const
Returns the object type as will be stored in the object metatable.
Definition: gmLuaValueAccessor.h:133
virtual void fillMetatable(lua_State *L, int index)
Prepares the object metatable for calling methods.
Definition: gmLuaValueAccessor.cpp:1022
bool _isGhostAc
Flags stating if the current accessor accepts ghost indices or not.
Definition: gmLuaValueAccessor.h:148
GmElementMesh * _mesh
The associated mesh. Used by parseIndex to validate integration points.
Definition: gmLuaValueAccessor.h:202
virtual void * getClassMetatableID()
Returns an unique identifier to identify an user object as a GmValueAccessor object.
Definition: gmLuaValueAccessor.h:136
const B * _bc
The boundary conditions object used to validate indices in parseIndexX()
Definition: gmLuaValueAccessor.h:229
bool _owner
Do we own the accessor?
Definition: gmLuaValueAccessor.h:81
virtual QString toString() const
Default method used by the __tostring metamethod to capture the result of tostring() over an object.
Definition: gmLuaObject.h:55
A proxy class to export object methods to the Lua environment.
Definition: gmLuaObject.h:35
virtual void * getClassMetatableID()
Returns an unique identifier to identify an user object as a GmGaussAccessor object.
Definition: gmLuaValueAccessor.h:183
virtual const char * typeName() const
Returns the object type as will be stored in the object metatable.
Definition: gmLuaValueAccessor.h:292
A helper class for implementing the common behaviour between GmLuaValueAccessor, GmLuaCellAccessor,...
Definition: gmLuaValueAccessor.h:52
A proxy class to export GmCellAccessor methods to the Lua environment.
Definition: gmLuaValueAccessor.h:152
arma::vec GmVector
virtual const char * typeName() const
Returns the object type as will be stored in the object metatable.
Definition: gmLuaValueAccessor.h:158