00001 #include "stdafx.h"
00002 #include "CodeGen.h"
00003 #include "Dumper.h"
00004
00005 extern int h_ind;
00006
00007 void CodeGen::folderGetterGeneric( const std::string& retval_folderkind, const std::string& folderkind, const std::string& method_name, bool extended, Any * cont, Method& m)
00008 {
00009 std::string src, rtv, sgn;
00010
00011 rtv = indent(h_ind + 0) + "template <class T>\n";
00012 rtv += indent(h_ind + 0) + "std::set<" + retval_folderkind + ", T>";
00013 sgn = method_name + "(TDP)";
00014 src = indent(h_ind + 0) + "{\n";
00015 src += indent(h_ind + 1) + "std::set<" + retval_folderkind + ", T> res;\n";
00016 src += indent(h_ind + 1) + "std::set<BON::Folder> l = FolderImpl::getChildFolders();\n";
00017 src += indent(h_ind + 1) + "for( std::set<BON::Folder>::iterator i = l.begin(); i != l.end(); ++i)\n";
00018 src += indent(h_ind + 1) + "{\n";
00019 src += indent(h_ind + 2) + retval_folderkind + " elem(*i);\n";
00020
00021 if ( extended)
00022 src += indent(h_ind + 2) + "if (elem)\n";
00023 else
00024 src += indent(h_ind + 2) + "if (elem && elem->getObjectMeta().name() == \"" + folderkind + "\")\n";
00025
00026 src += indent(h_ind + 3) + "res.insert(elem);\n";
00027 src += indent(h_ind + 1) + "}\n";
00028 src += indent(h_ind + 1) + "return res;\n";
00029 src += indent(h_ind + 0) + "}\n";
00030
00031 m.m_container = cont;
00032 m.m_template = true;
00033 m.m_virtual = false;
00034 m.m_returnValue = rtv;
00035 m.m_signature = sgn;
00036 m.m_implementation = src;
00037 m.m_comment = "getter for subfolder \"" + folderkind + "\"";
00038
00039 return;
00040 }
00041
00042
00043 void CodeGen::kindGetter1Generic( const std::string& retval_kind, const std::string& kind, const std::string& method_name, Any * cont, Method& m)
00044 {
00045 std::string src, rtv, sgn;;
00046
00047 rtv = indent(h_ind + 0) + "template <class T>\n";
00048 rtv += indent(h_ind + 0) + "std::set<" + retval_kind + ", T>";
00049 sgn = method_name + "(TDP)";
00050 src = indent(h_ind + 0) + "{\n";
00051 src += indent(h_ind + 1) + "std::set<" + retval_kind + ", T> res;\n";
00052 src += indent(h_ind + 1) + "std::set<BON::Object> kinds = FolderImpl::getChildObjects(\"" + kind + "\");\n";
00053 src += indent(h_ind + 1) + "for( std::set<BON::Object>::iterator i = kinds.begin(); i != kinds.end(); ++i)\n";
00054 src += indent(h_ind + 1) + "{\n";
00055 src += indent(h_ind + 2) + retval_kind + " elem(*i);\n";
00056 src += indent(h_ind + 2) + "ASSERT(elem);\n";
00057 src += indent(h_ind + 2) + "res.insert(elem);\n";
00058 src += indent(h_ind + 1) + "}\n";
00059 src += indent(h_ind + 1) + "return res;\n";
00060 src += indent(h_ind + 0) + "}\n";
00061
00062 m.m_template = true;
00063 m.m_virtual = false;
00064 m.m_returnValue = rtv;
00065 m.m_signature = sgn;
00066 m.m_implementation = src;
00067 m.m_comment = "getter for kind \"" + kind + "\"";
00068 m.m_container = cont;
00069
00070 return;
00071 }
00072
00073
00074 void CodeGen::kindGetter2Generic( const std::string& retval_kind, const std::string& kind, const std::vector< std::string>& kind_vec, const std::string& method_name, Any * cont, Method& m)
00075 {
00076 std::string src, rtv, sgn;;
00077
00078
00079 char len_s[10]; sprintf(len_s, "%u", kind_vec.size()); std::string len_str( len_s);
00080
00081 rtv = indent(h_ind + 0) + "template <class T>\n";
00082 rtv += indent(h_ind + 0) + "std::set<" + retval_kind + ", T>";
00083 sgn = method_name + "(TDP)";
00084 src = indent(h_ind + 0) + "{\n";
00085 src += indent(h_ind + 1) + "std::set<" + retval_kind + ", T> res;\n";
00086 src += indent(h_ind + 1) + "const int len = " + len_str + ";\n";
00087 src += indent(h_ind + 1) + "std::set<BON::Object> kinds_vec[ len];\n";
00088
00089 for( int k = 0; k < kind_vec.size(); ++k)
00090 {
00091 char k_s[10]; sprintf( k_s, "%i", k); std::string k_str( k_s);
00092 src += indent(h_ind + 1) + "kinds_vec[" + k_str + "] = FolderImpl::getChildObjects";
00093 src += "(\"" + kind_vec[k] + "\");\n";
00094 }
00095 src += indent(h_ind + 1) + "for( int k = 0; k < len; ++k)\n";
00096 src += indent(h_ind + 2) + "for( std::set<BON::Object>::iterator i = kinds_vec[k].begin(); i != kinds_vec[k].end(); ++i)\n";
00097 src += indent(h_ind + 2) + "{\n";
00098 src += indent(h_ind + 3) + retval_kind + " elem(*i);\n";
00099 src += indent(h_ind + 3) + "ASSERT(elem);\n";
00100 src += indent(h_ind + 3) + "res.insert(elem);\n";
00101 src += indent(h_ind + 2) + "}\n";
00102 src += indent(h_ind + 1) + "return res;\n";
00103 src += indent(h_ind + 0) + "}\n";
00104
00105 m.m_template = true;
00106 m.m_virtual = false;
00107 m.m_returnValue = rtv;
00108 m.m_signature = sgn;
00109 m.m_implementation = src;
00110 m.m_comment = "aggregated getter for kind \"" + kind + "\" and its descendants";
00111 m.m_container = cont;
00112 }
00113
00114
00115 void CodeGen::kindGetter3Generic( const std::string& retval_kind, const std::string& kind, const std::string& method_name, Any * cont, Method& m)
00116 {
00117
00118 std::string src, rtv, sgn;
00119
00120 rtv = indent(h_ind + 0) + "template <class T>\n";
00121 rtv += indent(h_ind + 0) + "std::set<" + retval_kind + ", T>";
00122 sgn = method_name + "_Excl(TDP)";
00123 src = indent(h_ind + 0) + "{\n";
00124 src += indent(h_ind + 1) + " std::set<" + retval_kind + ", T> res;\n";
00125 src += indent(h_ind + 1) + " std::set<Object> l = FolderImpl::getChildObjects(\"" + kind + "\");\n";
00126 src += indent(h_ind + 1) + " for( std::set<Object>::iterator i = l.begin(); i != l.end(); ++i)\n";
00127 src += indent(h_ind + 1) + " {\n";
00128 src += indent(h_ind + 2) + " " + retval_kind + " elem(*i);\n";
00129 src += indent(h_ind + 2) + " ASSERT(elem);\n";
00130 src += indent(h_ind + 2) + " res.insert(elem);\n";
00131 src += indent(h_ind + 1) + " }\n";
00132 src += indent(h_ind + 1) + " return res;\n";
00133 src += indent(h_ind + 0) + "}\n";
00134
00135 m.m_template = true;
00136 m.m_virtual = false;
00137 m.m_returnValue = rtv;
00138 m.m_signature = sgn;
00139 m.m_implementation = src;
00140 m.m_container = cont;
00141 m.m_comment = "EXCL getter for kind \"" + kind + "\"";
00142 }
00143
00144
00145
00146
00147 void CodeGen::roleGetter1Generic( const std::string& retval_kind, const std::string& inquire, const std::string& method_name, const std::string& fco_name, Any * cont, Method& tm)
00148 {
00149 std::string src, rtv, sgn;
00150
00151 rtv = indent(h_ind + 0) + "template <class T>\n";
00152 rtv += indent(h_ind + 0) + "std::set<" + retval_kind + ", T>";
00153 sgn = method_name + "(TDP)";
00154 src = indent(h_ind + 0) + "{\n";
00155 src += indent(h_ind + 1) + "std::set<" + retval_kind + ", T> res;\n";
00156 src += indent(h_ind + 1) + "std::set<BON::FCO> roles = ModelImpl::getChildFCOsAs(\"" + inquire + "\");\n";
00157 src += indent(h_ind + 1) + "for( std::set<BON::FCO>::iterator i = roles.begin(); i != roles.end(); ++i)\n";
00158 src += indent(h_ind + 1) + "{\n";
00159 src += indent(h_ind + 2) + retval_kind + " elem(*i);\n";
00160 src += indent(h_ind + 2) + "ASSERT(elem);\n";
00161 src += indent(h_ind + 2) + "res.insert(elem);\n";
00162 src += indent(h_ind + 1) + "}\n";
00163 src += indent(h_ind + 1) + "return res;\n";
00164 src += indent(h_ind + 0) + "}\n";
00165
00166 tm.m_virtual = false;
00167 tm.m_template = true;
00168 tm.m_returnValue = rtv;
00169 tm.m_signature = sgn;
00170 tm.m_implementation = src;
00171 tm.m_container = cont;
00172 tm.m_comment = "getter for role \"" + inquire + "\" among \"" + fco_name + "\"s";
00173
00174 return;
00175 }
00176
00177
00178 void CodeGen::roleGetter2Generic( const std::string& retval_kind, const std::string& inquire, const std::string& method_name, const std::string& fco_name, Any * cont, Method& tm)
00179 {
00180 std::string src, rtv, sgn;
00181
00182 rtv = indent(h_ind + 0) + "template <class T>\n";
00183 rtv += indent(h_ind + 0) + "std::set<" + retval_kind + ", T>";
00184 sgn = method_name + "(TDP)";
00185 src = indent(h_ind + 0) + "{\n";
00186 src += indent(h_ind + 1) + "std::set<" + retval_kind + ", T> res;\n";
00187 src += indent(h_ind + 1) + "std::set<BON::FCO> roles = ModelImpl::getChildFCOsAs(\"" + inquire + "\");\n";
00188 src += indent(h_ind + 1) + "for( std::set<BON::FCO>::iterator i = roles.begin(); i != roles.end(); ++i)\n";
00189 src += indent(h_ind + 1) + "{\n";
00190 src += indent(h_ind + 2) + retval_kind + " elem(*i);\n";
00191 src += indent(h_ind + 2) + "ASSERT(elem);\n";
00192 src += indent(h_ind + 2) + "res.insert(elem);\n";
00193 src += indent(h_ind + 1) + "}\n";
00194 src += indent(h_ind + 1) + "return res;\n";
00195 src += indent(h_ind + 0) + "}\n";
00196
00197 tm.m_virtual = false;
00198 tm.m_template = true;
00199 tm.m_returnValue = rtv;
00200 tm.m_signature = sgn;
00201 tm.m_implementation = src;
00202 tm.m_container = cont;
00203 tm.m_comment = "getter for role \"" + inquire + "\" among \"" + fco_name + "\"s";
00204
00205 return;
00206 }
00207
00208
00209 void CodeGen::roleGetter3Generic( const std::string& retval_kind, const std::string& method_name, const std::string& fco_name, const std::string& role_name, const std::vector< std::string > & roles, const std::string& dummy_str, Any * cont, Method& tm)
00210 {
00211 std::string src, rtv, sgn, comm;
00212
00213 char len_s[10]; sprintf(len_s, "%u", roles.size()); std::string len_str( len_s);
00214
00215 rtv = indent(h_ind + 0) + "template <class T>\n";
00216 rtv += indent(h_ind + 0) + "std::set<" + retval_kind + ", T>";
00217 sgn = method_name + "(" + dummy_str + ((dummy_str.empty())?"":", ") + "TDP)";
00218 src = indent(h_ind + 0) + "{\n";
00219 src += indent(h_ind + 1) + "std::set<" + retval_kind + ", T> res;\n";
00220 src += indent(h_ind + 1) + "const int len = " + len_str + ";\n";
00221 src += indent(h_ind + 1) + "std::set<BON::FCO> roles_vec[ len];\n";
00222
00223 for( int k = 0; k < roles.size(); ++k)
00224 {
00225 char k_s[10]; sprintf( k_s, "%i", k); std::string k_str( k_s);
00226 src += indent(h_ind + 1) + "roles_vec[" + k_str + "] = ModelImpl::getChildFCOsAs(\"" + roles[k] + "\");\n";
00227 }
00228
00229 src += indent(h_ind + 1) + "for( int k = 0; k < len; ++k)\n";
00230 src += indent(h_ind + 2) + "for( std::set<BON::FCO>::iterator i = roles_vec[k].begin(); i != roles_vec[k].end(); ++i)\n";
00231 src += indent(h_ind + 2) + "{\n";
00232 src += indent(h_ind + 3) + retval_kind + " elem(*i);\n";
00233 src += indent(h_ind + 3) + "ASSERT(elem);\n";
00234 src += indent(h_ind + 3) + "res.insert(elem);\n";
00235 src += indent(h_ind + 2) + "}\n";
00236 src += indent(h_ind + 1) + "return res;\n";
00237 src += indent(h_ind + 0) + "}\n";
00238
00239 tm.m_virtual = false;
00240 tm.m_template = true;
00241 tm.m_returnValue = rtv;
00242 tm.m_signature = sgn;
00243 tm.m_implementation = src;
00244 tm.m_container = cont;
00245 tm.m_comment = "aggregated getter for role \"" + role_name + "\" among \"" + fco_name + "\"s and its descendants";
00246
00247 return;
00248 }
00249
00250
00251 void CodeGen::roleGetter4Generic( const std::string& retval_kind, const std::string& method_name, const std::string& fco_name, const std::string& desc_k_name, const std::string& role_name, const std::string& nmsp, Any * cont, Method& tm)
00252 {
00253 std::string src, rtv, sgn, comm;
00254
00255 rtv = indent(h_ind + 0) + "template <class T>\n";
00256 rtv += indent(h_ind + 0) + "std::set<" + retval_kind + ", T>";
00257 sgn = method_name + "(TDP)";
00258 src = indent(h_ind + 0) + "{\n";
00259 src += indent(h_ind + 1) + "std::set<" + retval_kind + ", T> res;\n";
00260 src += indent(h_ind + 1) + "std::set<BON::FCO> roles = ModelImpl::getChildFCOsAs(\"" + nmsp + desc_k_name + role_name + "\");\n";
00261 src += indent(h_ind + 1) + "for( std::set<BON::FCO>::iterator i = roles.begin(); i != roles.end(); ++i)\n";
00262 src += indent(h_ind + 1) + "{\n";
00263 src += indent(h_ind + 2) + retval_kind + " elem(*i);\n";
00264 src += indent(h_ind + 2) + "ASSERT(elem);\n";
00265 src += indent(h_ind + 2) + "res.insert(elem);\n";
00266 src += indent(h_ind + 1) + "}\n";
00267 src += indent(h_ind + 1) + "return res;\n";
00268 src += indent(h_ind + 0) + "}\n";
00269
00270 tm.m_virtual = false;
00271 tm.m_template = true;
00272 tm.m_returnValue = rtv;
00273 tm.m_signature = sgn;
00274 tm.m_implementation = src;
00275 tm.m_container = cont;
00276 tm.m_comment = "getter for role \"" + nmsp + desc_k_name + role_name + "\" among \"" + nmsp + fco_name + "\"s and its descendants";
00277
00278 return;
00279 }
00280
00281
00282 Method CodeGen::dumpGetInConnectionLinksGeneric( FCO *fco, ConnectionRep * conn)
00283 {
00284 Method m;
00285
00286 std::string src, rtv, sgn;
00287
00288 rtv = indent(h_ind + 0) + "template <class T>\n";
00289 rtv += indent(h_ind + 0) + "std::set<" + conn->getLValidName() + ", T>";
00290 sgn = "getIn" + conn->getValidName() + "Links(TDP)";
00291 src = indent(h_ind + 0) + "{\n";
00292 src += indent(h_ind + 1) + "std::set<" + conn->getLValidName() + ", T> result;\n";
00293 src += indent(h_ind + 1) + "std::set<BON::Connection> conns = ConnectionEndImpl::getInConnLinks();\n";
00294 src += indent(h_ind + 1) + "std::set<BON::Connection>::iterator it = conns.begin();\n";
00295 src += indent(h_ind + 1) + "for( ; it != conns.end(); ++it)\n";
00296 src += indent(h_ind + 1) + "{\n";
00297 src += indent(h_ind + 2) + conn->getLValidName() + " c( *it);\n";
00298 src += indent(h_ind + 2) + "if (c)\n";
00299 src += indent(h_ind + 3) + "result.insert( c);\n";
00300 src += indent(h_ind + 1) + "}\n";
00301 src += indent(h_ind + 1) + "return result;\n";
00302 src += indent(h_ind + 0) + "}\n";
00303
00304 m.m_virtual = false;
00305 m.m_template = true;
00306 m.m_signature = sgn;
00307 m.m_returnValue = rtv;
00308 m.m_implementation = src;
00309 m.m_container = fco;
00310 m.m_comment = "";
00311
00312 return m;
00313 }
00314
00315 Method CodeGen::dumpGetOutConnectionLinksGeneric( FCO *fco, ConnectionRep * conn)
00316 {
00317 Method m;
00318
00319 std::string src, rtv, sgn;
00320
00321 rtv = indent(h_ind + 0) + "template <class T>\n";
00322 rtv += indent(h_ind + 0) + "std::set<" + conn->getLValidName() + ", T>";
00323 sgn = "getOut" + conn->getValidName() + "Links(TDP)";
00324 src = indent(h_ind + 0) + "{\n";
00325 src += indent(h_ind + 1) + "std::set<" + conn->getLValidName() + ", T> result;\n";
00326 src += indent(h_ind + 1) + "std::set<BON::Connection> conns = ConnectionEndImpl::getOutConnLinks();\n";
00327 src += indent(h_ind + 1) + "std::set<BON::Connection>::iterator it = conns.begin();\n";
00328 src += indent(h_ind + 1) + "for( ; it != conns.end(); ++it)\n";
00329 src += indent(h_ind + 1) + "{\n";
00330 src += indent(h_ind + 2) + conn->getLValidName() + " c( *it);\n";
00331 src += indent(h_ind + 2) + "if (c)\n";
00332 src += indent(h_ind + 3) + "result.insert( c);\n";
00333 src += indent(h_ind + 1) + "}\n";
00334 src += indent(h_ind + 1) + "return result;\n";
00335 src += indent(h_ind + 0) + "}\n";
00336
00337 m.m_virtual = false;
00338 m.m_template = true;
00339 m.m_signature = sgn;
00340 m.m_returnValue = rtv;
00341 m.m_implementation = src;
00342 m.m_container = fco;
00343 m.m_comment = "";
00344
00345 return m;
00346 }
00347
00348 Method CodeGen::dumpGetBothConnectionLinksGeneric( FCO *fco, ConnectionRep * conn)
00349 {
00350 Method m;
00351
00352 std::string src, rtv, sgn;
00353
00354 rtv = indent(h_ind + 0) + "template <class T>\n";
00355 rtv += indent(h_ind + 0) + "std::set<" + conn->getLValidName() + ", T>";
00356 sgn = "get" + conn->getValidName() + "Links(TDP)";
00357 src = indent(h_ind + 0) + "{\n";
00358 src += indent(h_ind + 1) + "std::set<" + conn->getLValidName() + ", T> result;\n";
00359 src += indent(h_ind + 1) + "std::set<BON::Connection> conns = ConnectionEndImpl::getConnLinks();\n";
00360 src += indent(h_ind + 1) + "std::set<BON::Connection>::iterator it = conns.begin();\n";
00361 src += indent(h_ind + 1) + "for( ; it != conns.end(); ++it)\n";
00362 src += indent(h_ind + 1) + "{\n";
00363 src += indent(h_ind + 2) + conn->getLValidName() + " c( *it);\n";
00364 src += indent(h_ind + 2) + "if (c)\n";
00365 src += indent(h_ind + 3) + "result.insert( c);\n";
00366 src += indent(h_ind + 1) + "}\n";
00367 src += indent(h_ind + 1) + "return result;\n";
00368 src += indent(h_ind + 0) + "}\n";
00369
00370 m.m_virtual = false;
00371 m.m_template = true;
00372 m.m_signature = sgn;
00373 m.m_returnValue = rtv;
00374 m.m_implementation = src;
00375 m.m_container = fco;
00376 m.m_comment = "";
00377
00378 return m;
00379 }
00380
00381
00382 Method CodeGen::dumpGetInConnectionEndGeneric( FCO *fco, FCO* peer, ConnectionRep* conn, bool peer_may_be_refport)
00383 {
00384 Method m;
00385 std::string peer_lcd;
00386 if (peer)
00387 peer_lcd = peer->getLValidName();
00388 else
00389 peer_lcd = "BON::FCO";
00390
00391 std::string src, rtv, sgn;
00392
00393 if ( peer_may_be_refport)
00394 {
00395
00396 rtv = indent(h_ind + 0) + "template <class T>\n";
00397 rtv += indent(h_ind + 0) + "std::multiset<BON::ConnectionEnd, T>";
00398 sgn = "get" + conn->getValidName() + "Srcs(TDP)";
00399 src = indent(h_ind + 0) + "{\n";
00400 src += indent(h_ind + 1) + "std::multiset<BON::ConnectionEnd> ends = BON::ConnectionEndImpl::getInConnEnds(\"" + conn->getLStrictName() + "\");\n";
00401 src += indent(h_ind + 1) + "return std::multiset<BON::ConnectionEnd, T>( ends.begin(), ends.end());\n";
00402 src += indent(h_ind + 0) + "}\n";
00403
00404 m.m_virtual = false;
00405 m.m_template = true;
00406 m.m_signature = sgn;
00407 m.m_returnValue = rtv;
00408 m.m_implementation = src;
00409 m.m_container = fco;
00410 m.m_comment = "returns src " + peer_lcd + "s and referenceports";
00411 }
00412 else
00413 {
00414
00415 rtv = indent(h_ind + 0) + "template <class T>\n";
00416 rtv += indent(h_ind + 0) + "std::multiset<" + peer_lcd + ", T>";
00417 sgn = "get" + conn->getValidName() + "Srcs(TDP)";
00418 src = indent(h_ind + 0) + "{\n";
00419 src += indent(h_ind + 1) + "std::multiset<" + peer_lcd + ", T> res;\n";
00420 src += indent(h_ind + 1) + "{\n";
00421
00422 src += indent(h_ind + 2) + "std::multiset<BON::ConnectionEnd> in_ends = BON::ConnectionEndImpl::getInConnEnds(\"" + conn->getLStrictName() + "\");\n";
00423 src += indent(h_ind + 2) + "for ( std::multiset<BON::ConnectionEnd>::iterator cit = in_ends.begin() ; cit != in_ends.end() ; ++cit )\n";
00424 src += indent(h_ind + 2) + "{\n";
00425 src += indent(h_ind + 3) + peer_lcd + " dst( *cit );\n";
00426 src += indent(h_ind + 3) + "ASSERT(dst);\n";
00427 src += indent(h_ind + 3) + "res.insert( dst);\n";
00428 src += indent(h_ind + 2) + "}\n";
00429 src += indent(h_ind + 1) + "}\n";
00430 src += indent(h_ind + 1) + "return res;\n";
00431 src += indent(h_ind + 0) + "}\n";
00432
00433 m.m_virtual = false;
00434 m.m_template = true;
00435 m.m_signature = sgn;
00436 m.m_returnValue = rtv;
00437 m.m_implementation = src;
00438 m.m_container = fco;
00439 m.m_comment = "returns src " + peer_lcd + "s";;
00440 }
00441 return m;
00442 }
00443
00444 Method CodeGen::dumpGetOutConnectionEndGeneric( FCO *fco, FCO* peer, ConnectionRep* conn, bool peer_may_be_refport)
00445 {
00446 Method m;
00447 std::string peer_lcd;
00448 if (peer)
00449 peer_lcd = peer->getLValidName();
00450 else
00451 peer_lcd = "BON::FCO";
00452
00453 std::string src, rtv, sgn;
00454
00455 if ( peer_may_be_refport)
00456 {
00457
00458 rtv = indent(h_ind + 0) + "template <class T>\n";
00459 rtv += indent(h_ind + 0) + "std::multiset<BON::ConnectionEnd, T>";
00460 sgn = "get" + conn->getValidName() + "Dsts(TDP)";
00461 src = indent(h_ind + 0) + "{\n";
00462 src += indent(h_ind + 1) + "std::multiset<BON::ConnectionEnd> ends = BON::ConnectionEndImpl::getOutConnEnds(\"" + conn->getLStrictName() + "\");\n";
00463 src += indent(h_ind + 1) + "return std::multiset<BON::ConnectionEnd, T>( ends.begin(), ends.end());\n";
00464 src += indent(h_ind + 0) + "}\n";
00465
00466
00467 m.m_virtual = false;
00468 m.m_template = true;
00469 m.m_signature = sgn;
00470 m.m_returnValue = rtv;
00471 m.m_implementation = src;
00472 m.m_container = fco;
00473 m.m_comment = "returns dst " + peer_lcd + "s and referenceports";
00474 }
00475 else
00476 {
00477
00478 rtv = indent(h_ind + 0) + "template <class T>\n";
00479 rtv += indent(h_ind + 0) + "std::multiset<" + peer_lcd + ", T>";
00480 sgn = "get" + conn->getValidName() + "Dsts(TDP)";
00481 src = indent(h_ind + 0) + "{\n";
00482 src += indent(h_ind + 1) + "std::multiset<" + peer_lcd + ", T> res;\n";
00483 src += indent(h_ind + 1) + "{\n";
00484
00485 src += indent(h_ind + 2) + "std::multiset<BON::ConnectionEnd> out_ends = BON::ConnectionEndImpl::getOutConnEnds(\"" + conn->getLStrictName() + "\");\n";
00486 src += indent(h_ind + 2) + "for ( std::multiset<BON::ConnectionEnd>::iterator cit = out_ends.begin() ; cit != out_ends.end() ; ++cit )\n";
00487 src += indent(h_ind + 2) + "{\n";
00488 src += indent(h_ind + 3) + peer_lcd + " dst( *cit );\n";
00489 src += indent(h_ind + 3) + "ASSERT(dst);\n";
00490 src += indent(h_ind + 3) + "res.insert( dst);\n";
00491 src += indent(h_ind + 2) + "}\n";
00492 src += indent(h_ind + 1) + "}\n";
00493 src += indent(h_ind + 1) + "return res;\n";
00494 src += indent(h_ind + 0) + "}\n";
00495
00496 m.m_virtual = false;
00497 m.m_template = true;
00498 m.m_signature = sgn;
00499 m.m_returnValue = rtv;
00500 m.m_implementation = src;
00501 m.m_container = fco;
00502 m.m_comment = "returns dst " + peer_lcd + "s";
00503 }
00504 return m;
00505 }
00506
00507
00508 Method CodeGen::dumpGetBothConnectionEndGeneric( FCO *fco, FCO* peer, ConnectionRep* conn, bool peer_may_be_refport)
00509 {
00510 Method m;
00511 std::string peer_lcd;
00512 if (peer)
00513 peer_lcd = peer->getLValidName();
00514 else
00515 peer_lcd = "BON::FCO";
00516
00517 std::string src, rtv, sgn;
00518
00519 if ( peer_may_be_refport)
00520 {
00521
00522 rtv = indent(h_ind + 0) + "template <class T>\n";
00523 rtv += indent(h_ind + 0) + "std::multiset<BON::ConnectionEnd, T>";
00524 sgn = "get" + conn->getValidName() + "Ends(TDP)";
00525 src = indent(h_ind + 0) + "{\n";
00526 src += indent(h_ind + 1) + "std::multiset<BON::ConnectionEnd> ends = BON::ConnectionEndImpl::getConnEnds(\"" + conn->getLStrictName() + "\");\n";
00527 src += indent(h_ind + 1) + "return std::multiset<BON::ConnectionEnd, T>( ends.begin(), ends.end());\n";
00528 src += indent(h_ind + 0) + "}\n";
00529
00530
00531 m.m_virtual = false;
00532 m.m_template = true;
00533 m.m_signature = sgn;
00534 m.m_returnValue = rtv;
00535 m.m_implementation = src;
00536 m.m_container = fco;
00537 m.m_comment = "returns src and dst " + peer_lcd + "s and referenceports";
00538 }
00539 else
00540 {
00541 rtv = indent(h_ind + 0) + "template <class T>\n";
00542 rtv += indent(h_ind + 0) + "std::multiset<" + peer_lcd + ", T>";
00543 sgn = "get" + conn->getValidName() + "Ends(TDP)";
00544 src = indent(h_ind + 0) + "{\n";
00545 src += indent(h_ind + 1) + "std::multiset<" + peer_lcd + ", T> res;\n";
00546 src += indent(h_ind + 1) + "{\n";
00547 src += indent(h_ind + 2) + "std::multiset<BON::ConnectionEnd> in_ends = BON::ConnectionEndImpl::getInConnEnds(\"" + conn->getLStrictName() + "\");\n";
00548 src += indent(h_ind + 2) + "for ( std::multiset<BON::ConnectionEnd>::iterator cit = in_ends.begin() ; cit != in_ends.end() ; ++cit )\n";
00549 src += indent(h_ind + 2) + "{\n";
00550 src += indent(h_ind + 3) + peer_lcd + " dst( *cit );\n";
00551 src += indent(h_ind + 3) + "ASSERT(dst);\n";
00552 src += indent(h_ind + 3) + "res.insert( dst);\n";
00553 src += indent(h_ind + 2) + "}\n";
00554 src += indent(h_ind + 2) + "std::multiset<BON::ConnectionEnd> out_ends = BON::ConnectionEndImpl::getOutConnEnds(\"" + conn->getLStrictName() + "\");\n";
00555 src += indent(h_ind + 2) + "for ( std::multiset<BON::ConnectionEnd>::iterator cot = out_ends.begin() ; cot != out_ends.end() ; ++cot )\n";
00556 src += indent(h_ind + 2) + "{\n";
00557 src += indent(h_ind + 3) + peer_lcd + " dst( *cot );\n";
00558 src += indent(h_ind + 3) + "ASSERT(dst);\n";
00559 src += indent(h_ind + 3) + "res.insert( dst);\n";
00560 src += indent(h_ind + 2) + "}\n";
00561 src += indent(h_ind + 1) + "}\n";
00562 src += indent(h_ind + 1) + "return res;\n";
00563 src += indent(h_ind + 0) + "}\n";
00564
00565 m.m_virtual = false;
00566 m.m_template = true;
00567 m.m_signature = sgn;
00568 m.m_returnValue = rtv;
00569 m.m_implementation = src;
00570 m.m_container = fco;
00571 m.m_comment = "returns src and dst " + peer_lcd + "s";
00572 }
00573 return m;
00574 }
00575
00576
00577 Method CodeGen::dumpSetGetterGeneric( SetRep * cont, const FCO * fco, const std::string& common_kind, bool aggreg , bool dummy_par )
00578 {
00579 ASSERT( fco || ( aggreg && !common_kind.empty()));
00580 std::string retval_kind;
00581
00582 if (fco)
00583 {
00584 retval_kind = fco->getLValidName();
00585
00586 if ( !fco->isToBeEx())
00587 {
00588 FCO * ext_anc = fco->getExtedAnc();
00589 if ( ext_anc)
00590 retval_kind = ext_anc->getLValidName();
00591 else
00592 retval_kind = "BON::" + Any::KIND_TYPE_STR[fco->getMyKind()];
00593 }
00594 }
00595 else if ( !common_kind.empty())
00596 retval_kind = common_kind;
00597 else
00598 ASSERT(0);
00599
00600 Method m;
00601
00602 std::string src, rtv, sgn;
00603
00604 rtv = indent(h_ind + 0) + "template <class T>\n";
00605 rtv += indent(h_ind + 0) + "std::set<" + retval_kind + ", T>";
00606 sgn = cont->setGetterTemplate( fco) + "(" + (dummy_par?" int dummy, ":"") + "TDP)";
00607 src = indent(h_ind + 0) + "{\n";
00608 src += indent(h_ind + 1) + "std::set<" + retval_kind + ", T> res;\n";
00609 src += indent(h_ind + 1) + "std::set<BON::FCO> elems = BON::SetImpl::getMembers();\n";
00610 src += indent(h_ind + 1) + "std::set<BON::FCO>::iterator elem = elems.begin();\n";
00611 src += indent(h_ind + 1) + "for( ; elem != elems.end(); ++elem)\n";
00612 src += indent(h_ind + 1) + "{\n";
00613 src += indent(h_ind + 2) + retval_kind + " r( *elem);\n";
00614
00615 if ( fco)
00616 {
00617 if ( !aggreg)
00618 {
00619 src += indent(h_ind + 2) + "if ( r && r->getObjectMeta().name() == \"" + fco->getValidName() + "\")\n";
00620 }
00621 else
00622 {
00623 src += indent(h_ind + 2) + "if ( r)\n";
00624 }
00625 }
00626 else
00627 src += indent(h_ind + 2) + "if ( r)\n";
00628
00629 src += indent(h_ind + 3) + "res.insert( r);\n";
00630 src += indent(h_ind + 1) + "}\n";
00631 src += indent(h_ind + 1) + "return res;\n";
00632 src += indent(h_ind + 0) + "}\n";
00633
00634 m.m_virtual = false;
00635 m.m_template = true;
00636 m.m_returnValue = rtv;
00637 m.m_signature = sgn;
00638 m.m_implementation = src;
00639 m.m_container = cont;
00640 if ( !aggreg)
00641 m.m_comment = "specialized getter for " + fco->getValidName() + " setmembers";
00642 else
00643 m.m_comment = "aggregated getter for setmembers";
00644
00645 return m;
00646 }
00647