DiaDes  0.1
DIAgnosisofDiscrete-EventSystem
Variable.hh
Go to the documentation of this file.
1 #ifndef __DIADES__ALTARICA__VARIABLE__HH
2 #define __DIADES__ALTARICA__VARIABLE__HH
3 
11 using namespace std;
12 
13 namespace Diades
14 {
15 
16  namespace Altarica
17  {
18  class FlatVariableIterator;
19 
20 
21 
27  class Variable
28  {
29  public:
30 
36  static string typeName() { return "Diades::Altarica::Variable"; }
38 
39  public:
47  typedef Variable * Pointer;
48 
55  typedef reference_wrapper<Variable> Reference;
56 
63  typedef reference_wrapper<Variable const> ConstReference;
64 
65 
72  typedef vector<Reference> VarVector;
73 
74 
81  typedef vector<Variable>::iterator VariableIterator;
82 
89  typedef vector<Variable>::const_iterator VariableConstIterator;
90 
97  typedef unordered_map<Identifier,VarVector::size_type> SubVarDictionary;
98 
99 
100  private:
101 
109 
110 
111 
118  mutable string _fullname;
119 
128  VarVector _scope;
129 
130 
137  vector<VariableDecl::ConstReference> _declaration;
138 
146  mutable vector<Variable> _subVariables;
147 
148 
149 
154  bool _isFree;
155 
156 
162  vector<Value::ConstReference> _current;
163 
164 
165 
171  mutable SubVarDictionary _varDictionary;
172 
173  protected:
174 
175 
183  Variable & initSubVariable(const Identifier & name) const;
184 
185 
193  Variable & initSubVariable(unsigned index) const;
194 
199  void instanciateVariable() const;
200 
201 
202  friend class FlatVariableIterator;
203 
204  public:
209  Variable():_name(),_scope(),_declaration(),_subVariables(),_isFree(true),_current(),_varDictionary(){}
210 
211 
217  virtual ~Variable(){ clear(); }
218 
219 
228  Variable & getVariableFromPath(const string & varPath);
229 
230 
231 
240  const Variable & getVariableFromPath(const string & varPath) const;
241 
242 
249  FlatIterator varBegin();
250 
257  FlatIterator varEnd();
258 
259 
268  virtual void init(const Identifier & name,
269  const VariableDecl & declaration,
270  Variable & scope);
271 
272 
279  virtual void clear();
280 
289  const Variable & scope() const
290  {
291  require(Exception,!isNull(),"scope: null variable.");
292  return _scope[0];
293  }
294 
295 
296 
297 
305  void assign(const Value & value);
306 
307 
308 
316  const Type & type() const
317  {
318  require(Exception,!isNull(),"type: null variable.");
319  return declaration().type();
320  }
321 
322 
323 
332  const VariableDecl & declaration() const
333  {
334  require(Exception,!isNull(),"declaration: null variable.");
335  return _declaration[0];
336  }
337 
338 
339 
340 
341 
342 
351  const Identifier & name() const
352  {
353  require(Exception,!isNull(),"name: null variable.");
354  return _name;
355  }
356 
357 
365  const string & fullname() const;
366 
367 
375  bool isNull() const
376  {
377  return _declaration.empty();
378  }
379 
387  bool isFree() const
388  {
389  return _isFree;
390  }
391 
392 
393 
399  void makeFree();
400 
401 
410  bool operator==(const Variable & variable) const
411  {
412  return this == &variable;
413  }
414 
415 
424  bool operator!=(const Variable & variable) const
425  {
426  return !( (*this)==variable);
427  }
428 
429 
430 
439  Variable & getVariable(const Identifier & name);
440 
449  const Variable & getVariable(const Identifier & name) const;
450 
459  Variable & getVariable(unsigned index);
460 
469  const Variable & getVariable(unsigned index) const;
470 
471 
472 
480  VariableIterator variableBegin();
488  VariableIterator variableEnd();
489 
490 
498  VariableConstIterator variableBegin() const;
506  VariableConstIterator variableEnd() const;
507 
508 
517  const Value & value() const;
518 
519 
520 
521  };
522 
523 
524 
525 
526 
528  {
529  public:
530 
531  typedef FlatVariableIterator self;
532  typedef ptrdiff_t difference_type;
533  typedef std::forward_iterator_tag iterator_category;
535  typedef Variable* pointer;
536  typedef Variable& reference;
537 
538  private:
539 
541  unsigned _index;
542  Variable::SubVarDictionary::const_iterator _fieldIt;
543  FlatVariableIterator * _iterator;
544 
545  public:
546 
547  FlatVariableIterator() : _owner(nullptr),_index(0),_iterator(0){}
548 
549  FlatVariableIterator(const FlatVariableIterator & it);
550 
551  FlatVariableIterator & operator=(const FlatVariableIterator & it);
552 
553 
554  explicit FlatVariableIterator( Variable & owner, unsigned index);
555  explicit FlatVariableIterator( Variable & owner, const Variable::SubVarDictionary::const_iterator & fieldIt);
556  ~FlatVariableIterator();
557  reference operator*() const;
558 
559  pointer operator->() const;
560 
561  self & operator++();
562 
563  self operator++(int);
564 
565  bool operator==(const self & it) const;
566 
567  bool operator !=(const self & it) const;
568 
569  };
570 
571 
572 
573 
574  };
575 
576 };
577 #endif
An Identifier is a reference to a string (IdentifierData) that only contains alpha-numeric characters...
Definition: Identifier.hh:121
vector< Reference > VarVector
Definition: Variable.hh:72
FlatVariableIterator * _iterator
Definition: Variable.hh:543
bool operator==(const Variable &variable) const
Definition: Variable.hh:410
STL namespace.
const Type & type() const
FlatVariableIterator FlatIterator
Definition: Variable.hh:40
reference_wrapper< Variable const > ConstReference
Definition: Variable.hh:63
vector< Value::ConstReference > _current
Definition: Variable.hh:162
#define require(Exception, expr, message)
Definition: Assertion.hh:89
Namespace of the Diades project.
const Identifier & name() const
Definition: Variable.hh:351
std::forward_iterator_tag iterator_category
Definition: Variable.hh:533
vector< Variable >::iterator VariableIterator
Definition: Variable.hh:81
Variable::SubVarDictionary::const_iterator _fieldIt
Definition: Variable.hh:542
const Variable & scope() const
Definition: Variable.hh:289
bool operator!=(const Variable &variable) const
Definition: Variable.hh:424
vector< Variable > _subVariables
Definition: Variable.hh:146
Utils::Exception< Variable > Exception
Definition: Variable.hh:35
const VariableDecl & declaration() const
Definition: Variable.hh:332
vector< VariableDecl::ConstReference > _declaration
Definition: Variable.hh:137
reference_wrapper< Variable > Reference
Definition: Variable.hh:55
SubVarDictionary _varDictionary
Definition: Variable.hh:171
static string typeName()
Definition: Variable.hh:36
unordered_map< Identifier, VarVector::size_type > SubVarDictionary
Definition: Variable.hh:97
const Type & type() const
Definition: Variable.hh:316
vector< Variable >::const_iterator VariableConstIterator
Definition: Variable.hh:89