00001 #include "stdafx.h"
00002 #include "MakeVisitor.h"
00003 #include "Dumper.h"
00004
00005 #include "algorithm"
00006
00007 #include "globals.h"
00008 extern Globals global_vars;
00009
00010 ClassAndNamespace ClassAndNamespace::makeIt( Any *ptr)
00011 {
00012 return ClassAndNamespace( ptr->getValidName(), ptr->getValidNmspc(), ptr->getStrictNmspc());
00013 }
00014
00015 ClassAndNamespace::ClassAndNamespace( const std::string& pName, const std::string& pSpace, const std::string& pStrictSpace)
00016 : m_name( pName)
00017 , m_space( pSpace)
00018 , m_strictSpace( pStrictSpace)
00019 {
00020 }
00021
00022 std::string ClassAndNamespace::name() const
00023 {
00024 return m_name;
00025 }
00026
00027 std::string ClassAndNamespace::space() const
00028 {
00029 return m_space;
00030 }
00031
00032 std::string ClassAndNamespace::strictSpace() const
00033 {
00034 return m_strictSpace;
00035 }
00036
00037
00038
00039 std::string ClassAndNamespace::infoName() const
00040 {
00041 if( Dumper::m_iVisitSign == 1)
00042 return m_name;
00043 else
00044 return m_strictSpace + m_name;
00045 }
00046
00047 std::string ClassAndNamespace::exactType() const
00048 {
00049 return m_space + Any::NamespaceDelimiter_str + m_name;
00050 }
00051
00052 void MakeVisitor::addEntity( Any::KIND_TYPE kind, const ClassAndNamespace& ent)
00053 {
00054 m_entities[kind].push_back( ent);
00055 }
00056
00057 std::string MakeVisitor::dumpVisitorHeader()
00058 {
00059 std::string short_form_header_file;
00060 std::string::size_type pos = global_vars.header_file_name.rfind( '\\');
00061 if ( pos != std::string::npos)
00062 {
00063 if ( pos + 1 < global_vars.header_file_name.length())
00064 short_form_header_file = global_vars.header_file_name.substr( pos + 1);
00065 else
00066 short_form_header_file = "insert_your_specialized_header_filename_here.h";
00067 }
00068 else
00069 short_form_header_file = global_vars.header_file_name;
00070
00071 std::string capitalized_name = m_className;
00072 std::transform( capitalized_name.begin(), capitalized_name.end(), capitalized_name.begin(), toupper);
00073
00074 std::string mmm;
00075 mmm += "#ifndef " + capitalized_name + "_H\n";
00076 mmm += "#define " + capitalized_name + "_H\n";
00077 mmm += "\n";
00078 mmm += "#include \"BON.h\"\n";
00079 mmm += "#include \"BONImpl.h\"\n";
00080 mmm += "#include \"Extensions.h\"\n";
00081 mmm += "#include \"" + short_form_header_file + "\"\n";
00082 mmm += "\n";
00083 mmm += "namespace " + global_vars.m_namespace_name +"\n";
00084 mmm += "{\n";
00085 mmm += "\n";
00086
00087 mmm += "class " + m_className + "\n";
00088 mmm += " : public BON::Visitor\n";
00089 mmm += "{\n";
00090
00091
00092
00093 mmm += " public : \n";
00094 mmm += " " + m_className + "();\n";
00095 mmm += " virtual ~" + m_className + "();\n\n";
00096 if( Dumper::m_bGenAcceptSpeci)
00097 {
00098
00099
00100 mmm += " public :\n";
00101
00102 for( unsigned int j = 0; j < HOW_MANY_ITEMS; ++j)
00103 for( unsigned int i = 0; i != m_entities[j].size(); ++i)
00104 {
00105 ClassAndNamespace& ent = m_entities[j][i];
00106 mmm += " virtual bool visit" + ent.infoName() + "( const " + ent.exactType() + "& object );\n";
00107 }
00108 mmm += "};\n";
00109 }
00110 else
00111 {
00112 mmm += " public :\n";
00113
00114 mmm += " void visitObjectImpl( const BON::Object& object );\n";
00115 if ( !m_entities[Any::FCO_REP].empty())
00116 mmm += " void visitFCOImpl( const BON::FCO& fco );\n";
00117 if ( !m_entities[Any::ATOM].empty())
00118 mmm += " void visitAtomImpl( const BON::Atom& atom );\n";
00119 if ( !m_entities[Any::SET].empty())
00120 mmm += " void visitSetImpl( const BON::Set& set);\n";
00121 if ( !m_entities[Any::REF].empty())
00122 mmm += " void visitReferenceImpl( const BON::Reference& ref );\n";
00123 if ( !m_entities[Any::CONN].empty())
00124 mmm += " void visitConnectionImpl( const BON::Connection& conn);\n";
00125 if ( !m_entities[Any::MODEL].empty())
00126 mmm += " void visitModelImpl( const BON::Model& model );\n";
00127 if ( !m_entities[Any::FOLDER].empty())
00128 mmm += " void visitFolderImpl( const BON::Folder& fold );\n";
00129
00130 mmm += " protected :\n";
00131
00132 for( unsigned int j = 0; j < HOW_MANY_ITEMS; ++j)
00133 for( unsigned int i = 0; i != m_entities[j].size(); ++i)
00134 {
00135 ClassAndNamespace& ent = m_entities[j][i];
00136 mmm += " virtual bool visit" + ent.infoName() + "( const " + ent.exactType() + "& object );\n";
00137 }
00138 mmm += "};\n";
00139 }
00140 mmm += "\n";
00141 mmm += "} // namespace\n";
00142 mmm += "\n";
00143 mmm += "#endif // " + capitalized_name + "_H\n";
00144
00145 return mmm;
00146 }
00147
00148
00149 std::string MakeVisitor::dumpVisitorSource( )
00150 {
00151 std::string mmm;
00152
00153 mmm += "#include \"stdafx.h\"\n";
00154 mmm += "#include \"" + m_className +".h\"\n";
00155 mmm += "\n";
00156
00157 mmm += "\nnamespace " + global_vars.m_namespace_name +"\n{\n\n";
00158
00159
00160 mmm += m_className + "::" + m_className + "() { }\n\n";
00161 mmm += m_className + "::~" + m_className + "() { }\n\n";
00162
00163 for( unsigned int j = 0; j < HOW_MANY_ITEMS; ++j)
00164 for( unsigned int i = 0; i != m_entities[j].size(); ++i)
00165 {
00166 ClassAndNamespace& ent = m_entities[j][i];
00167 mmm += dumpSpecificMethods( ent);
00168 }
00169
00170 if( !Dumper::m_bGenAcceptSpeci)
00171 mmm += dumpGenericMethods();
00172
00173 mmm += "\n} // namespace\n\n";
00174
00175 return mmm;
00176 }
00177
00178
00179 std::string MakeVisitor::dumpSpecificMethods( const ClassAndNamespace& ent)
00180 {
00181 std::string mmm;
00182 mmm+="bool " + m_className + "::visit" + ent.infoName() + "( const " + ent.exactType() + "& object )\n";
00183 mmm+="{\n";
00184 mmm+=" if ( !object)\n";
00185 mmm+=" return false;\n";
00186 mmm+="\n";
00187 mmm+=" return true;\n";
00188 mmm+="}\n\n\n";
00189
00190 return mmm;
00191 }
00192
00193
00194 std::string MakeVisitor::dumpGenericMethods()
00195 {
00196 std::string mmm;
00197
00198
00199
00200 mmm+="void " + m_className + "::visitObjectImpl( const BON::Object& obj )\n";
00201 mmm+="{}\n\n\n";
00202
00203
00204
00205 if ( !m_entities[Any::FCO_REP].empty()) {
00206 mmm+="void " + m_className + "::visitFCOImpl( const BON::FCO& fco )\n";
00207 mmm+="{\n";
00208 {
00209 for( unsigned int i = 0; i != m_entities[Any::FCO_REP].size(); ++i)
00210 mmm+=" if ( !visit" + m_entities[Any::FCO_REP][i].infoName() + "( fco))\n";
00211 }
00212 mmm+=" {\n";
00213 mmm+=" // visiting other fco\n";
00214 mmm+=" }\n";
00215 mmm+="}\n\n\n";
00216 }
00217
00218
00219
00220 if ( !m_entities[Any::ATOM].empty()) {
00221 mmm+="void " + m_className + "::visitAtomImpl( const BON::Atom& atom )\n";
00222 mmm+="{\n";
00223 {
00224 for( unsigned int i = 0; i != m_entities[Any::ATOM].size(); ++i)
00225 mmm+=" if ( !visit" + m_entities[Any::ATOM][i].infoName() + "( atom))\n";
00226 }
00227 mmm+=" {\n";
00228 mmm+=" // visiting other Atom\n";
00229 mmm+=" }\n";
00230 mmm+="}\n\n\n";
00231 }
00232
00233
00234
00235 if ( !m_entities[Any::SET].empty()) {
00236 mmm+="void " + m_className + "::visitSetImpl( const BON::Set& set )\n";
00237 mmm+="{\n";
00238 {
00239 for( unsigned int i = 0; i != m_entities[Any::SET].size(); ++i)
00240 mmm+=" if ( !visit" + m_entities[Any::SET][i].infoName() + "( set))\n";
00241 }
00242 mmm+=" {\n";
00243 mmm+=" // visiting other Set\n";
00244 mmm+=" }\n";
00245 mmm+="}\n\n\n";
00246 }
00247
00248
00249
00250 if ( !m_entities[Any::REF].empty()) {
00251 mmm+="void " + m_className + "::visitReferenceImpl( const BON::Reference& ref )\n";
00252 mmm+="{\n";
00253 {
00254 for( unsigned int i = 0; i != m_entities[Any::REF].size(); ++i)
00255 mmm+=" if ( !visit" + m_entities[Any::REF][i].infoName() + "( ref))\n";
00256 }
00257 mmm+=" {\n";
00258 mmm+=" // visiting other Reference\n";
00259 mmm+=" }\n";
00260 mmm+="}\n\n\n";
00261 }
00262
00263
00264
00265 if ( !m_entities[Any::CONN].empty()) {
00266 mmm+="void " + m_className + "::visitConnectionImpl( const BON::Connection& conn )\n";
00267 mmm+="{\n";
00268 {
00269 for( unsigned int i = 0; i != m_entities[Any::CONN].size(); ++i)
00270 mmm+=" if ( !visit" + m_entities[Any::CONN][i].infoName() + "( conn))\n";
00271 }
00272 mmm+=" {\n";
00273 mmm+=" // visiting other Connection\n";
00274 mmm+=" }\n";
00275 mmm+="}\n\n\n";
00276 }
00277
00278
00279
00280 if ( !m_entities[Any::MODEL].empty()) {
00281 mmm+="void " + m_className + "::visitModelImpl( const BON::Model& model )\n";
00282 mmm+="{\n";
00283 {
00284 for( unsigned int i = 0; i != m_entities[Any::MODEL].size(); ++i)
00285 mmm+=" if ( !visit" + m_entities[Any::MODEL][i].infoName() + "( model))\n";
00286 }
00287 mmm+=" {\n";
00288 mmm+=" // visiting other Model\n";
00289 mmm+=" }\n";
00290 mmm+="}\n\n\n";
00291 }
00292
00293
00294
00295 if ( !m_entities[Any::FOLDER].empty()) {
00296 mmm+="void " + m_className + "::visitFolderImpl( const BON::Folder& fold )\n";
00297 mmm+="{\n";
00298 {
00299 for( unsigned int i = 0; i != m_entities[Any::FOLDER].size(); ++i)
00300 mmm+=" if ( !visit" + m_entities[Any::FOLDER][i].infoName() + "( fold))\n";
00301 }
00302 mmm+=" {\n";
00303 mmm+=" // visiting other Folder\n";
00304 mmm+=" }\n";
00305 mmm+="}\n\n\n";
00306 }
00307
00308
00309 return mmm;
00310 }