DiaDes  0.1
DIAgnosisofDiscrete-EventSystem
Domains.hh
Go to the documentation of this file.
1 #ifndef __DIADES__ALTARICA__DOMAINS__HH
2 #define __DIADES__ALTARICA__DOMAINS__HH
3 
4 #include<iostream>
5 #include<map>
6 #include"Type.hh"
7 #include"Value.hh"
8 
9 namespace Diades
10 {
11  namespace Altarica
12  {
13 
14  class RangeDomain;
15  class EnumerationDomain;
16  class BooleanDomain;
17  class IntegerDomain;
18  class StructureDomain;
19  class ArrayDomain;
20  class NodeDecl;
21 
26  {
27 
28  public:
29  typedef DomainIterator self;
30  typedef ptrdiff_t difference_type;
31  typedef std::forward_iterator_tag iterator_category;
32  typedef Value value_type;
33  typedef const Value* pointer;
34  typedef const Value& reference;
35  static self nullIterator;
36  private:
38  DomainType _type;
39  union
40  {
47  } _domainData;
48  vector<Value::ConstReference> _current; // tricky I know but so useful
49  ValueEnumeration::const_iterator _itSet;
50  union
51  {
52  vector<DomainIterator> * _array;
53  map<Identifier, DomainIterator> * _structure;
54  } _dataIt;
55  union
56  {
57  vector<DomainIterator> * _array;
58  map<Identifier, DomainIterator> * _structure;
59  } _endIt;
60  union
61  {
62  vector<DomainIterator> * _array;
63  map<Identifier, DomainIterator> * _structure;
64  } _beginIt;
65  int _index;
66 
67  void goNext();
68  void updateCurrentArray();
70  void copy(const DomainIterator & it);
71 
72  public:
73 
74  DomainIterator():_type(NotADomain), _current(), _itSet(), _index(0){}
75 
76 
77  DomainIterator(const RangeDomain & range, const Value & value):_type(Range),_current(),_itSet(),_index(0)
78  {
79  _current.push_back(value);
80  _domainData._range = &range;
81  }
82 
83  DomainIterator(const EnumerationDomain & enumeration,
84  const ValueEnumeration::const_iterator & itSet):_type(Enumeration),
85  _current(), _itSet(itSet),_index(0)
86  {
87  _domainData._enumeration = &enumeration;
88  }
89 
90  DomainIterator(const BooleanDomain & booleans, int index): _type(Booleans),
91  _current(),
92  _itSet(),_index(index)
93  {
94  _domainData._booleans = &booleans;
95  }
96 
97  DomainIterator(const IntegerDomain & integers, int index): _type(Integers),
98  _current(),_itSet(),_index(index)
99  {
100  _domainData._integers = &integers;
101  }
102 
103 
104  DomainIterator(const StructureDomain & structure,
105  const map<Identifier, DomainIterator> & dataIt,
106  const map<Identifier, DomainIterator> & beginIt,
107  const map<Identifier, DomainIterator> & endIt);
108 
109 
110  DomainIterator(const ArrayDomain & array,
111  const vector<DomainIterator> & vectIt,
112  const vector<DomainIterator> & beginIt,
113  const vector<DomainIterator> & endIt);
114 
115 
116  DomainIterator(const DomainIterator & it):_type(NotADomain) { copy(it); }
117 
118 
119  ~DomainIterator();
120  void clear();
121 
122  DomainIterator & operator=(const DomainIterator & it)
123  {
124  if(this != &it)
125  {
126  copy(it);
127  }
128  return *this;
129  }
130 
131 
132  reference operator*() const;
133  pointer operator->() const;
134  self & operator++()
135  {
136  goNext();
137  return *this;
138  }
139  self operator++(int)
140  {
141  self tmp = *this;
142  goNext();
143  return tmp;
144  }
145  bool operator==(const self & it) const;
146  bool operator!=(const self & it) const
147  {
148  return !(*this == it);
149  }
150  };
151 
152 
153 
154 
155 
156 
157 
158 
159 
160 
161 
162 
163 
164 
165  class DomainFactory;
166 
172  class Domain
173  {
174  public:
178  typedef reference_wrapper<Domain> Reference;
182  typedef reference_wrapper<Domain const> ConstReference;
186  typedef Domain * Pointer;
190  typedef const Domain * ConstPointer;
198  typedef enum {InvalidDomain, Simple, Arrayed, Structured} Category;
199 
200 
213 
214 
218  typedef map<Identifier,ConstReference> StructureFields;
219 
224 
225  protected:
234 
235  protected:
239  unsigned _id;
247  Category _category;
251  mutable set<Identifier> _otherNames;
252 
253 
257  void setId(unsigned id)
258  {
259  _id = id;
260  }
261 
262 
263  protected:
264 
268  Domain(const Identifier & name,DomainFactory & factory);
269 
270 
271  friend class DomainFactory;
272 
273  public:
277  unsigned id() const
278  {
279  return _id;
280  }
281 
282 
286  virtual string printDomain() const = 0;
287 
288 
289  protected:
293  void setName(const Identifier & name)
294  {
295  _name = name;
296  }
297 
298 
302  void setOtherName(const Identifier & name) const
303  {
304  _otherNames.insert(name);
305  }
306 
307  public:
311  const Identifier & name() const
312  {
313  return _name;
314  }
315 
319  set<Identifier>::const_iterator otherNameBegin() const
320  {
321  return _otherNames.begin();
322  }
323 
327  set<Identifier>::const_iterator otherNameEnd() const
328  {
329  return _otherNames.end();
330  }
331 
335  virtual ~Domain() {}
336 
341  virtual bool isFinite() const = 0;
345  virtual unsigned cardinality() const = 0;
350  virtual bool contains(const Value & value) const = 0;
355  virtual DomainIterator begin() const = 0;
360  virtual DomainIterator end() const = 0;
361 
366  virtual DomainIterator find(const Value & value) const = 0;
367 
371  virtual DomainType domainType() const = 0;
372 
376  Category category() const { return _category; }
377 
381  virtual const Value & defaultValue() const = 0;
382 
386  const Type & type() const { return _type; }
387 
388 
392  const AltaricaModel & owner() const;
393 
397  AltaricaModel & owner();
398 
402  bool operator<(const Domain & domain) const;
403 
407  bool operator==(const Domain & domain) const
408  {
409  return this == &domain;
410  }
414  bool operator!=(const Domain & domain) const
415  {
416  return !(*this == domain);
417  }
418 
419 
426  bool isNull() const;
427  };
428 
429 
430  /****************************************************************************/
431 
432  class RangeDomain: public Domain
433  {
434  private:
437 
438 
439  RangeDomain(const Identifier & name,
440  const Value & min,
441  const Value & max,
442  unsigned id,
443  DomainFactory & factory);
444 
445  friend class DomainFactory;
446 
447  public:
448  virtual ~RangeDomain() {}
449  virtual bool isFinite() const { return true; }
450  virtual unsigned cardinality() const { return _max.get().integer() - _min.get().integer() + 1; }
451  virtual bool contains(const Value & value) const { return (_min.get()<=value) && (value<=_max.get()); }
452  virtual DomainType domainType() const { return Range; }
453  virtual DomainIterator begin() const
454  {
455  return DomainIterator(*this,_min);
456  }
457  virtual DomainIterator end() const;
458 
459 
464  virtual DomainIterator find(const Value & value) const
465  {
466  if(value.type().isInteger() && (value <= _max.get()) && (value >= _min.get()))
467  {
468  return DomainIterator(*this,value);
469  }
470  return end();
471  }
472 
473 
474 
478  virtual string printDomain() const;
479 
480 
484  bool operator<(const RangeDomain & domain) const
485  {
486  bool result = cardinality() < domain.cardinality();
487  if(!result && (cardinality() == domain.cardinality()))
488  {
489  result = _min.get() < domain._min.get();
490  }
491  if(!result && (_min.get() == domain._min.get()))
492  {
493  result = name() < domain.name();
494  }
495  return result;
496  }
497 
501  const Value & defaultValue() const { return _min; }
502 
503  const Value & min() const { return _min; }
504  const Value & max() const { return _max; }
505 
506 
507  };
508 
509 
510  /****************************************************************************/
511 
512 
513 
514 
515  class EnumerationDomain: public Domain
516  {
517  private:
519 
520  public:
521  EnumerationDomain(const Identifier & name,
522  const ValueEnumeration & valueSet,
523  unsigned id,
524  DomainFactory & factory);
525  virtual ~EnumerationDomain() {}
526  virtual bool isFinite() const { return true; }
527  virtual unsigned cardinality() const {
528  return _symbolSet.size(); }
529  virtual bool contains(const Value & value) const;
530  virtual DomainType domainType() const { return Enumeration; }
531  virtual DomainIterator begin() const
532  {
533  return DomainIterator(*this,_symbolSet.begin());
534  }
535  virtual DomainIterator end() const
536  {
537  return DomainIterator(*this,_symbolSet.end());
538  }
546  virtual DomainIterator find(const Value & value) const;
550  virtual string printDomain() const;
554  const Value & defaultValue() const { return _symbolSet[0]; }
555  friend class DomainFactory;
556  };
557 
558  /****************************************************************************/
559 
560 
561  class BooleanDomain: public Domain
562  {
563  private:
566  public:
567  BooleanDomain(DomainFactory & factory);
568  virtual ~BooleanDomain() {}
569  virtual bool isFinite() const { return true; }
570  virtual unsigned cardinality() const { return 2; }
571  virtual DomainType domainType() const { return Booleans; }
572  virtual bool contains(const Value & value) const;
573  virtual DomainIterator begin() const
574  {
575  return DomainIterator(*this,0);
576  }
577  virtual DomainIterator end() const
578  {
579  return DomainIterator(*this,2);
580  }
585  virtual DomainIterator find(const Value & value) const
586  {
587  if(value.type().isBoolean())
588  {
589  if(value.boolean())
590  {
591  return DomainIterator(*this,1);
592  }
593  else
594  {
595  return DomainIterator(*this,0);
596  }
597  }
598  return end();
599  }
603  virtual string printDomain() const;
607  const Value & defaultValue() const { return _isFalse; }
608 
609  friend class DomainIterator;
610  };
611 
612 
613  /****************************************************************************/
614 
619  class IntegerDomain: public Domain
620  {
621  public:
622  IntegerDomain(DomainFactory & factory);
623  virtual ~IntegerDomain() {}
624  bool isFinite() const { return false; }
625  virtual unsigned cardinality() const { return numeric_limits<unsigned>::infinity(); }
626  bool contains(const Value & value) const;
627  virtual DomainType domainType() const { return Integers; }
628 
636  {
637  return DomainIterator(*this,-numeric_limits<int>::infinity());
638  }
639 
644  {
645  return DomainIterator(*this,numeric_limits<int>::infinity());
646  }
651  virtual DomainIterator find(const Value & value) const
652  {
653  if(value.type().isInteger())
654  {
655  return DomainIterator(*this,value.integer());
656  }
657  return end();
658  }
659 
666  const Value & defaultValue() const;
667 
668  virtual string printDomain() const;
669  };
670 
671 
672 
673  /****************************************************************************/
674 
675 
676 
677  class StructureDomain: public Domain
678  {
679  private:
681  map<Identifier, DomainIterator> _begin;
682  map<Identifier, DomainIterator> _end;
683  void generateStructuredBeginAndEnd(map<Identifier, DomainIterator> & begin,
684  map<Identifier, DomainIterator> & end);
685 
686  public:
687  typedef StructureFields::const_iterator StructureFieldIterator;
688 
689 
690  StructureFieldIterator fieldBegin() const
691  {
692  return _structure.begin();
693  }
694  StructureFieldIterator fieldEnd() const
695  {
696  return _structure.end();
697  }
698 
699 
700 
701 
703  const StructureFields & structure,
704  unsigned id,
705  DomainFactory & factory):Domain(name,factory),
706  _structure(structure),_begin(),_end()
707  {
708  _id = id;
709  generateStructuredBeginAndEnd(_begin,_end);
710  _category = Structured;
711 
712  }
713  virtual ~StructureDomain() {}
714  virtual bool isFinite() const;
715  virtual unsigned cardinality() const;
716  virtual bool contains(const Value & value) const;
717  virtual DomainType domainType() const { return Structure; }
718  virtual DomainIterator begin() const
719  {
720  return DomainIterator(*this,_begin,_begin,_end);
721  }
722  virtual DomainIterator end() const
723  {
724  return DomainIterator(*this,_end,_begin,_end);
725  }
730  virtual DomainIterator find(const Value & value) const;
731 
735  virtual string printDomain() const;
739  const Value & defaultValue() const;
740  friend class VariableDeclFactory;
741  friend class DomainFactory;
742  };
743 
744 
745 
746  /****************************************************************************/
747 
748  class ArrayDomain: public Domain
749  {
750  private:
751  vector<Domain::ConstReference> _array;
752  vector<DomainIterator> _begin;
753  vector<DomainIterator> _end;
754 
755 
756  public:
757  ArrayDomain(const Identifier & name, const Domain & domain, unsigned size,unsigned id,DomainFactory & factory);
758  virtual ~ArrayDomain() {}
759  virtual bool isFinite() const;
760  virtual unsigned cardinality() const;
761  virtual bool contains(const Value & value) const;
762  virtual DomainType domainType() const { return Array; }
763  virtual DomainIterator begin() const
764  {
765  return DomainIterator(*this,_begin,_begin,_end);
766  }
767  virtual DomainIterator end() const
768  {
769  return DomainIterator(*this,_end,_begin,_end);
770  }
771  unsigned arraySize() const { return _array.size(); }
772  const Domain & itemDomain() const { return _array[0]; }
777  virtual DomainIterator find(const Value & value) const;
778 
782  virtual string printDomain() const;
786  const Value & defaultValue() const;
790  bool operator<(const ArrayDomain & domain) const
791  {
792  bool result = _array.size() < domain._array.size();
793  if(!result && (_array.size() == domain._array.size()))
794  {
795  if( _array.size() > 0)
796  {
797  result = (_array[0].get()) < (domain._array[0].get());
798  if(!result && ( (_array[0].get()) == (domain._array[0].get())))
799  {
800  result = name() < domain.name();
801  }
802  }
803  }
804  return result;
805  }
806 
807  friend class VariableDeclFactory;
808  friend class DomainFactory;
809  };
810 
811 
812  /****************************************************************************/
813 
814 
815  class NullDomain: public Domain
816  {
817 
818  public:
819  NullDomain(DomainFactory & factory):Domain("__diades__altarica__null__domain",factory){}
820  virtual ~NullDomain() {}
821  virtual bool isFinite() const { return true; }
822  virtual unsigned cardinality() const { return 0; }
823  virtual bool contains(const Value & value) const { return false; }
824  virtual DomainType domainType() const { return NotADomain; }
825  virtual DomainIterator begin() const
826  {
827  return DomainIterator();
828  }
829  virtual DomainIterator end() const
830  {
831  return DomainIterator();
832  }
837  virtual DomainIterator find(const Value & value) const { return end(); }
838 
842  virtual string printDomain() const { return name().str(); }
846  const Value & defaultValue() const;
850  bool operator<(const Domain & domain) const
851  {
852  return !domain.isNull();
853  }
854 
855  friend class DomainFactory;
856  };
857 
858 
859 
860 
861 
862 
863 
869  {
870  public:
876  static string typeName() { return "Altarica::DomainFactory"; }
878 
879  private:
881  vector< map<Identifier,Domain::ConstPointer> > _nodeDeclDomains;
882  vector< map<Identifier,bool> > _referenceDomains;
883  vector< Domain::Pointer > _basicDomains; // _booleans in 0 and _integers in 1
884 
885  public:
886 
890  DomainFactory(AltaricaModel & model);
891 
892 
893  void init();
894 
895 
896  void clear();
897 
901  ~DomainFactory();
902 
903 
904  const Domain & nullDomain() const { return *_basicDomains[0]; }
905 
909  const Domain & getBooleans() const { return *_basicDomains[1]; }
910 
914  const Domain & getIntegers() const { return *_basicDomains[2]; }
915 
916 
922  const Domain & newDomain(const NodeDecl & nodeDecl);
923 
924 
925 
926 
934  const Domain & newDomain(const Identifier & name, const Domain & associatedDomain, NodeDecl & nodeDecl);
935 
936 
937 
946  const Domain & newDomain(const Identifier & name, const Value & min, const Value & max, NodeDecl & nodeDecl);
947 
948 
949 
957  const Domain & newDomain(const Identifier & name, const ValueEnumeration & enumeration, NodeDecl & nodeDecl);
958 
959 
967  const Domain & newDomain(const Identifier & name, const Domain::StructureFields & structure, NodeDecl & nodeDecl);
968 
969 
978  const Domain & newDomain(const Identifier & name, const Domain & domain, unsigned size, NodeDecl & nodeDecl);
979 
980 
981 
988  const AltaricaModel & owner() const;
995  AltaricaModel & owner();
996  };
997 
998 
999 
1000  };
1001 };
1002 
1003 
1004 #endif
bool operator<(const Domain &domain) const
Definition: Domains.hh:850
StructureFieldIterator fieldBegin() const
Definition: Domains.hh:690
const Domain & getIntegers() const
Definition: Domains.hh:914
virtual DomainType domainType() const
Definition: Domains.hh:627
StructureFields::const_iterator StructureFieldIterator
Definition: Domains.hh:687
const Domain & nullDomain() const
Definition: Domains.hh:904
union Diades::Altarica::DomainIterator::@1 _dataIt
void setOtherName(const Identifier &name) const
Definition: Domains.hh:302
const IntegerDomain * _integers
Definition: Domains.hh:44
An Identifier is a reference to a string (IdentifierData) that only contains alpha-numeric characters...
Definition: Identifier.hh:121
set< Identifier >::const_iterator otherNameBegin() const
Definition: Domains.hh:319
union Diades::Altarica::DomainIterator::@2 _endIt
void setId(unsigned id)
Definition: Domains.hh:257
bool operator==(const Domain &domain) const
Definition: Domains.hh:407
void setName(const Identifier &name)
Definition: Domains.hh:293
vector< Domain::ConstReference > _array
Definition: Domains.hh:751
ValueEnumeration::const_iterator _itSet
Definition: Domains.hh:49
virtual bool isFinite() const
Definition: Domains.hh:569
DomainIterator end() const
Definition: Domains.hh:643
DomainFactory & _factory
Definition: Domains.hh:229
virtual bool isFinite() const
Definition: Domains.hh:526
vector< DomainIterator > _begin
Definition: Domains.hh:752
vector< DomainIterator > _end
Definition: Domains.hh:753
bool operator!=(const Domain &domain) const
Definition: Domains.hh:414
map< Identifier, ConstReference > StructureFields
Definition: Domains.hh:218
virtual DomainIterator begin() const
Definition: Domains.hh:825
Value::ConstReference _min
Definition: Domains.hh:435
virtual DomainType domainType() const
Definition: Domains.hh:762
const Value & defaultValue() const
Definition: Domains.hh:607
set< Identifier > _otherNames
Definition: Domains.hh:251
const EnumerationDomain * _enumeration
Definition: Domains.hh:42
vector< Value::ConstReference > _current
Definition: Domains.hh:48
virtual DomainIterator begin() const
Definition: Domains.hh:573
virtual DomainIterator end() const
Definition: Domains.hh:829
unsigned id() const
Definition: Domains.hh:277
std::forward_iterator_tag iterator_category
Definition: Domains.hh:31
bool isBoolean() const
Definition: Type.hh:162
Category category() const
Definition: Domains.hh:376
Value::ConstReference _isTrue
Definition: Domains.hh:564
Utils::Exception< DomainFactory > Exception
Definition: Domains.hh:875
virtual DomainIterator find(const Value &value) const
Definition: Domains.hh:651
union Diades::Altarica::DomainIterator::@0 _domainData
DomainIterator(const IntegerDomain &integers, int index)
Definition: Domains.hh:97
reference_wrapper< Type const > ConstReference
Definition: Type.hh:62
virtual DomainType domainType() const
Definition: Domains.hh:571
NullDomain(DomainFactory &factory)
Definition: Domains.hh:819
set< Identifier >::const_iterator otherNameEnd() const
Definition: Domains.hh:327
reference_wrapper< Value const > ConstReference
Definition: Value.hh:59
Type::ConstReference _type
Definition: Domains.hh:243
DomainIterator(const BooleanDomain &booleans, int index)
Definition: Domains.hh:90
DomainIterator(const RangeDomain &range, const Value &value)
Definition: Domains.hh:77
const Value & defaultValue() const
Definition: Domains.hh:501
vector< DomainIterator > * _array
Definition: Domains.hh:52
virtual DomainIterator end() const
Definition: Domains.hh:722
virtual DomainIterator find(const Value &value) const
Definition: Domains.hh:464
DomainIterator Iterator
Definition: Domains.hh:223
virtual string printDomain() const
Definition: Domains.hh:842
bool operator==(const self &it) const
const BooleanDomain * _booleans
Definition: Domains.hh:43
const StructureDomain * _structure
Definition: Domains.hh:45
virtual DomainIterator end() const
Definition: Domains.hh:577
virtual DomainIterator begin() const
Definition: Domains.hh:453
virtual unsigned cardinality() const
Definition: Domains.hh:527
map< Identifier, DomainIterator > * _structure
Definition: Domains.hh:53
const ArrayDomain * _array
Definition: Domains.hh:46
Namespace of the Diades project.
const Identifier & name() const
Definition: Domains.hh:311
vector< Domain::Pointer > _basicDomains
Definition: Domains.hh:883
virtual bool isFinite() const
Definition: Domains.hh:449
vector< map< Identifier, Domain::ConstPointer > > _nodeDeclDomains
Definition: Domains.hh:881
DomainIterator(const EnumerationDomain &enumeration, const ValueEnumeration::const_iterator &itSet)
Definition: Domains.hh:83
virtual DomainIterator end() const
Definition: Domains.hh:767
virtual DomainIterator find(const Value &value) const
Definition: Domains.hh:837
virtual DomainIterator begin() const
Definition: Domains.hh:531
StructureDomain(const Identifier &name, const StructureFields &structure, unsigned id, DomainFactory &factory)
Definition: Domains.hh:702
bool boolean() const
Definition: Value.hh:121
bool isInteger() const
Definition: Type.hh:152
reference_wrapper< Domain const > ConstReference
Definition: Domains.hh:182
bool operator!=(const self &it) const
Definition: Domains.hh:146
vector< Value::ConstReference > ValueEnumeration
enumeration of Value elements (unicity and sorting is in charge of the user)
Definition: Value.hh:244
DomainIterator begin() const
Definition: Domains.hh:635
virtual DomainType domainType() const
Definition: Domains.hh:824
virtual bool isFinite() const
Definition: Domains.hh:821
virtual DomainIterator begin() const
Definition: Domains.hh:763
map< Identifier, DomainIterator > _end
Definition: Domains.hh:682
const Value & max() const
Definition: Domains.hh:504
virtual DomainType domainType() const
Definition: Domains.hh:530
virtual unsigned cardinality() const
Definition: Domains.hh:450
const Domain & getBooleans() const
Definition: Domains.hh:909
virtual DomainType domainType() const
Definition: Domains.hh:717
const Value & min() const
Definition: Domains.hh:503
int integer() const
Definition: Value.hh:111
reference_wrapper< Domain > Reference
Definition: Domains.hh:178
Value::ConstReference _max
Definition: Domains.hh:436
virtual bool contains(const Value &value) const
Definition: Domains.hh:823
virtual DomainIterator end() const
Definition: Domains.hh:535
void copy(const DomainIterator &it)
DomainIterator & operator=(const DomainIterator &it)
Definition: Domains.hh:122
virtual unsigned cardinality() const
Definition: Domains.hh:625
union Diades::Altarica::DomainIterator::@3 _beginIt
unsigned arraySize() const
Definition: Domains.hh:771
bool operator<(const RangeDomain &domain) const
Definition: Domains.hh:484
bool operator<(const ArrayDomain &domain) const
Definition: Domains.hh:790
const RangeDomain * _range
Definition: Domains.hh:41
virtual DomainType domainType() const
Definition: Domains.hh:452
virtual bool contains(const Value &value) const
Definition: Domains.hh:451
const Domain * ConstPointer
Definition: Domains.hh:190
virtual unsigned cardinality() const
Definition: Domains.hh:570
map< Identifier, DomainIterator > _begin
Definition: Domains.hh:681
const Domain & itemDomain() const
Definition: Domains.hh:772
const Type & type() const
Definition: Domains.hh:386
StructureFieldIterator fieldEnd() const
Definition: Domains.hh:694
vector< map< Identifier, bool > > _referenceDomains
Definition: Domains.hh:882
DomainIterator(const DomainIterator &it)
Definition: Domains.hh:116
virtual DomainIterator find(const Value &value) const
Definition: Domains.hh:585
Value::ConstReference _isFalse
Definition: Domains.hh:565
virtual DomainIterator begin() const
Definition: Domains.hh:718
const Value & defaultValue() const
Definition: Domains.hh:554
virtual unsigned cardinality() const
Definition: Domains.hh:822
const Type & type() const
Definition: Value.hh:163