Merge github.com:eclipse/titan.core
[deliverable/titan.core.git] / compiler2 / asn1 / Tag.hh
CommitLineData
d44e3c4f 1/******************************************************************************
2 * Copyright (c) 2000-2016 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Balasko, Jeno
10 * Forstner, Matyas
11 * Gecse, Roland
12 * Raduly, Csaba
13 * Szabo, Janos Zoltan – initial implementation
14 *
15 ******************************************************************************/
970ed795
EL
16#ifndef _Asn_Tag_HH
17#define _Asn_Tag_HH
18
19#include "../Int.hh"
20#include "AST_asn1.hh"
21#include "../Code.hh"
22
23namespace Asn {
24
25 using namespace Common;
26
27 /**
28 * Class to represent ASN tag.
29 */
30 class Tag : public Node, public Location {
31 public:
32 enum tagplicit_t {TAG_DEFPLICIT, TAG_EXPLICIT, TAG_IMPLICIT};
33 enum tagclass_t {
34 TAG_ERROR, TAG_NONE,
35 TAG_ALL,
36 TAG_UNIVERSAL,
37 TAG_APPLICATION,
38 TAG_CONTEXT,
39 TAG_PRIVATE
40 };
41 private:
42 tagplicit_t plicit;
43 tagclass_t tagclass;
44 Value *tagvalue;
45 Int tagval;
46 bool is_auto;
47
48 public:
49 Tag(tagplicit_t p_plicit, tagclass_t p_tagclass, Value *p_tagvalue);
50 Tag(tagplicit_t p_plicit, tagclass_t p_tagclass, Int p_tagval);
51 Tag(const Tag& p);
52 virtual ~Tag();
53 virtual Tag* clone() const
54 {return new Tag(*this);}
55 Tag& operator=(const Tag& p);
56 bool operator==(const Tag& p) const;
57 bool operator<(const Tag& p) const;
58 tagplicit_t get_plicit() const {return plicit;}
59 void set_plicit(tagplicit_t p_plicit) {plicit=p_plicit;}
60 tagclass_t get_tagclass() const {return tagclass;}
61 const char *get_tagclass_str() const;
62 void set_tagclass(tagclass_t p_tagclass) {tagclass=p_tagclass;}
63 bool is_automatic() const { return is_auto; }
64 void set_automatic() {is_auto = true;}
65 Int get_tagvalue();
66 void set_tagvalue(const Int& p_tagval);
67 void set_my_scope(Scope *p_scope);
68 void chk();
69 virtual void dump(unsigned level) const;
70 };
71
72 /**
73 * Class to represent a series of tags applied to a type. Index 0 is
74 * the innermost tag.
75 */
76 class Tags : public Node {
77 private:
78 Scope *my_scope;
79 /** tags */
80 vector<Tag> tags;
81
82 Tags(const Tags&);
83 public:
84 Tags();
85 virtual ~Tags();
86 virtual Tags* clone() const
87 {return new Tags(*this);}
88 virtual void set_fullname(const string& p_fullname);
89 void set_my_scope(Scope *p_scope);
90 void add_tag(Tag *p_tag);
91 size_t get_nof_tags() const
92 {return tags.size();}
93 Tag* get_tag_byIndex(const size_t p_i)
94 {return tags[p_i];}
95 void chk();
96 void set_plicit(Type *p_type);
97 void cut_auto_tags();
98 virtual void dump(unsigned level) const;
99 };
100
101 /**
102 * Class to represent a collection of tags. This can be used to
103 * check tag clashes, "monoton increment"-requirements of tags etc.
104 */
105 class TagCollection : public Node, public Location {
106 private:
107 map<Tag, void> tag_map;
108 const Tag *has_all;
109 bool is_extensible;
110
111 TagCollection(const TagCollection& p);
112 public:
113 TagCollection();
114 virtual ~TagCollection();
115 virtual TagCollection* clone() const
116 {return new TagCollection(*this);}
117 /** Adds the tag to the collection. p_tag is copied; the
118 * tagcollection does not become the owner of p_tag. */
119 void addTag(const Tag *p_tag);
120 bool hasTag(const Tag *p_tag) const;
121 /** Adds (copies) every tag of p_tags to this. */
122 void addTags(const TagCollection *p_tags);
123 bool hasTags(const TagCollection *p_tags) const;
124 /** Return true if all the tags of p_tags are greater than all the
125 * tags of this. */
126 bool greaterTags(const TagCollection *p_tags) const;
127 /** Returns the smallest or largest tag of the collection.
128 * Applicable only of the collection is not empty. */
129 const Tag *getSmallestTag() const;
130 const Tag *getGreatestTag() const;
131 bool isExtensible() const { return is_extensible; }
132 void setExtensible();
133 bool isEmpty() const;
134 /** Makes it empty. */
135 void clear();
136 };
137
138} // namespace Asn
139
140#endif // _Asn_Tag_HH
This page took 0.02935 seconds and 5 git commands to generate.