00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifdef HAVE_CONFIG_H
00017 #include "torc/generic/config.h"
00018 #endif //HAVE_CONFIG_H
00019
00020 #include <algorithm>
00021 #include <iterator>
00022 #include <ostream>
00023 #include <sstream>
00024
00025 #include "torc/generic/om/Flattening.hpp"
00026
00027 #include "torc/generic/om/View.hpp"
00028 #include "torc/generic/om/SingleInstance.hpp"
00029 #include "torc/generic/om/InstanceArray.hpp"
00030 #include "torc/generic/om/InstanceArrayMember.hpp"
00031 #include "torc/generic/om/Port.hpp"
00032 #include "torc/generic/om/ScalarPortReference.hpp"
00033 #include "torc/generic/om/VectorPortReference.hpp"
00034 #include "torc/generic/om/VectorPortBitReference.hpp"
00035 #include "torc/generic/om/PortBundleReference.hpp"
00036 #include "torc/generic/om/PortList.hpp"
00037 #include "torc/generic/om/Net.hpp"
00038 #include "torc/generic/util/Log.hpp"
00039 #include "torc/generic/om/Cloning.hpp"
00040
00041 namespace {
00042
00043 using namespace torc::generic;
00044
00045 template<typename _Pointer>
00046 std::string
00047 getModifiedName( const std::string &inInstName,
00048 const _Pointer &inNameable,
00049 const std::vector<size_t> &inIndicesVector = std::vector<size_t>() )
00050 {
00051 std::string name;
00052 name = inInstName + "_";
00053 if( inIndicesVector.empty() )
00054 {
00055 name += inNameable->getName();
00056 }
00057 else
00058 {
00059 std::ostringstream indices;
00060 copy( inIndicesVector.begin(), inIndicesVector.end(),
00061 std::ostream_iterator<size_t>( indices,"_" ) );
00062 name += indices.str();
00063 name += inNameable->getName();
00064 }
00065 return name;
00066 }
00067
00068 void
00069 replicatePortRefConnections( const NetSharedPtr &inOrigNet,
00070 const NetSharedPtr &outTargetNet,
00071 const ViewSharedPtr &inCurrentView,
00072 const InstanceSharedPtr &inInstance ) {
00073 log("Replicating portRef connections for %s to %s\n",
00074 inOrigNet->getName().c_str(),
00075 outTargetNet->getName().c_str());
00076 std::vector<PortReferenceSharedPtr> portRefs;
00077 bool isBit = eCompositionTypeVectorBit
00078 == inOrigNet->getCompositionType();
00079 inOrigNet->getConnectedPortRefs( portRefs, !isBit );
00080 for( std::vector<PortReferenceSharedPtr>::iterator ref
00081 = portRefs.begin(); ref != portRefs.end(); ++ref )
00082 {
00083 std::vector<std::string> nestedNames;
00084 PortReferenceSharedPtr actualPortRef = *ref;
00085 PortReferenceSharedPtr portRef = actualPortRef;
00086 InstanceSharedPtr instance;
00087 while( portRef )
00088 {
00089 if( eCompositionTypeVectorBit
00090 != portRef->getCompositionType())
00091 {
00092 nestedNames.push_back( portRef->getName() );
00093 instance = portRef->getParent();
00094 }
00095 portRef = portRef->getParentCollection();
00096 }
00097 std::vector<size_t> indices;
00098 if( eCompositionTypeVectorBit
00099 == instance->getCompositionType() )
00100 {
00101 indices
00102 = IndexFinder<Instance, InstanceArrayMember>()(
00103 instance );
00104 instance = instance->getParentCollection();
00105 }
00106 std::vector<size_t> originalInstanceIndex;
00107 if( eCompositionTypeVectorBit
00108 == inInstance->getCompositionType() )
00109 {
00110 originalInstanceIndex
00111 = IndexFinder<Instance, InstanceArrayMember>()(
00112 inInstance );
00113 }
00114 std::string newInstName
00115 = getModifiedName( inInstance->getName(), instance, originalInstanceIndex);
00116 InstanceSharedPtr targetInst
00117 = inCurrentView->findInstance( newInstName );
00118 if( !indices.empty() )
00119 {
00120 targetInst = targetInst->get( indices );
00121 }
00122 std::string portName = *nestedNames.rbegin();
00123 PortReferenceSharedPtr targetPortRef
00124 = targetInst->findPortReference( portName );
00125 if( !targetPortRef )
00126 {
00127
00128 }
00129 if( nestedNames.size() > 1 )
00130 {
00131 findLeafConnectable( nestedNames, targetPortRef );
00132 }
00133 if( eCompositionTypeVectorBit
00134 == actualPortRef->getCompositionType() )
00135 {
00136 std::vector<size_t> portRefIndices
00137 = IndexFinder<PortReference,
00138 VectorPortBitReference>()(actualPortRef);
00139 targetPortRef = targetPortRef->get( portRefIndices );
00140 }
00141 log("\tConnecting %s to net %s\n",
00142 targetPortRef->getName().c_str(),
00143 outTargetNet->getName().c_str());
00144 log("\tIndices: ");
00145 targetPortRef->connect( outTargetNet );
00146 }
00147 }
00148
00149 class PortRefConnectionReplicator
00150 : ScalarNet::Visitor,
00151 VectorNet::Visitor,
00152 VectorNetBit::Visitor,
00153 NetBundle::Visitor {
00154 private:
00155
00156 public:
00157
00158 void
00159 visit( ScalarNet &inScalarNet ) throw(Error)
00160 try
00161 {
00162 replicatePortRefConnections(
00163 inScalarNet.getSharedThis(), mTargetNet,
00164 mCurrentView, mOriginalInstance );
00165 }
00166 catch( Error &e )
00167 {
00168 e.setCurrentLocation(
00169 __FUNCTION__, __FILE__, __LINE__ );
00170 throw;
00171 }
00172
00173 void
00174 visit( VectorNet &inVectorNet ) throw(Error)
00175 try
00176 {
00177 replicatePortRefConnections(
00178 inVectorNet.getSharedThis(), mTargetNet,
00179 mCurrentView, mOriginalInstance );
00180 #if 0
00181 std::vector< NetSharedPtr > children;
00182 inVectorNet.getCreatedChildren( children );
00183 for( std::vector< NetSharedPtr >::iterator it
00184 = children.begin(); it != children.end(); ++it )
00185 {
00186 NetSharedPtr childNet = *it;
00187 PortRefConnectionReplicator()( childNet,
00188 mTargetNet->get(
00189 IndexFinder<PortReference,
00190 VectorPortBitReference>()( childNet )),
00191 mCurrentView, mInstName );
00192 }
00193 #endif
00194 }
00195 catch( Error &e )
00196 {
00197 e.setCurrentLocation(
00198 __FUNCTION__, __FILE__, __LINE__ );
00199 throw;
00200 }
00201
00202 void
00203 visit( VectorNetBit &inVectorNetBit ) throw(Error)
00204 try
00205 {
00206 replicatePortRefConnections(
00207 inVectorNetBit.getSharedThis(), mTargetNet,
00208 mCurrentView, mOriginalInstance );
00209 }
00210 catch( Error &e )
00211 {
00212 e.setCurrentLocation(
00213 __FUNCTION__, __FILE__, __LINE__ );
00214 throw;
00215 }
00216
00217 void
00218 visit( NetBundle &inNetBundle ) throw(Error)
00219 try
00220 {
00221 replicatePortRefConnections(
00222 inNetBundle.getSharedThis(), mTargetNet,
00223 mCurrentView, mOriginalInstance );
00224 #if 0
00225 std::vector< NetSharedPtr > children;
00226 inNetBundle.getChildren( children );
00227 std::vector< NetSharedPtr > targetChildren;
00228 mTargetNet->getChildren( targetChildren );
00229 std::vector< NetSharedPtr >::iterator target
00230 = targetChildren.begin();
00231 for( std::vector< NetSharedPtr >::iterator it
00232 = children.begin(); it != children.end();
00233 ++it, ++target )
00234 {
00235 PortRefConnectionReplicator()( *it, *target,
00236 mCurrentView, mInstName );
00237 }
00238 #endif
00239 }
00240 catch( Error &e )
00241 {
00242 e.setCurrentLocation(
00243 __FUNCTION__, __FILE__, __LINE__ );
00244 throw;
00245 }
00246
00247 void
00248 operator ()( const NetSharedPtr &inOrigNet,
00249 const NetSharedPtr &outTargetNet,
00250 const ViewSharedPtr &inCurrentView,
00251 const InstanceSharedPtr &inOriginalInstance
00252 ) throw(Error)
00253 try
00254 {
00255 mTargetNet = outTargetNet;
00256 mCurrentView = inCurrentView;
00257 mOriginalInstance = inOriginalInstance;
00258 inOrigNet->accept( *this );
00259 }
00260 catch( Error &e )
00261 {
00262 e.setCurrentLocation(
00263 __FUNCTION__, __FILE__, __LINE__ );
00264 throw;
00265 }
00266
00267 ~PortRefConnectionReplicator() throw() {
00268 }
00269
00270 private:
00271 NetSharedPtr mTargetNet;
00272 ViewSharedPtr mCurrentView;
00273 InstanceSharedPtr mOriginalInstance;
00274 };
00275
00276 void
00277 replicateNetConnections( const NetSharedPtr &inOrigNet,
00278 const ViewSharedPtr &inCurrentView,
00279 const InstanceSharedPtr &inInstance,
00280 const ObjectFactorySharedPtr &inFactory,
00281 const std::string &inInstName,
00282 NetSharedPtr &outClonedNet,
00283 const NetSharedPtr &inTargetNet ) throw(Error)
00284 try
00285 {
00286
00287 std::vector<PortSharedPtr> ports;
00288 inOrigNet->getConnectedPorts( ports, true );
00289 if( ports.empty() )
00290 {
00291 NetSharedPtr targetNet;
00292 if( inTargetNet )
00293 {
00294 targetNet = inTargetNet;
00295 }
00296 else
00297 {
00298 NetSharedPtr clonedNet
00299 = clone( inOrigNet, inFactory );
00300 std::vector<size_t> indices;
00301 if( eCompositionTypeVectorBit
00302 == inInstance->getCompositionType() )
00303 {
00304 indices = IndexFinder<Instance, InstanceArrayMember>()( inInstance);
00305 }
00306 clonedNet->setName( getModifiedName(
00307 inInstName, inOrigNet, indices) );
00308 inCurrentView->addNet( clonedNet );
00309 outClonedNet = clonedNet;
00310 targetNet = clonedNet;
00311 }
00312 PortRefConnectionReplicator()( inOrigNet, targetNet,
00313 inCurrentView, inInstance);
00314 }
00315 else
00316 {
00317 for( std::vector<PortSharedPtr>::iterator port
00318 = ports.begin(); port != ports.end(); ++port )
00319 {
00320 std::vector<std::string> nestedNames;
00321 PortSharedPtr actualPortRef = *port;
00322 PortSharedPtr portRef = actualPortRef;
00323 while( portRef )
00324 {
00325 if( eCompositionTypeVectorBit
00326 != portRef->getCompositionType())
00327 {
00328 nestedNames.push_back(
00329 portRef->getName() );
00330 }
00331 portRef = portRef->getParentCollection();
00332 }
00333 std::string portName = *nestedNames.rbegin();
00334 PortReferenceSharedPtr origPortRef
00335 = inInstance->findPortReference( portName );
00336 if( nestedNames.size() > 1 )
00337 {
00338 findLeafConnectable(
00339 nestedNames, origPortRef );
00340 }
00341 if( eCompositionTypeVectorBit
00342 == actualPortRef->getCompositionType() )
00343 {
00344 origPortRef = origPortRef->get(
00345 IndexFinder<Port,VectorPortBit>()(
00346 actualPortRef ));
00347 }
00348 std::vector<NetSharedPtr> nets;
00349 origPortRef->getConnectedNets( nets );
00350 for( std::vector<NetSharedPtr>::iterator
00351 myNet = nets.begin();
00352 myNet != nets.end(); ++myNet )
00353 {
00354 NetSharedPtr connectedNet = *myNet;
00355 PortRefConnectionReplicator()(
00356 inOrigNet, connectedNet, inCurrentView,
00357 inInstance);
00358 origPortRef->disconnect( connectedNet );
00359 }
00360 }
00361 }
00362 }
00363 catch( Error &e )
00364 {
00365 e.setCurrentLocation(
00366 __FUNCTION__, __FILE__, __LINE__ );
00367 throw;
00368 }
00369
00370 class NetConnectionReplicator
00371 : ScalarNet::Visitor,
00372 VectorNet::Visitor,
00373 VectorNetBit::Visitor,
00374 NetBundle::Visitor {
00375 public:
00376
00377 void
00378 visit( ScalarNet &inScalarNet ) throw(Error)
00379 try
00380 {
00381 replicateNetConnections(
00382 inScalarNet.getSharedThis(), mCurrentView,
00383 mInstance, mFactory, mInstName, mClonedNet,
00384 mTargetNet);
00385 }
00386 catch( Error &e )
00387 {
00388 e.setCurrentLocation(
00389 __FUNCTION__, __FILE__, __LINE__ );
00390 throw;
00391 }
00392 void
00393 visit( VectorNet &inVectorNet ) throw(Error)
00394 try
00395 {
00396 std::vector<NetSharedPtr> children;
00397 inVectorNet.getCreatedChildren( children );
00398 NetSharedPtr targetVector = mClonedNet;
00399 for( std::vector<NetSharedPtr>::iterator it
00400 = children.begin(); it != children.end();
00401 ++it)
00402 {
00403 NetConnectionReplicator()( *it, mCurrentView,
00404 mInstance, mFactory,
00405 mClonedNet, targetVector, mInstName);
00406 }
00407 replicateNetConnections(
00408 inVectorNet.getSharedThis(), mCurrentView,
00409 mInstance, mFactory, mInstName, mClonedNet,
00410 mTargetNet);
00411 }
00412 catch( Error &e )
00413 {
00414 e.setCurrentLocation(
00415 __FUNCTION__, __FILE__, __LINE__ );
00416 throw;
00417 }
00418 void
00419 visit( VectorNetBit &inVectorNetBit ) throw(Error)
00420 try
00421 {
00422 #if 0
00423 replicateNetConnections(
00424 inVectorNetBit.getSharedThis(), mCurrentView,
00425 mInstance, mFactory, mInstName, mClonedNet,
00426 mTargetNet->get(inVectorNetBit.getIndices()));
00427 #endif
00428 NetSharedPtr origNet = inVectorNetBit.getSharedThis();
00429 std::vector<PortSharedPtr> ports;
00430 inVectorNetBit.getConnectedPorts( ports );
00431
00432
00433
00434 ScalarNetSharedPtr newScalarNet;
00435 mFactory->create( newScalarNet );
00436 std::ostringstream sout;
00437 sout<<mInstName<<"_"<<origNet->getName()<<"_";
00438 std::vector<size_t> indices
00439 = IndexFinder<Net, VectorNetBit>()(
00440 origNet );
00441 copy( indices.begin(), indices.end(),
00442 std::ostream_iterator<size_t>( sout, "_"));
00443 newScalarNet->setName( sout.str() );
00444 mCurrentView->addNet( newScalarNet );
00445 PortRefConnectionReplicator()(
00446 origNet, newScalarNet, mCurrentView, mInstance);
00447
00448 for( std::vector<PortSharedPtr>::iterator port
00449 = ports.begin(); port != ports.end(); ++port )
00450 {
00451 std::vector<std::string> nestedNames;
00452 PortSharedPtr actualPort = *port;
00453 PortSharedPtr portRef = actualPort;
00454 while( portRef )
00455 {
00456 if( eCompositionTypeVectorBit
00457 != portRef->getCompositionType())
00458 {
00459 nestedNames.push_back(
00460 portRef->getName() );
00461 }
00462 portRef = portRef->getParentCollection();
00463 }
00464 std::string portName = *nestedNames.rbegin();
00465 PortReferenceSharedPtr origPortRef
00466 = mInstance->findPortReference( portName );
00467 if( nestedNames.size() > 1 )
00468 {
00469 findLeafConnectable(
00470 nestedNames, origPortRef );
00471 }
00472 if( eCompositionTypeVectorBit
00473 == actualPort->getCompositionType() )
00474 {
00475 origPortRef = origPortRef->get(
00476 IndexFinder<Port,VectorPortBit>()(
00477 actualPort ));
00478 }
00479
00480
00481
00482
00483 std::vector<NetSharedPtr> nets;
00484 origPortRef->getConnectedNets( nets );
00485 for( std::vector<NetSharedPtr>::iterator
00486 myNet = nets.begin();
00487 myNet != nets.end(); myNet++ )
00488 {
00489 std::vector<PortSharedPtr> cPorts;
00490 (*myNet)->getConnectedPorts( cPorts );
00491 for( std::vector<PortSharedPtr>::iterator it
00492 = cPorts.begin(); it != cPorts.end();
00493 ++it )
00494 {
00495 (*it)->connect( newScalarNet );
00496 }
00497 std::vector<PortReferenceSharedPtr> cPortReferences;
00498 (*myNet)->getConnectedPortRefs(
00499 cPortReferences );
00500 for( std::vector<PortReferenceSharedPtr>::iterator it
00501 = cPortReferences.begin(); it != cPortReferences.end();
00502 ++it )
00503 {
00504 if( *it == origPortRef )
00505 continue;
00506 (*it)->connect( newScalarNet );
00507 }
00508 if( eCompositionTypeVectorBit == (*myNet)->getCompositionType()
00509 && eCompositionTypeVectorBit == origPortRef->getCompositionType() )
00510 {
00511 std::vector<size_t> netIdx
00512 = IndexFinder<Net, VectorNetBit>()( *myNet );
00513 std::vector<size_t> portIdx
00514 = IndexFinder<PortReference, VectorPortBitReference>()( origPortRef );
00515 }
00516 }
00517 }
00518 }
00519 catch( Error &e )
00520 {
00521 e.setCurrentLocation(
00522 __FUNCTION__, __FILE__, __LINE__ );
00523 throw;
00524 }
00525
00526 void
00527 visit( NetBundle &inNetBundle ) throw(Error)
00528 try
00529 {
00530 replicateNetConnections(
00531 inNetBundle.getSharedThis(), mCurrentView,
00532 mInstance, mFactory, mInstName, mClonedNet,
00533 mTargetNet);
00534 std::vector<NetSharedPtr> children;
00535 inNetBundle.getChildren( children );
00536 std::vector<NetSharedPtr> tChildren;
00537 mClonedNet->getChildren( tChildren );
00538 std::vector<NetSharedPtr>::iterator tNet
00539 = tChildren.begin();
00540 for( std::vector<NetSharedPtr>::iterator it
00541 = children.begin(); it != children.end();
00542 ++it, ++tNet)
00543 {
00544 NetConnectionReplicator()( *it, mCurrentView,
00545 mInstance, mFactory,
00546 mClonedNet, *tNet, mInstName);
00547 }
00548 }
00549 catch( Error &e )
00550 {
00551 e.setCurrentLocation(
00552 __FUNCTION__, __FILE__, __LINE__ );
00553 throw;
00554 }
00555
00556 void
00557 operator ()( const NetSharedPtr &inOrigNet,
00558 const ViewSharedPtr &inCurrentView,
00559 const InstanceSharedPtr &inInstance,
00560 const ObjectFactorySharedPtr &inFactory,
00561 NetSharedPtr &outClonedNet,
00562 NetSharedPtr &inTargetNet,
00563 const std::string &inInstName = std::string() ) throw(Error)
00564 try
00565 {
00566 mCurrentView = inCurrentView;
00567 mInstance = inInstance;
00568 mFactory = inFactory;
00569 mInstName = (inInstName.empty())
00570 ? inInstance->getName()
00571 : inInstName;
00572 mTargetNet = inTargetNet;
00573 inOrigNet->accept( *this );
00574 outClonedNet = mClonedNet;
00575 }
00576 catch( Error &e )
00577 {
00578 e.setCurrentLocation(
00579 __FUNCTION__, __FILE__, __LINE__ );
00580 throw;
00581 }
00582
00583 ~NetConnectionReplicator() throw() {
00584 }
00585
00586 private:
00587 ViewSharedPtr mCurrentView;
00588 InstanceSharedPtr mInstance;
00589 ObjectFactorySharedPtr mFactory;
00590 std::string mInstName;
00591 NetSharedPtr mClonedNet;
00592 NetSharedPtr mTargetNet;
00593 };
00594
00595
00596 bool
00597 addFlattenInstances(const ViewSharedPtr &inParentView,
00598 const InstanceSharedPtr &inInstance,
00599 const ObjectFactorySharedPtr &inFactory,
00600 std::list<InstanceSharedPtr> &outAddedInstances ) throw(Error)
00601 {
00602 std::string name = inInstance->getName();
00603 ViewSharedPtr masterView = inInstance->getMaster();
00604 log( "Flattening instance with name %s\n", name.c_str());
00605
00606 log("Copying instantiations... ");
00607 std::vector<InstanceSharedPtr> childInstances;
00608 masterView->getInstances( childInstances );
00609 if( childInstances.empty() )
00610 {
00611 log("Leaf node.. cannot flatten\n");
00612 return false;
00613 }
00614 std::vector<PortReferenceSharedPtr> portRefs;
00615 inInstance->getPortReferences( portRefs );
00616 std::string flatInstName;
00617 std::vector<size_t> indices;
00618 if( eCompositionTypeVectorBit
00619 == inInstance->getCompositionType() )
00620 {
00621 indices = IndexFinder<Instance, InstanceArrayMember>()( inInstance );
00622 }
00623
00624 for( std::vector<InstanceSharedPtr>::iterator it
00625 = childInstances.begin(); it != childInstances.end();
00626 ++it)
00627 {
00628 InstanceSharedPtr inst = clone( *it, inFactory );
00629 std::string instName;
00630 instName = getModifiedName(name, inst, indices);
00631 log( "Added Instance Name :: %s\n", instName.c_str());
00632 inst->setName( instName );
00633 inParentView->addInstance( inst );
00634 outAddedInstances.push_back( inst );
00635 }
00636 log("Done\n");
00637 return true;
00638 }
00639
00640 void
00641 flattenInstance(const ViewSharedPtr &inParentView,
00642 const InstanceSharedPtr &inInstance,
00643 const ObjectFactorySharedPtr &inFactory,
00644 const std::string &inName = std::string() ) throw(Error)
00645 {
00646 std::string name = (!inName.empty())
00647 ? inName
00648 : inInstance->getName();
00649 ViewSharedPtr masterView = inInstance->getMaster();
00650 std::vector<InstanceSharedPtr> childInstances;
00651 masterView->getInstances( childInstances );
00652 std::vector<PortReferenceSharedPtr> portRefs;
00653 inInstance->getPortReferences( portRefs );
00654
00655
00656
00657 log("Copying internal nets... ");
00658 std::vector<NetSharedPtr> allNets;
00659 masterView->getNets( allNets );
00660 for( std::vector<NetSharedPtr>::iterator it = allNets.begin();
00661 it != allNets.end(); ++it )
00662 {
00663 NetSharedPtr origNet = *it;
00664 NetSharedPtr clonedNet;
00665 NetSharedPtr dummy;
00666 NetConnectionReplicator()(
00667 origNet, inParentView, inInstance,
00668 inFactory, clonedNet, dummy );
00669 }
00670 log("Done\n");
00671 }
00672
00673 bool
00674 flatten_impl( const InstanceSharedPtr &inInstance,
00675 const ObjectFactorySharedPtr &inFactory,
00676 std::list<InstanceSharedPtr> &outAddedInstances ) throw(Error)
00677 {
00678 if( !inInstance )
00679 {
00680
00681 return false;
00682 }
00683 ViewSharedPtr parentView = inInstance->getParent();
00684 if( !parentView
00685 || !parentView->findInstance( inInstance->getName() ))
00686 {
00687
00688 return false;
00689 }
00690 switch( inInstance->getCompositionType() )
00691 {
00692 case eCompositionTypeScalar:
00693 {
00694 try
00695 {
00696 bool added = addFlattenInstances(
00697 parentView, inInstance, inFactory, outAddedInstances );
00698 if( added )
00699 {
00700 flattenInstance(
00701 parentView, inInstance, inFactory );
00702 parentView->removeInstance(
00703 inInstance->getName());
00704 }
00705 else
00706 {
00707 return false;
00708 }
00709 break;
00710 }
00711 catch( Error &e )
00712 {
00713 e.setCurrentLocation(
00714 __FUNCTION__, __FILE__, __LINE__ );
00715 throw;
00716 }
00717
00718 }
00719 case eCompositionTypeVector:
00720 {
00721 try
00722 {
00723 std::vector<InstanceSharedPtr> children;
00724 inInstance->getChildren( children );
00725 bool added = false;
00726 for( std::vector<InstanceSharedPtr>::iterator it
00727 = children.begin(); it != children.end(); ++it )
00728 {
00729 added = addFlattenInstances(
00730 parentView, (*it), inFactory, outAddedInstances );
00731 if( !added )
00732 {
00733 break;
00734 }
00735 }
00736 if( added )
00737 {
00738 for( std::vector<InstanceSharedPtr>::iterator it
00739 = children.begin(); it != children.end(); ++it )
00740 {
00741 flattenInstance(
00742 parentView, (*it), inFactory );
00743 }
00744 parentView->removeInstance(
00745 inInstance->getName());
00746 }
00747 else
00748 {
00749 return false;
00750 }
00751 }
00752 catch( Error &e )
00753 {
00754 e.setCurrentLocation(
00755 __FUNCTION__, __FILE__, __LINE__ );
00756 throw;
00757 }
00758 break;
00759 }
00760 default:
00761 {
00762 throw Error( eMessageIdErrorUnsupoortedOperation,
00763 __FUNCTION__, __FILE__, __LINE__ );
00764 }
00765 }
00766 return true;
00767 }
00768
00769 }
00770
00771 namespace torc {
00772 namespace generic {
00773
00774 void
00775 flatten( const InstanceSharedPtr &inInstance,
00776 const ObjectFactorySharedPtr &inFactory) throw(Error) {
00777 std::list<InstanceSharedPtr> dummy;
00778 flatten_impl( inInstance, inFactory, dummy );
00779 return;
00780 }
00781
00782 void
00783 flatten_hierarchy( const InstanceSharedPtr &inInstance,
00784 const ObjectFactorySharedPtr &inFactory) throw(Error) {
00785 std::list<InstanceSharedPtr> newInstances;
00786 if( !flatten_impl( inInstance, inFactory, newInstances ) )
00787 {
00788 return;
00789 }
00790 while( !newInstances.empty() )
00791 {
00792 std::list<InstanceSharedPtr>::iterator top = newInstances.begin();
00793 InstanceSharedPtr inst = *top;
00794 newInstances.erase( top );
00795 flatten_impl( inst, inFactory, newInstances );
00796 }
00797 }
00798
00799 }
00800 }