00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef CFRONT_FIELD_INCLUSION_TYPE_HPP
00035 #define CFRONT_FIELD_INCLUSION_TYPE_HPP
00036
00037 #include <vector>
00038
00039 namespace cfront {
00040
00041 struct Field {
00042 Type* type;
00043 ConstantValue bitField;
00044 std::string name;
00045 Field(Type* t, ConstantValue bf, const std::string& n)
00046 : type(t), bitField(bf), name(n) {}
00047 Field(Type* t, const std::string& n)
00048 : type(t), bitField(ConstantUnspecified), name(n) {}
00049 };
00050
00051 typedef std::vector<Field> Fields;
00052
00056 class SUDefinition : public Type::Definition {
00057 public:
00058 explicit SUDefinition(const std::string& name)
00059 : isIncomplete_(true), env_(NULL), name_(name) {}
00060 virtual ~SUDefinition() {}
00061
00062 virtual size_t getSize(const TargetInfo& targetInfo) const = 0;
00063
00064 size_t getAlign(const TargetInfo& targetInfo) const
00065 {
00066 const Fields& fields = this->getFields();
00067 size_t maxAlign = 1;
00068 for (Fields::const_iterator i = fields.begin();
00069 i != fields.end(); ++i) {
00070 size_t align = i->type->getAlign(targetInfo);
00071 if (align > maxAlign) {
00072 maxAlign = align;
00073 }
00074 }
00075 return maxAlign;
00076 }
00077
00078 bool isIncomplete() const
00079 {
00080 return isIncomplete_;
00081 }
00082
00083 const Fields& getFields() const
00084 {
00085 return fields_;
00086 }
00087
00088 Environment* getEnv() const
00089 {
00090 return env_;
00091 }
00092
00093 const std::string& getName() const
00094 {
00095 return name_;
00096 }
00097
00098 void addField(Type* t, ConstantValue bf, const std::string& name)
00099 {
00100 fields_.push_back(Field(t, bf, name));
00101 }
00102
00103 void setIncomplete(bool b)
00104 {
00105 isIncomplete_ = b;
00106 }
00107
00108 void setEnv(Environment* env)
00109 {
00110 env_ = env;
00111 }
00112
00113 void setName(const std::string& name)
00114 {
00115 name_ = name;
00116 }
00117
00118 protected:
00119 Fields fields_;
00120 bool isIncomplete_;
00121
00122 Environment* env_;
00123
00124 std::string name_;
00125 };
00126
00127
00131 class FieldInclusionType : public Type {
00132 public:
00133 explicit FieldInclusionType(SUDefinition* def, QualFlags qf = 0)
00134 : qualFlags_(qf), definition_(def) {}
00135 FieldInclusionType(const FieldInclusionType& other)
00136 : Type(other), qualFlags_(other.qualFlags_),
00137 definition_(other.definition_) {}
00138 virtual ~FieldInclusionType() {}
00139
00140
00141
00142
00143
00144
00145 virtual bool isCompatibleType(const Type* other) const
00146 {
00147 const FieldInclusionType* fo =
00148 dynamic_cast<const FieldInclusionType*>(other);
00149 if (fo == NULL) return false;
00150 return this->definition_ == fo->getDefinition();
00151 }
00152
00153 virtual size_t getSize(const TargetInfo& targetInfo) const
00154 {
00155 return definition_->getSize(targetInfo);
00156 }
00157
00158 virtual size_t getAlign(const TargetInfo& targetInfo) const
00159 {
00160 return definition_->getAlign(targetInfo);
00161 }
00162
00163 QualFlags getQualFlags() const
00164 {
00165 return qualFlags_;
00166 }
00167
00168 SUDefinition* getDefinition() const
00169 {
00170 return definition_;
00171 }
00172
00173 void setQualFlags(QualFlags qf)
00174 {
00175 qualFlags_ = qf;
00176 }
00177
00178 protected:
00179 QualFlags qualFlags_;
00180
00181 SUDefinition* definition_;
00182
00183 };
00184
00185 }
00186
00187 #endif
00188
00189
00190
00191
00192
00193
00194
00195
00196