File: SimpleType.hh

package info (click to toggle)
eclipse-titan 8.2.0-1
  • links: PTS
  • area: main
  • in suites: bookworm, sid
  • size: 103,544 kB
  • sloc: cpp: 271,008; ansic: 33,683; yacc: 23,419; makefile: 15,483; lex: 9,204; java: 4,848; perl: 4,555; sh: 2,242; xml: 1,378; javascript: 85; awk: 48; php: 32; python: 13
file content (437 lines) | stat: -rw-r--r-- 11,032 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
/******************************************************************************
 * Copyright (c) 2000-2021 Ericsson Telecom AB
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
 *
 * Contributors:
 *   >
 *   Balasko, Jeno
 *   Beres, Szabolcs
 *   Godar, Marton
 *   Raduly, Csaba
 *   Szabo, Bence Janos
 *
 ******************************************************************************/
#ifndef SIMPLETYPE_H_
#define SIMPLETYPE_H_

#include "RootType.hh"

class SimpleType;
class Constant;

class LengthType {
  LengthType & operator=(const LengthType &); // not implemented
  // it's a bit strange that it has copy constructor but no assignment
public:
  SimpleType * parent; // no responsibility for this member
  bool modified;
  unsigned long long int facet_minLength;
  unsigned long long int facet_maxLength;
  unsigned long long int lower;
  unsigned long long int upper;

  LengthType(SimpleType * p_parent);
  // Default copy constructor and destructor are used
  
  void applyReference(const LengthType & other);
  void applyFacets();
  void printToFile(FILE * file) const;
};

class PatternType {
  PatternType & operator=(const PatternType &); // not implemented
  // it's a bit strange that it has copy constructor but no assignment
public:
  SimpleType * parent; // no responsibility for this member
  bool modified;
  Mstring facet;
  Mstring value;

  PatternType(SimpleType * p_parent);
  // Default copy constructor and destructor are used
  
  void applyReference(const PatternType & other);
  void applyFacet();
  void printToFile(FILE * file) const;
};

class EnumerationType {
  EnumerationType & operator=(const EnumerationType &); // not implemented
  // it's a bit strange that it has copy constructor but no assignment
public:
  SimpleType * parent; // no responsibility for this member
  bool modified;
  List<Mstring> facets;
  List<QualifiedName> items_string;
  List<int> items_int;
  List<double> items_float;
  List<QualifiedName> items_time;
  List<Mstring> items_misc;
  List<Mstring> variants;
  List<Mstring> converted_facets;

  EnumerationType(SimpleType * p_parent);
  // Default copy constructor and destructor are used
  
  void applyReference(const EnumerationType & other);
  void applyFacets();
  void sortFacets();
  void printToFile(FILE * file, unsigned int indent_level = 0) const;
  void insertVariants();
};

class WhitespaceType {
  WhitespaceType & operator=(const WhitespaceType &); // not implemented
  // it's a bit strange that it has copy constructor but no assignment
public:
  SimpleType * p_parent; // no responsibility for this member
  bool modified;
  Mstring facet;
  Mstring value;

  WhitespaceType(SimpleType * p_parent);
  // Default copy constructor and destructor are used

  void applyReference(const WhitespaceType & other);
  void applyFacet();
  void printToFile(FILE * file) const;
};

class ValueType {
  ValueType & operator=(const ValueType &); // not implemented
  // it's a bit strange that it has copy constructor but no assignment
public:
  SimpleType * parent; // no responsibility for this member
  bool modified;
  long double facet_minInclusive;
  long double facet_maxInclusive;
  long double facet_minExclusive;
  long double facet_maxExclusive;
  int facet_totalDigits;
  long double lower;
  long double upper;
  bool lowerExclusive;
  bool upperExclusive;
  bool not_a_number;
  Mstring fixed_value;
  Mstring default_value;
  List<Mstring> items_with_value;

  ValueType(SimpleType * p_parent);
  // Default copy constructor and destructor are used

  void applyReference(const ValueType & other);
  void applyFacets();
  void printToFile(FILE * file) const;
};

class ComplexType;

class ReferenceData {
public: // interface

  ReferenceData()
  : nst(0)
  , uri()
  , value()
  , resolved(false)
  , ref(NULL) {
  }

  void load(const Mstring& u, const Mstring& v, NamespaceType *n) {
    uri = u;
    value = v;
    nst = n;
  }

  const Mstring& get_uri() const {
    return uri;
  }

  const Mstring& get_val() const {
    return value;
  }

  RootType *get_ref() const {
    return ref;
  }

  bool empty() const {
    return uri.empty() && value.empty();
  }

  bool is_resolved() const {
    return resolved;
  }

  void set_resolved(RootType *st /*= NULL*/) {
    resolved = true;
    ref = st;
  }

  Mstring repr() const {
    return uri + Mstring("|") + value;
  }
private: // implementation
  NamespaceType *nst;
  Mstring uri;
  Mstring value;
  bool resolved;
  RootType *ref; // not owned
};

/**
 * Type that contains information coming from XSD simpleTypes, elements and attributes
 *
 * Source in XSD:
 *
 * 	* <simpleType>, <element> and <attribute> element whose parent element is <schema>
 *
 * Result in TTCN-3:
 *
 * 	* TTCN-3 type
 *
 */
class SimpleType : public RootType {
public:

  enum Mode {
    noMode,
    restrictionMode,
    extensionMode,
    listMode,
    restrictionAfterListMode
  };

protected:
  Mstring builtInBase;

  LengthType length;
  PatternType pattern;
  EnumerationType enumeration;
  WhitespaceType whitespace;
  ValueType value;

  FormValue element_form_as;
  FormValue attribute_form_as;

  Mode mode;

  ReferenceData outside_reference;

  /// true if name_dependency would be set (not empty)
  bool in_name_only;

  // True if element or attribute used with ref attribute
  bool fromRef;
  // XSD Type of the type
  TagName xsdtype;
  bool isOptional;
  Mstring substitutionGroup;
  //Pointer to the generated element substitution group
  ComplexType * subsGroup; // not owned
  //Pointer to the generated type substitution group
  ComplexType * typeSubsGroup; // not owned
  //To determine if already added to type substitution
  bool addedToTypeSubstitution;
  BlockValue block;
  
  //Special use: true if an element of a complexType is restricted to a list
  // in a simpleType, or a simpleType is a restriction of a list, which is a 
  // restriction of a simpleType
  bool inList;
  // We are inside a list if inList is true and mode == listMode
  
  // If this type is an alias then the alias field points to the original type
  SimpleType * alias; // not owned
  
  Constant * defaultForEmptyConstant; // not owned
  
  //Element substitution
  void addToSubstitutions();

  //Type substitution
  void addToTypeSubstitutions();
  //Returns the type substitution which the builtInType belongs
  ComplexType * findBuiltInTypeInStoredTypeSubstitutions(const Mstring& builtInType);

  //Only used when type substitution is enabled
  //If an element reference is found then it is put to a container
  //to know if type substitution is possible
  void collectElementTypes(SimpleType * found_ST = NULL, ComplexType * found_CT = NULL);
  void nameConversion_names();
  virtual void nameConversion_types(const List<NamespaceType> & ns);

  SimpleType & operator=(const SimpleType &); // not implemented
  // it's a bit strange that it has copy constructor but no assignment
public:
  SimpleType(XMLParser * a_parser, TTCN3Module * a_module, ConstructType a_construct);
  SimpleType(const SimpleType& other);
  // Default destructor is used

  // Parent of the element (both complexType, and AttributeType) has this
  // Not responsible for this member
  ComplexType * parent;
  
  SimpleType * nameDep; // not owned

  /** Virtual methods
   *  inherited from RootType
   */
  void loadWithValues();
  void printToFile(FILE * file);
  void referenceResolving();
  void nameConversion(const NameConversionMode mode, const List<NamespaceType> & ns);
  void finalModification();
  virtual void finalModification2();
  virtual bool hasUnresolvedReference();
  virtual void modifyList();
  void dump(const unsigned int depth) const;

  void applyDefaultAttribute(const Mstring& default_value);
  void applyFixedAttribute(const Mstring& fixed_value);
  void applyNillableAttribute(const bool nillable_value);
  void applyAbstractAttribute(const bool abstract_value);
  void applySubstitionGroupAttribute(const Mstring& substition_group);
  void applyBlockAttribute(const BlockValue block_);
  void applyRefAttribute(const Mstring& ref_value);

  const Mstring & getBuiltInBase() const {
    return builtInBase;
  }

  const LengthType & getLength() const {
    return length;
  }

  ValueType & getValue() {
    return value;
  }
  
  const ValueType & getValue() const {
    return value;
  }

  const PatternType & getPattern() const {
    return pattern;
  }

  const WhitespaceType & getWhitespace() const {
    return whitespace;
  }

  const EnumerationType & getEnumeration() const {
    return enumeration;
  }

  FormValue getElementFormAs() const {
    return element_form_as;
  }

  FormValue getAttributeFormAs() const {
    return attribute_form_as;
  }

  Mode getMode() const {
    return mode;
  }

  bool isFromRef() const {
    return fromRef;
  }

  const ReferenceData& getReference() const {
    return outside_reference;
  }
  
  ReferenceData& getReference() {
    return outside_reference;
  }
    
  EnumerationType & getEnumeration() {
    return enumeration;
  }

  void setBuiltInBase(const Mstring& base) {
    builtInBase = base;
  }

  void setMode(Mode m) {
    mode = m;
  }

  void setElementFormAs(FormValue f) {
    element_form_as = f;
  }

  void setAttributeFormAs(FormValue f) {
    attribute_form_as = f;
  }

  void setReference(const Mstring& ref, bool only_name_dependency = false);

  void referenceForST(SimpleType * found_ST);
  void referenceForCT(ComplexType * found_CT);

  void setXsdtype(TagName xsdtype_) {
    xsdtype = xsdtype_;
  }

  TagName getXsdtype() const {
    return xsdtype;
  }

  ComplexType * getSubstitution() const {
      return subsGroup;
  }

  ComplexType * getTypeSubstitution() const {
      return typeSubsGroup;
  }

  BlockValue getBlock() const {
      return block;
  }
  
  void setList(const bool list) {
      inList = list;
  }
  
  void addToNameDepList(RootType * t) {
      //If the type has a substitution, we add the namedep to the substitution
      if(subsGroup != NULL && this != (SimpleType*)subsGroup){
          SimpleType * substitution = (SimpleType*)subsGroup;
          substitution->addToNameDepList(t);
      }else if(typeSubsGroup != NULL && this != (SimpleType*)typeSubsGroup){
          SimpleType * substitution = (SimpleType*)typeSubsGroup;
          substitution->addToNameDepList(t);
      }else {
          nameDepList.push_back(t);
      }
  }
  
  SimpleType * getAlias() const {
      return alias;
  }
  
  Constant * getConstantDefaultForEmpty() const {
    return defaultForEmptyConstant;
  }
  
  // Returns true if the type really restricts or extends the type not
  // just aliases it.
  bool hasRestrictionOrExtension() const;
  
  ComplexType* getMainType();
  
  virtual Mstring getPath() {
    return Mstring("");
  }

};

#endif /* SIMPLETYPE_H_ */