From: Andrew K. <aja...@us...> - 2005-11-14 19:47:03
|
Update of /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/BaseTestImpl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10412/BaseTestImpl Modified Files: RefResolver.h ResolveRefVisitor.h ResolveRefVisitor.cpp AcyclicVisitor.cpp Log Message: Fixed some errors and added functionality in the base structure. Made tests more efficient. Replaced use of AxIterators with Visitors where possible. Index: AcyclicVisitor.cpp =================================================================== RCS file: /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/BaseTestImpl/AcyclicVisitor.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** AcyclicVisitor.cpp 2 Nov 2005 20:55:38 -0000 1.5 --- AcyclicVisitor.cpp 14 Nov 2005 19:46:50 -0000 1.6 *************** *** 79,84 **** --- 79,95 ---- if ( _Set.insert(lid).second ) { + + //The node was properly inserted into the set, therefore, there a cycle has + //not yet been detected. If this node has already been visited, that means + //that there are no cycles down this sub-branch, so the node can be removed + //from the set and the traversal of this sub-branch can be halted. + if ( this->HaveVisited( lid ) ) + { + _Set.erase( lid ); + } + //add node into the vector since it was visited on this sub-branch's traversal _Vector.push_back(lid); + this->RecordVisit( lid ); return true; } Index: ResolveRefVisitor.h =================================================================== RCS file: /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/BaseTestImpl/ResolveRefVisitor.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ResolveRefVisitor.h 18 Oct 2005 17:02:42 -0000 1.3 --- ResolveRefVisitor.h 14 Nov 2005 19:46:50 -0000 1.4 *************** *** 41,45 **** virtual bool PostOrderVisit(AAFTypedObjNode<IAAFSourceClip>& node); ! shared_ptr<const DetailLevelTestResult> GetTestResult() const; --- 41,45 ---- virtual bool PostOrderVisit(AAFTypedObjNode<IAAFSourceClip>& node); ! shared_ptr<const DetailLevelTestResult> GetTestResult() const; Index: RefResolver.h =================================================================== RCS file: /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/BaseTestImpl/RefResolver.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** RefResolver.h 18 Oct 2005 17:02:42 -0000 1.8 --- RefResolver.h 14 Nov 2005 19:46:50 -0000 1.9 *************** *** 35,38 **** --- 35,39 ---- class TestLevelTestResult; class TestGraph; + class AxClassDef; class RefResolver : public Test Index: ResolveRefVisitor.cpp =================================================================== RCS file: /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/BaseTestImpl/ResolveRefVisitor.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ResolveRefVisitor.cpp 2 Nov 2005 20:55:38 -0000 1.5 --- ResolveRefVisitor.cpp 14 Nov 2005 19:46:50 -0000 1.6 *************** *** 33,50 **** #include <AAFMobReference.h> #include <AAFSlotReference.h> #include <MobNodeMap.h> //Analyzer Base files #include <EdgeMap.h> //Ax files #include <AxMobSlot.h> #include <AxComponent.h> - #include <AAFResult.h> #include <AxUtil.h> namespace { using namespace aafanalyzer; } // end of namespace --- 33,194 ---- #include <AAFMobReference.h> #include <AAFSlotReference.h> + #include <AAFComponentReference.h> #include <MobNodeMap.h> //Analyzer Base files #include <EdgeMap.h> + #include <DepthFirstTraversal.h> //Ax files #include <AxMobSlot.h> #include <AxComponent.h> #include <AxUtil.h> + //AAF files + #include <AAFResult.h> + + //STL files + #include <set> + namespace { using namespace aafanalyzer; + using namespace boost; + using namespace std; + + class ResolveSlotRefVisitor : public TypedVisitor + { + public: + + ResolveSlotRefVisitor(wostream& os, aafSlotID_t slotId) + : _os(os), + _slotId( slotId ) + {} + + virtual ~ResolveSlotRefVisitor() + {} + + //Note: We cannot do a node cast in this situation since we need the node + // of the correct type to create an edge. + virtual bool PreOrderVisit(AAFTypedObjNode<IAAFTimelineMobSlot>& node) + { + AxTimelineMobSlot axMobSlot( node.GetAAFObjectOfType() ); + aafSlotID_t slotId = axMobSlot.GetSlotID(); + + if ( slotId == _slotId ) + { + _spMobSlot = node.GetSharedPointerToNode(); + //The node was found, there is no need to traverse further. + return false; + } + + return true; + } + + virtual bool PreOrderVisit(AAFTypedObjNode<IAAFStaticMobSlot>& node) + { + AxStaticMobSlot axMobSlot( node.GetAAFObjectOfType() ); + aafSlotID_t slotId = axMobSlot.GetSlotID(); + + if ( slotId == _slotId ) + { + _spMobSlot = node.GetSharedPointerToNode(); + //The node was found, there is no need to traverse further. + return false; + } + + return true; + } + + virtual bool PreOrderVisit(AAFTypedObjNode<IAAFEventMobSlot>& node) + { + AxEventMobSlot axMobSlot( node.GetAAFObjectOfType() ); + aafSlotID_t slotId = axMobSlot.GetSlotID(); + + if ( slotId == _slotId ) + { + _spMobSlot = node.GetSharedPointerToNode(); + //The node was found, there is no need to traverse further. + return false; + } + + return true; + } + + virtual bool PreOrderVisit(AAFTypedObjNode<IAAFMobSlot>& node) + { + AxMobSlot axMobSlot( node.GetAAFObjectOfType() ); + aafSlotID_t slotId = axMobSlot.GetSlotID(); + + if ( slotId == _slotId ) + { + _spMobSlot = node.GetSharedPointerToNode(); + //The node was found, there is no need to traverse further. + return false; + } + + return true; + } + + virtual bool EdgeVisit(AAFContainment& edge) + { + //Don't continue the traversal if the mob slot has been found. + return !_spMobSlot; + } + + shared_ptr<Node> GetMobSlot() const + { + return _spMobSlot; + } + + private: + wostream& _os; + aafSlotID_t _slotId; + shared_ptr<Node> _spMobSlot; + + // prohibited + ResolveSlotRefVisitor(); + ResolveSlotRefVisitor( const ResolveSlotRefVisitor& ); + ResolveSlotRefVisitor& operator=( const ResolveSlotRefVisitor& ); + }; + + class ResolveComponentRefVisitor : public TypedVisitor + { + public: + + typedef set<shared_ptr<Node> > NodeSet; + typedef shared_ptr<NodeSet> NodeSetSP; + + ResolveComponentRefVisitor(wostream& os) + : _os(os), + _spNodes( new NodeSet ) + {} + + virtual ~ResolveComponentRefVisitor() + {} + + virtual bool PreOrderVisit(AAFTypedObjNode<IAAFSourceClip>& node) + { + //Add the source clip to the set of source clips. + _spNodes->insert( node.GetSharedPointerToNode() ); + + //We have reached the source clip, there is no need to traverse any further. + return false; + } + + NodeSetSP GetReferencedNodes() const + { + return _spNodes; + } + + private: + wostream& _os; + NodeSetSP _spNodes; + + // prohibited + ResolveComponentRefVisitor(); + ResolveComponentRefVisitor( const ResolveComponentRefVisitor& ); + ResolveComponentRefVisitor& operator=( const ResolveComponentRefVisitor& ); + }; } // end of namespace *************** *** 112,141 **** shared_ptr<AAFMobReference> spMobRefEdge(new AAFMobReference(spSrcClp, spNode)); _spEdgeMap->AddEdge(spMobRefEdge); ! //now create a Slot Edge from the source clip to the mobslot and add to Edgemap ! shared_ptr<AAFTypedObjNode<IAAFTimelineMobSlot> > spMobSlotNode; ! EdgeMap::ConstEdgeVectorSP mobChildren = _spEdgeMap->GetChildren(spNode); ! for(unsigned int i = 0; i < mobChildren->size(); i++) { ! spMobSlotNode = dynamic_pointer_cast<AAFTypedObjNode<IAAFTimelineMobSlot> >(mobChildren->at(i)->GetChildNode()); ! ! if(spMobSlotNode) ! { ! AxTimelineMobSlot axMobSlot(spMobSlotNode->GetAAFObjectOfType()); ! aafSlotID_t slotid = srcRef.sourceSlotID; ! ! if(axMobSlot.GetSlotID() == slotid) ! { ! shared_ptr<AAFSlotReference> spSlotEdge(new AAFSlotReference(spSrcClp, spMobSlotNode)); ! _spEdgeMap->AddEdge(spSlotEdge); ! } ! } } - - //TODO: The next level of reference detail is to create the - //edges from the source clip to components ultimately - //references. The may be multiple referenced components in - //the event that the source clips points to a sequence. - } } --- 256,287 ---- shared_ptr<AAFMobReference> spMobRefEdge(new AAFMobReference(spSrcClp, spNode)); _spEdgeMap->AddEdge(spMobRefEdge); ! //now create a Slot Edge from the source clip to the mobslot and add to Edgemap ! shared_ptr<ResolveSlotRefVisitor> spSlotVisitor( new ResolveSlotRefVisitor( _os, srcRef.sourceSlotID ) ); ! DepthFirstTraversal slotDFT( _spEdgeMap, spNode ); ! slotDFT.TraverseDown( spSlotVisitor ); ! shared_ptr<Node> spMobSlotNode = spSlotVisitor->GetMobSlot(); ! ! if ( spMobSlotNode ) { ! shared_ptr<AAFSlotReference> spSlotEdge( new AAFSlotReference(spSrcClp, spMobSlotNode) ); ! _spEdgeMap->AddEdge( spSlotEdge ); ! ! //Now make a reference from the source clip to all source clips ! //referenced from this mob slot. ! shared_ptr<ResolveComponentRefVisitor> spCompVisitor( new ResolveComponentRefVisitor( _os ) ); ! DepthFirstTraversal dfs( _spEdgeMap, spMobSlotNode ); ! dfs.TraverseDown( spCompVisitor ); ! ResolveComponentRefVisitor::NodeSetSP spNodes = spCompVisitor->GetReferencedNodes(); ! ! ResolveComponentRefVisitor::NodeSet::const_iterator iter; ! ! for ( iter = spNodes->begin(); iter != spNodes->end(); iter++ ) ! { ! shared_ptr<AAFComponentReference> spCompEdge( new AAFComponentReference(spSrcClp, *iter) ); ! _spEdgeMap->AddEdge( spCompEdge ); ! } ! } } } |