VR-Forces Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
variableParameterBuilder.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2012 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 
8 
9 #pragma once
10 
11 #include <vrfLua/vrfLuaDefines.h>
13 #include <vrfLua/luaUtils.h>
15 #include <vlutil/vlString.h>
17 #include <readerWriter/rwString.h>
18 #include <readerWriter/rwReal.h>
19 #include <readerWriter/rwInt.h>
22 
23 #include <luabind/luabind.hpp>
24 #include <stdexcept>
25 #include <vector>
26 #include <set>
27 
29 {
30 public:
32  {
33  }
34 
36  {
37  }
38 
39 public:
40  virtual DtVariableParameterInterface* clone() const = 0;
41 
44  virtual void process(const std::string&, luabind::object const& parameters) = 0;
45 
47  virtual bool isValid() const = 0;
48 
50  virtual bool specified() const = 0;
51 };
52 
53 template <typename _Container>
55 {
56 public:
59  , mySpecified(false)
60  {
61  }
62 
64  : myRequired(orig.myRequired)
65  , mySpecified(orig.mySpecified)
66  , myValue(orig.myValue)
67  {
68  }
69 
70  DtVariableParameter(const _Container& orig, bool required = false)
72  , mySpecified(true)
73  , myValue(orig)
74  {
75  }
76 
77  virtual ~DtVariableParameter() override {
78  }
79 
80  virtual DtVariableParameterInterface* clone() const override {
81  return new DtVariableParameter<_Container>(*this);
82  }
83 
84  virtual void process(const std::string& parameter, luabind::object const& parameters) override
85  {
86  luabind::object tableEntry = parameters[parameter];
87  if (tableEntry.is_valid())
88  {
89  if (luabind::type(tableEntry) != LUA_TNIL)
90  {
91  myValue = luabind::object_cast<_Container>(tableEntry);
92  mySpecified = true;
93  }
94  }
95  }
96 
97  const _Container& value() const
98  {
99  return myValue;
100  }
101 
102  void setValue(const _Container& value)
103  {
104  myValue = value;
105  mySpecified = true;
106  }
107 
108  virtual bool specified() const override {
109  return mySpecified;
110  }
111 
112  bool required() const
113  {
114  return myRequired;
115  }
116 
117  virtual bool isValid() const override {
118  return (!myRequired || (myRequired && mySpecified));
119  }
120 
121 protected:
122  _Container myValue;
125 };
126 
128 template <typename _Container>
129 class DtVariableParameterVector : public DtVariableParameter<std::vector<_Container> >
130 {
131 public:
133  : DtVariableParameter<std::vector<_Container> >(required)
134  {
135  }
136 
138  : DtVariableParameter<std::vector<_Container> >(orig)
139  {
140  }
141 
142  virtual ~DtVariableParameterVector() override {
143  }
144 
145  virtual DtVariableParameterInterface* clone() const override
146  {
147  return new DtVariableParameterVector<_Container>(*this);
148  }
149 
150  virtual void process(const std::string& parameter, luabind::object const& parameters) override
151  {
152  luabind::object tableEntry = parameters[parameter];
153  if (tableEntry.is_valid())
154  {
155  if (luabind::type(tableEntry) == LUA_TTABLE)
156  {
157  for (luabind::iterator paramItr(tableEntry), end; paramItr != end; ++paramItr)
158  {
159  _Container value = luabind::object_cast<_Container>(*paramItr);
160  this->myValue.push_back(value);
161  }
162 
163  this->mySpecified = true;
164  }
165  }
166  }
167 };
168 
169 
171 template <typename _Container>
173 {
174 public:
176  : DtVariableParameter<_Container*>(required)
177  {
178  this->myValue = 0;
179  }
180 
182  : DtVariableParameter<_Container*>(orig)
183  {
184  if (orig.myValue)
185  {
186  this->myValue = DtReaderWriter::factory()->cloneReaderWriter(orig.myValue->name().c_str(),
187  orig.myValue, 0);
188  }
189  else
190  {
191  this->myValue = 0;
192  }
193  }
194 
195  virtual ~DtVariableParameterReaderWriter() override {
196  delete this->myValue;
197  }
198 
199  virtual DtVariableParameterInterface* clone() const override
200  {
202  }
203 
204  virtual DtReaderWriter* createRwStructure(DtReaderWriter* parentRw, luabind::object const& tableEntry) const
205  {
206  DtReaderWriter* createdRw = 0;
207  for (luabind::iterator paramItr(tableEntry), end; paramItr != end; ++paramItr)
208  {
209  DtReaderWriterRegistry* parentReg = 0;
210  if(parentRw)
211  {
212  parentReg = &parentRw->registry();
213  }
214 
220  createdRw = DtReaderWriter::factory()->createItem(luabind::object_cast<std::string>(paramItr.key()).c_str(),
221  DtString(""), parentReg);
222 
223  if (createdRw)
224  {
225  DtReaderWriterSetter::setRwFromLua(*paramItr, createdRw);
226  }
227  else
228  {
229  if (luabind::type(*paramItr) == LUA_TSTRING)
230  {
231  createdRw = new DtRwString(luabind::object_cast<std::string>(paramItr.key()).c_str(), parentReg);
232 
233  ((DtRwString&)*createdRw) = luabind::object_cast<std::string>(*paramItr).c_str();
234  }
235  else if (luabind::type(*paramItr) == LUA_TNUMBER)
236  {
237  createdRw = new DtRwReal(luabind::object_cast<std::string>(paramItr.key()).c_str(), parentReg);
238 
239  ((DtRwReal&)*createdRw) = luabind::object_cast<double>(*paramItr);
240  }
241  else if (luabind::type(*paramItr) == LUA_TTABLE)
242  {
243  DtReaderWriter tmpRw("");
244 
245  createRwStructure(&tmpRw, *paramItr);
246 
247  if (tmpRw.registry().registryData().size())
248  {
249  createdRw = tmpRw.registry().registryData()[0]->readerWriter();
250 
251  tmpRw.registry().removeEntry(createdRw);
252 
253  createdRw->setName(luabind::object_cast<std::string>(paramItr.key()).c_str());
254  if(parentRw)
255  {
256  parentRw->registry().addEntry(createdRw->name(), createdRw);
257  }
258  }
259  }
260  }
261  }
262 
263  return createdRw;
264  }
265 
266  virtual void process(const std::string& parameter, luabind::object const& parameters) override
267  {
268  delete this->myValue;
269  this->myValue = 0;
270 
271  luabind::object tableEntry = parameters[parameter];
272  if (tableEntry.is_valid())
273  {
274  if (luabind::type(tableEntry) == LUA_TTABLE)
275  {
276  this->myValue = createRwStructure(0, tableEntry);
277 
278  this->mySpecified = true;
279  }
280  }
281  }
282 };
283 
286 {
287 public:
290  {
291  }
292 
295  {
296  }
297 
299  }
300 
301  virtual DtVariableParameterInterface* clone() const override {
302  return new DtVariableParameterNumberOrString(*this);
303  }
304 
305  virtual void process(const std::string& parameter, luabind::object const& parameters) override
306  {
307  luabind::object tableEntry = parameters[parameter];
308  if (tableEntry.is_valid())
309  {
310  if (luabind::type(tableEntry) == LUA_TNUMBER)
311  {
312  myValue = DtString(luabind::object_cast<double>(tableEntry));
313  mySpecified = true;
314  }
315  else if (luabind::type(tableEntry) != LUA_TNIL)
316  {
317  myValue = DtString(luabind::object_cast<std::string>(tableEntry).c_str());
318  mySpecified = true;
319  }
320  }
321  }
322 };
323 
325 class DtVariableParameterSimObject : public DtVariableParameter < DtScriptVrfObject >
326 {
327 public:
330  {
331  mySpecified = false;
332  }
333 
336  {
337  }
338 
339  virtual ~DtVariableParameterSimObject() override {
340  }
341 
342  virtual DtVariableParameterInterface* clone() const override {
343  return new DtVariableParameterSimObject(*this);
344  }
345 };
346 
350 {
351 private:
353 
357 
358 public:
361 
363  virtual ~DtVariableParameterBuilder();
364 
365  void addVariableParameter(const std::string&, const DtVariableParameterInterface&);
366  void removeVariableParameter(const std::string&);
367 
368  template <typename _Container> void addVariableParameter(const std::string& s)
369  {
370  addVariableParameter(s, DtVariableParameter<_Container>());
371  }
372 
373 
374  template <typename _Container> void addRequiredVariableParameter(const std::string& s)
375  {
376  addVariableParameter(s, DtVariableParameter<_Container>(true));
377  }
378 
379  template <typename _Container> void addVariableParameterVector(const std::string& s)
380  {
381  addVariableParameter(s, DtVariableParameterVector<_Container>());
382  }
383 
384  template <typename _Container> void addRequiredVariableParameterVector(const std::string& s)
385  {
386  addVariableParameter(s, DtVariableParameterVector<_Container>(true));
387  }
388 
389  template <typename _Container> void addVariableParameterReaderWriter(const std::string& s)
390  {
391  addVariableParameter(s, DtVariableParameterReaderWriter<_Container>());
392  }
393 
394  template <typename _Container> void addRequiredVariableParameterReaderWriter(const std::string& s)
395  {
396  addVariableParameter(s, DtVariableParameterReaderWriter<_Container>(true));
397  }
398 
399  template <typename _Container> _Container value(const std::string& key) const
400  {
401  VariableParameters::const_iterator iter = myVariableParameters.find(key);
402 
403  if (iter != myVariableParameters.end())
404  {
405  return (dynamic_cast<DtVariableParameter<_Container>*>(iter->second)->value());
406  }
407 
408  return _Container();
409  }
410 
411  template <typename _Container> _Container* valuePointer(const std::string& key) const
412  {
413  VariableParameters::const_iterator iter = myVariableParameters.find(key);
414 
415  if (iter != myVariableParameters.end())
416  {
417  return (dynamic_cast<DtVariableParameter<_Container*>*>(iter->second)->value());
418  }
419 
420  return 0;
421  }
422 
423  template <typename _Container> void set(const std::string& key, const _Container& value)
424  {
425  VariableParameters::iterator iter = myVariableParameters.find(key);
426 
427  if (iter != myVariableParameters.end())
428  {
429  dynamic_cast<DtVariableParameter<_Container>*>(iter->second)->setValue(value);
430  }
431  }
432 
434  virtual bool valueIsSpecified(const std::string&) const;
435 
437  template <typename _Container>
438  std::vector<_Container> valueToStdVector(const std::string& key) const
439  {
440  std::vector<_Container> results;
441  luabind::object object = value<luabind::object>(key);
442 
443  if (luabind::type(object) == LUA_TTABLE)
444  {
445  for (luabind::iterator paramItr(object), end; paramItr != end; ++paramItr)
446  {
447  if (luabind::type(*paramItr) == LUA_TUSERDATA)
448  {
449  if (DtScriptVrfObject* so = vrfLua::luaTypeCast<DtScriptVrfObject>(*paramItr))
450  {
451  results.push_back(static_cast<_Container>(so->getUUID()));
452  }
453  else
454  {
455  results.push_back(luabind::object_cast<_Container>(*paramItr));
456  }
457  }
458  else
459  {
460  results.push_back(luabind::object_cast<_Container>(*paramItr));
461  }
462  }
463  }
464  else if (luabind::type(object) == LUA_TSTRING)
465  {
466  results.push_back(luabind::object_cast<_Container>(object));
467  }
468  else if (luabind::type(object) == LUA_TUSERDATA)
469  {
470  if (DtScriptVrfObject* so = vrfLua::luaTypeCast<DtScriptVrfObject>(object))
471  {
472  results.push_back(static_cast<_Container>(so->getUUID()));
473  }
474  else
475  {
476  results.push_back(luabind::object_cast<_Container>(object));
477  }
478  }
479 
480  return results;
481  }
482 
483  template <typename _Container>
484  std::set<_Container> valueToStdSet(const std::string& key) const
485  {
486  std::set<_Container> results;
487  luabind::object object = value<luabind::object>(key);
488 
489  if (luabind::type(object) == LUA_TTABLE)
490  {
491  for (luabind::iterator paramItr(object), end; paramItr != end; ++paramItr)
492  {
493  if (luabind::type(*paramItr) == LUA_TUSERDATA)
494  {
495  if (DtScriptVrfObject* so = vrfLua::luaTypeCast<DtScriptVrfObject>(*paramItr))
496  {
497  results.insert(static_cast<_Container>(so->getUUID()));
498  }
499  else
500  {
501  results.insert(luabind::object_cast<_Container>(*paramItr));
502  }
503  }
504  else
505  {
506  results.insert(luabind::object_cast<_Container>(*paramItr));
507  }
508  }
509  }
510  else if (luabind::type(object) == LUA_TSTRING)
511  {
512  results.insert(luabind::object_cast<_Container>(object));
513  }
514  else if (luabind::type(object) == LUA_TUSERDATA)
515  {
516  if (DtScriptVrfObject* so = vrfLua::luaTypeCast<DtScriptVrfObject>(object))
517  {
518  results.insert(static_cast<_Container>(so->getUUID()));
519  }
520  else
521  {
522  results.insert(luabind::object_cast<_Container>(object));
523  }
524  }
525 
526  return results;
527  }
528 
531  virtual void process(luabind::object const& parameters);
532 
533 protected:
534  typedef std::map<std::string, DtVariableParameterInterface*> VariableParameters;
536 };
537 
538 
539 template <>
540 inline void DtVariableParameterBuilder::addVariableParameter<DtScriptVrfObject>(const std::string& s)
541 {
542  addVariableParameter(s, DtVariableParameterSimObject());
543 }
544 
545 template <>
546 inline DtScriptVrfObject DtVariableParameterBuilder::value<DtScriptVrfObject>(const std::string& key) const
547 {
548  VariableParameters::const_iterator iter = myVariableParameters.find(key);
549 
550  if (iter != myVariableParameters.end())
551  {
552  return (dynamic_cast<DtVariableParameter<DtScriptVrfObject>*>(iter->second)->value());
553  }
554 
556 }
557 
DT_DLL_vrfLua bool setRwFromLua(const luabind::object &inObj, DtReaderWriter *outRw)
Tries to set all the contents of the reader/writer item from lua. If there is not a factory represent...
virtual void setName(const DtString &)
Set the name of the object. Uses the myName variable. Only set if you understand that this could have...
virtual DtVariableParameterInterface * clone() const override
Definition: variableParameterBuilder.h:301
DtVariableParameterInterface()
Definition: variableParameterBuilder.h:31
void addRequiredVariableParameterReaderWriter(const std::string &s)
Definition: variableParameterBuilder.h:394
DtVariableParameterReaderWriter(const DtVariableParameterReaderWriter &orig)
Definition: variableParameterBuilder.h:181
Definition: variableParameterBuilder.h:54
void addVariableParameter(const std::string &s)
Definition: variableParameterBuilder.h:368
virtual DtVariableParameterInterface * clone() const override
Definition: variableParameterBuilder.h:199
virtual ~DtVariableParameterInterface()
Definition: variableParameterBuilder.h:35
virtual bool specified() const override
Returns true if value has been specified.
Definition: variableParameterBuilder.h:108
const std::vector< DtReaderWriterRegistryData * > & registryData() const
Definition: readerWriterRegistry.h:161
virtual ~DtVariableParameterReaderWriter() override
Definition: variableParameterBuilder.h:195
_Container myValue
Definition: variableParameterBuilder.h:122
Definition: readerWriter.h:85
Description: Readable, Writable DtString Variable substitutions are done on this object when it is re...
Definition: rwString.h:20
void set(const std::string &key, const _Container &value)
Definition: variableParameterBuilder.h:423
DtVariableParameterSimObject(bool required=false)
Definition: variableParameterBuilder.h:328
DtVariableParameterReaderWriter(bool required=false)
Definition: variableParameterBuilder.h:175
VariableParameters myVariableParameters
Definition: variableParameterBuilder.h:535
Definition: readerWriterRegistry.h:39
void addVariableParameterVector(const std::string &s)
Definition: variableParameterBuilder.h:379
SimObject.
Definition: variableParameterBuilder.h:325
std::set< _Container > valueToStdSet(const std::string &key) const
Definition: variableParameterBuilder.h:484
virtual ~DtVariableParameterNumberOrString() override
Definition: variableParameterBuilder.h:298
Vector container.
Definition: variableParameterBuilder.h:129
Vector container.
Definition: variableParameterBuilder.h:172
DtVariableParameterNumberOrString(bool required=false)
Definition: variableParameterBuilder.h:288
DtVariableParameter(const _Container &orig, bool required=false)
Definition: variableParameterBuilder.h:70
virtual DtReaderWriter * cloneReaderWriter(const DtString &name, const DtReaderWriter *sourceRw, DtReaderWriterRegistry *parentRegistry) const
Creates a clone of the RW object to create a clone of the specified object. The object will first be ...
Number or string container.
Definition: variableParameterBuilder.h:285
static DtReaderWriterFactory * factory()
virtual ~DtVariableParameterSimObject() override
Definition: variableParameterBuilder.h:339
const DtReaderWriterRegistry & registry() const
Collection of child DtReaderWriter nodes owned by this object.
Definition: readerWriter.h:492
virtual ~DtVariableParameter() override
Definition: variableParameterBuilder.h:77
virtual DtVariableParameterInterface * clone() const override
Definition: variableParameterBuilder.h:342
const _Container & value() const
Definition: variableParameterBuilder.h:97
Base class that will allow for the addition of parameters that will be filled in with values from lua...
Definition: variableParameterBuilder.h:349
#define DT_DLL_vrfLua
This file is used to determine how to build.
Definition: vrfLuaDefines.h:25
virtual bool isValid() const override
Returns true if valid parameter.
Definition: variableParameterBuilder.h:117
DtVariableParameter(const DtVariableParameter &orig)
Definition: variableParameterBuilder.h:63
virtual void process(const std::string &parameter, luabind::object const &parameters) override
Look in the table for the lua value, and, if specified, fill in.
Definition: variableParameterBuilder.h:266
void addVariableParameterReaderWriter(const std::string &s)
Definition: variableParameterBuilder.h:389
virtual DtVariableParameterInterface * clone() const override
Definition: variableParameterBuilder.h:80
virtual DtVariableParameterInterface * clone() const override
Definition: variableParameterBuilder.h:145
Description: Readable, Writable DtReal (double)
Definition: rwReal.h:27
DtVariableParameterNumberOrString(const DtVariableParameterNumberOrString &orig)
Definition: variableParameterBuilder.h:293
Definition: variableParameterBuilder.h:28
std::vector< _Container > valueToStdVector(const std::string &key) const
Returns a std::vector&lt;type&gt; of table.
Definition: variableParameterBuilder.h:438
bool mySpecified
Definition: variableParameterBuilder.h:124
bool required() const
Definition: variableParameterBuilder.h:112
virtual DtReaderWriter * createItem(const DtString &type, const DtString &name, DtReaderWriterRegistry *parentRegistry) const
Creates a new RW type based on the type string provided, with the specified name and parent registry...
virtual ~DtVariableParameterVector() override
Definition: variableParameterBuilder.h:142
std::map< std::string, DtVariableParameterInterface * > VariableParameters
Definition: variableParameterBuilder.h:534
virtual void process(const std::string &parameter, luabind::object const &parameters) override
Look in the table for the lua value, and, if specified, fill in.
Definition: variableParameterBuilder.h:150
virtual DtReaderWriter * createRwStructure(DtReaderWriter *parentRw, luabind::object const &tableEntry) const
Definition: variableParameterBuilder.h:204
DtVariableParameterVector(bool required=false)
Definition: variableParameterBuilder.h:132
void addRequiredVariableParameterVector(const std::string &s)
Definition: variableParameterBuilder.h:384
void addRequiredVariableParameter(const std::string &s)
Definition: variableParameterBuilder.h:374
virtual DtSymbolString name() const
Accessor for name of this readable/writable object.
virtual void process(const std::string &parameter, luabind::object const &parameters) override
Look in the table for the lua value, and, if specified, fill in.
Definition: variableParameterBuilder.h:305
void setValue(const _Container &value)
Definition: variableParameterBuilder.h:102
static DtScriptVrfObject nullObject()
Returns a null object.
Definition: scriptVrfObject.h:387
virtual void process(const std::string &parameter, luabind::object const &parameters) override
Look in the table for the lua value, and, if specified, fill in.
Definition: variableParameterBuilder.h:84
bool myRequired
Definition: variableParameterBuilder.h:123
DtVariableParameterSimObject(const DtVariableParameterSimObject &orig)
Definition: variableParameterBuilder.h:334
DtVariableParameterVector(const DtVariableParameterVector &orig)
Definition: variableParameterBuilder.h:137
void removeEntry(const DtSymbolString &keyword)
Removes the entry for the given keyword.
_Container value(const std::string &key) const
Definition: variableParameterBuilder.h:399
Definition: scriptVrfObject.h:30
void addEntry(const DtSymbolString &keyword, DtReaderWriter *const rw)
Adds an entry with a DtReaderWriter for the given keyword. An optional DtList of DtString* keyword al...
_Container * valuePointer(const std::string &key) const
Definition: variableParameterBuilder.h:411
DtVariableParameter(bool required=false)
Definition: variableParameterBuilder.h:57

Document ID: Generated on Thu Oct 23 22:29:17 EDT 2025 from SVN revision 280951
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)