00001 #include "xi-AstNode.h"
00002 #include "xi-Chare.h"
00003 #include "xi-Template.h"
00004
00005 namespace xi {
00006
00007 TParamList::TParamList(TParam* t, TParamList* n) : tparam(t), next(n) {}
00008
00009 TParamType::TParamType(Type* t) : type(t) {}
00010 void TParamType::print(XStr& str) { type->print(str); }
00011 void TParamType::genSpec(XStr& str) { type->print(str); }
00012
00013 TParamVal::TParamVal(const char* v) : val(v) {}
00014 void TParamVal::print(XStr& str) { str << val; }
00015 void TParamVal::genSpec(XStr& str) { str << val; }
00016
00017 Scope::Scope(const char* name, ConstructList* contents)
00018 : name_(name), ConstructList(-1, NULL, contents) {}
00019
00020 void Scope::genDecls(XStr& str) {
00021 str << "namespace " << name_ << " {\n";
00022 AstChildren<Construct>::genDecls(str);
00023 str << "} // namespace " << name_ << "\n";
00024 }
00025
00026 void Scope::genDefs(XStr& str) {
00027 str << "namespace " << name_ << " {\n";
00028 AstChildren<Construct>::genDefs(str);
00029 str << "} // namespace " << name_ << "\n";
00030 }
00031
00032 void Scope::genReg(XStr& str) {
00033 str << "using namespace " << name_ << ";\n";
00034 AstChildren<Construct>::genReg(str);
00035 }
00036
00037 void Scope::genGlobalCode(XStr scope, XStr& decls, XStr& defs) {
00038 scope << name_ << "::";
00039 AstChildren<Construct>::genGlobalCode(scope, decls, defs);
00040 }
00041
00042 void Scope::print(XStr& str) {
00043 str << "namespace " << name_ << "{\n";
00044 AstChildren<Construct>::print(str);
00045 str << "} // namespace " << name_ << "\n";
00046 }
00047
00048 void Scope::outputClosuresDecl(XStr& str) {
00049 str << "namespace " << name_ << " {\n";
00050 AstChildren<Construct>::outputClosuresDecl(str);
00051 str << "} // namespace " << name_ << "\n";
00052 }
00053
00054 void Scope::outputClosuresDef(XStr& str) {
00055 str << "namespace " << name_ << " {\n";
00056 AstChildren<Construct>::outputClosuresDef(str);
00057 str << "} // namespace " << name_ << "\n";
00058 }
00059
00060 UsingScope::UsingScope(const char* name, bool symbol) : name_(name), symbol_(symbol) {}
00061 void UsingScope::genDecls(XStr& str) {
00062 str << "using ";
00063 if (!symbol_) str << "namespace ";
00064 str << name_ << ";\n";
00065 }
00066 void UsingScope::print(XStr& str) {
00067 str << "using ";
00068 if (!symbol_) str << "namespace ";
00069 str << name_ << ";\n";
00070 }
00071
00072 void TEntity::setTemplate(Template* t) { templat = t; }
00073 XStr TEntity::tspec(bool printDefault) const {
00074 XStr str;
00075 if (templat) templat->genSpec(str, printDefault);
00076 return str;
00077 }
00078 XStr TEntity::tvars(void) const {
00079 XStr str;
00080 if (templat) templat->genVars(str);
00081 return str;
00082 }
00083
00084 TType::TType(Type* t, Type* i) : type(t), init(i) {}
00085
00086 TTypeEllipsis::TTypeEllipsis(NamedEllipsisType* t, Type* i) : type(t), init(i) {}
00087
00088 TFunc::TFunc(FuncType* t, const char* v) : type(t), init(v) {}
00089 void TFunc::print(XStr& str) {
00090 type->print(str);
00091 if (init) str << "=" << init;
00092 }
00093 void TFunc::genLong(XStr& str, bool printDefault) {
00094 type->print(str);
00095 if (init && printDefault) str << "=" << init;
00096 }
00097 void TFunc::genShort(XStr& str) { str << type->getBaseName(); }
00098
00099 TName::TName(Type* t, const char* n, const char* v) : type(t), name(n), val(v) {}
00100
00101 TVarList::TVarList(TVar* v, TVarList* n) : tvar(v), next(n) {}
00102
00103 void Template::outputClosuresDecl(XStr& str) {
00104 Chare* c = dynamic_cast<Chare*>(entity);
00105 if (c) str << c->closuresDecl;
00106 }
00107
00108 void Template::outputClosuresDef(XStr& str) {
00109 Chare* c = dynamic_cast<Chare*>(entity);
00110 if (c) str << c->closuresDef;
00111 }
00112
00113 void Template::setExtern(int e) {
00114 Construct::setExtern(e);
00115 entity->setExtern(e);
00116 }
00117
00118 void Template::genVars(XStr& str) {
00119 str << " <";
00120 if (tspec) tspec->genShort(str);
00121 str << "> ";
00122 }
00123
00124 void Template::genSpec(XStr& str, bool printDefault) {
00125 str << generateTemplateSpec(tspec, printDefault);
00126 }
00127
00128 void Template::genDecls(XStr& str) {
00129 if (!external && entity) {
00130 entity->genDecls(str);
00131 }
00132 }
00133
00134 void Template::genDefs(XStr& str) {
00135 if (!external && entity) entity->genDefs(str);
00136 }
00137
00138 void Template::genGlobalCode(XStr scope, XStr& decls, XStr& defs) {
00139 if (!external && entity) entity->genGlobalCode(scope, decls, defs);
00140 }
00141
00142 int Template::genAccels_spe_c_funcBodies(XStr& str) {
00143 int rtn = 0;
00144 if (!external && entity) {
00145 rtn += entity->genAccels_spe_c_funcBodies(str);
00146 }
00147 return rtn;
00148 }
00149
00150 void Template::genAccels_spe_c_regFuncs(XStr& str) {
00151 if (!external && entity) {
00152 entity->genAccels_spe_c_regFuncs(str);
00153 }
00154 }
00155
00156 void Template::genAccels_spe_c_callInits(XStr& str) {
00157 if (!external && entity) {
00158 entity->genAccels_spe_c_callInits(str);
00159 }
00160 }
00161
00162 void Template::genAccels_spe_h_includes(XStr& str) {
00163 if (!external && entity) {
00164 entity->genAccels_spe_h_includes(str);
00165 }
00166 }
00167
00168 void Template::genAccels_spe_h_fiCountDefs(XStr& str) {
00169 if (!external && entity) {
00170 entity->genAccels_spe_h_fiCountDefs(str);
00171 }
00172 }
00173
00174 void Template::genAccels_ppe_c_regFuncs(XStr& str) {
00175 if (!external && entity) {
00176 entity->genAccels_ppe_c_regFuncs(str);
00177 }
00178 }
00179
00180 void Template::preprocess() {
00181 if (entity) entity->preprocess();
00182 }
00183
00184 void Template::check() {
00185 if (entity) entity->check();
00186 }
00187
00188 void TVarList::genLong(XStr& str, bool printDefault) {
00189 if (tvar) tvar->genLong(str, printDefault);
00190 if (next) {
00191 str << ", ";
00192 next->genLong(str, printDefault);
00193 }
00194 }
00195
00196 void TVarList::genShort(XStr& str) {
00197 if (tvar) tvar->genShort(str);
00198 if (next) {
00199 str << ", ";
00200 next->genShort(str);
00201 }
00202 }
00203
00204 void TType::genLong(XStr& str, bool printDefault) {
00205 str << "class ";
00206 if (type) type->print(str);
00207 if (init && printDefault) {
00208 str << "=";
00209 init->print(str);
00210 }
00211 }
00212
00213 void TType::genShort(XStr& str) {
00214 if (type) type->print(str);
00215 }
00216
00217 void TTypeEllipsis::genLong(XStr& str, bool printDefault) {
00218 str << "class... ";
00219 if (type) type->printWithoutEllipsis(str);
00220 if (init && printDefault) {
00221 str << "=";
00222 init->print(str);
00223 }
00224 }
00225
00226 void TTypeEllipsis::genShort(XStr& str) {
00227 if (type) type->print(str);
00228 }
00229
00230 void TName::genLong(XStr& str, bool printDefault) {
00231 if (type) type->print(str);
00232 str << " " << name;
00233 if (val && printDefault) {
00234 str << "=" << val;
00235 }
00236 }
00237
00238 void TName::genShort(XStr& str) { str << name; }
00239
00240 void TParamList::genSpec(XStr& str) {
00241 if (tparam) tparam->genSpec(str);
00242 if (next) {
00243 str << ", ";
00244 next->genSpec(str);
00245 }
00246 }
00247
00248 void TParamList::print(XStr& str) {
00249 if (tparam) tparam->print(str);
00250 if (next) {
00251 str << ",";
00252 next->print(str);
00253 }
00254 }
00255
00256 std::string TParamList::to_string() {
00257 XStr s;
00258 print(s);
00259 return s.get_string();
00260 }
00261
00262 void TType::print(XStr& str) {
00263 str << "class ";
00264 type->print(str);
00265 if (init) {
00266 str << "=";
00267 init->print(str);
00268 }
00269 }
00270
00271 void TTypeEllipsis::print(XStr& str) {
00272 str << "class... ";
00273 type->printWithoutEllipsis(str);
00274 if (init) {
00275 str << "=";
00276 init->print(str);
00277 }
00278 }
00279
00280 void TName::print(XStr& str) {
00281 type->print(str);
00282 str << " " << name;
00283 if (val) {
00284 str << "=";
00285 str << val;
00286 }
00287 }
00288
00289 void TVarList::print(XStr& str) {
00290 tvar->print(str);
00291 if (next) {
00292 str << ", ";
00293 next->print(str);
00294 }
00295 }
00296
00297 void Template::print(XStr& str) {
00298 if (entity) entity->print(str);
00299 }
00300
00301 }