1 /* 2 Copyright (c) 2008-2009 NetAllied Systems GmbH 3 4 This file is part of COLLADASaxFrameworkLoader. 5 6 Licensed under the MIT Open Source License, 7 for details please see LICENSE file or the website 8 http://www.opensource.org/licenses/mit-license.php 9 */ 10 11 #include "COLLADASaxFWLStableHeaders.h" 12 #include "COLLADASaxFWLSidTreeNode.h" 13 14 #include <iostream> 15 16 namespace COLLADASaxFWL 17 { 18 19 20 //------------------------------ operator <(const SidIdentifier & rhs) const21 bool SidTreeNode::SidIdentifier::operator<( const SidIdentifier& rhs ) const 22 { 23 if ( sid < rhs.sid) 24 return true; 25 26 if ( sid > rhs.sid) 27 return false; 28 29 if ( hierarchyLevel < rhs.hierarchyLevel) 30 return true; 31 32 if ( hierarchyLevel > rhs.hierarchyLevel) 33 return false; 34 35 return false; 36 } 37 38 //------------------------------ SidTreeNode(const String & sid,SidTreeNode * parent)39 SidTreeNode::SidTreeNode(const String& sid, SidTreeNode *parent) 40 : mParent(parent) 41 , mTargetType(TARGETTYPECLASS_UNKNOWN) 42 , mSid(sid) 43 { 44 mTarget.object = 0; 45 } 46 47 //------------------------------ ~SidTreeNode()48 SidTreeNode::~SidTreeNode() 49 { 50 for ( size_t i = 0, count = mDirectChildren.size(); i < count; ++i) 51 { 52 const SidTreeNode*const& sidTreeNode = mDirectChildren[i]; 53 delete sidTreeNode; 54 } 55 } 56 57 //------------------------------ createAndAddChild(const String & sid)58 SidTreeNode* SidTreeNode::createAndAddChild( const String& sid ) 59 { 60 SidTreeNode* newChild = new SidTreeNode(sid, this); 61 mDirectChildren.push_back(newChild); 62 if ( !sid.empty() ) 63 { 64 SidIdentifier newIdentifier(newChild->getSid(), 0); 65 mChildren.insert(std::make_pair(newIdentifier, newChild)); 66 addChildToParents( newChild, newIdentifier ); 67 } 68 return newChild; 69 } 70 71 //------------------------------ addChildToParents(SidTreeNode * sidTreeNode,const SidIdentifier & sidIdentifier)72 void SidTreeNode::addChildToParents( SidTreeNode *sidTreeNode, const SidIdentifier& sidIdentifier ) 73 { 74 if ( sidTreeNode ) 75 { 76 SidTreeNode *parent = getParent(); 77 if ( parent ) 78 { 79 SidIdentifier parentSidIdentifier = sidIdentifier; 80 // if the parent has no sid, i.e. it has an id, we don't increase the hierarchy level.*/ 81 if ( !parent->getSid().empty() ) 82 { 83 parentSidIdentifier.hierarchyLevel++; 84 } 85 parent->mChildren.insert(std::make_pair(parentSidIdentifier, sidTreeNode)); 86 parent->addChildToParents( sidTreeNode, parentSidIdentifier ); 87 } 88 } 89 } 90 91 //------------------------------ findChildBySid(const String & sid)92 SidTreeNode* SidTreeNode::findChildBySid( const String& sid ) 93 { 94 SidIdentifier lowerBound( sid, 0); 95 SidIdentifierSidTreeNodeMap::iterator it = mChildren.lower_bound( lowerBound ); 96 97 if ( it == mChildren.end() ) 98 return 0; 99 100 SidIdentifier canidate = it->first; 101 if ( canidate.sid == sid ) 102 { 103 return it->second; 104 } 105 else 106 { 107 return 0; 108 } 109 } 110 111 } // namespace COLLADASaxFWL 112