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