mulwidgets/muldatamodel/src/muldatapath.cpp
branchRCL_3
changeset 26 0e9bb658ef58
parent 0 e83bab7cf002
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mulwidgets/muldatamodel/src/muldatapath.cpp	Wed Sep 01 12:23:18 2010 +0100
@@ -0,0 +1,272 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Header for MulDataPath
+*
+*/
+
+
+#include <mul/muldatapath.h>
+
+#include <vector>
+#include <osn/osnnew.h>
+#include <osn/ustring.h>
+#include <algorithm> //for equal algorithm
+
+namespace Alf
+    {
+    
+class MulDataPathImpl
+	{
+	
+public:
+
+     MulDataPathImpl():mIndex(-1)
+         {
+         }
+     
+	~MulDataPathImpl()
+		{
+		mPath.clear();
+		}
+	
+public:
+	std::vector<int> mPath; //store index of node for each depth
+	int mIndex;
+	};
+
+// ---------------------------------------------------------------------------
+// MulDataPath
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT MulDataPath::MulDataPath()
+	{
+	}
+
+// ---------------------------------------------------------------------------
+// MulDataPath
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT MulDataPath::MulDataPath( int aIndexForDepth1 )
+	{
+	Append( aIndexForDepth1 );
+	}
+
+// ---------------------------------------------------------------------------
+// MulDataPath
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT MulDataPath::MulDataPath( int aIndexForDepth1, int aIndexForDepth2)
+	{
+	Append( aIndexForDepth1 );
+	Append( aIndexForDepth2 );
+	}
+
+// ---------------------------------------------------------------------------
+// MulDataPath
+// ---------------------------------------------------------------------------
+//	
+OSN_EXPORT MulDataPath::MulDataPath( const MulDataPath& aPath )
+	{
+	if(aPath.mData.get())
+		{
+		SetIndex( aPath.Index() );
+		for( int i = 0 ; i < aPath.Depth() ; ++i )
+			{
+			Append( aPath[i] );
+			}
+		}
+	}
+	
+// ---------------------------------------------------------------------------
+// ~MulDataPath
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT MulDataPath::~MulDataPath()
+	{
+	if( mData.get() )
+		{
+		mData->mPath.clear();
+		}
+	}
+	
+// ---------------------------------------------------------------------------
+// Append
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT void MulDataPath::Append(int aIndex)
+	{
+	if( !mData.get() )
+		{
+		mData.reset( new (EMM) MulDataPathImpl() );
+		}
+	mData->mPath.push_back(aIndex);
+	}
+
+// ---------------------------------------------------------------------------
+// Depth
+// ---------------------------------------------------------------------------
+//
+OSN_EXPORT int MulDataPath::Depth() const
+	{
+	if( mData.get() )
+		{
+		return 	mData->mPath.size();
+		}
+	else
+		{
+		return -1;
+		}
+	}
+	
+// ---------------------------------------------------------------------------
+// operator[]
+// ---------------------------------------------------------------------------
+//	
+OSN_EXPORT int MulDataPath::operator[]( int aDepth ) const
+	{
+	if( mData.get() )
+		{
+		return 	(mData->mPath)[aDepth];
+		}
+	else
+		{
+		return -1;
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// operator[]
+// ---------------------------------------------------------------------------
+//
+bool MulDataPath::operator< ( MulDataPath& aPath)
+	{
+	bool result(false);
+	
+    //i dont wanted to add Index to original path because it is not part of path
+    //but index is quite necessary for comparition so creating temp vector 
+	//and copying path to temp vector and also appending index to path
+	std::vector<int> v1 = mData->mPath;
+	v1.push_back(Index());
+	
+	std::vector<int> v2 = aPath.mData->mPath;
+	v2.push_back(aPath.Index());
+	
+	result = lexicographical_compare(v1.begin(),v1.end(),v2.begin(),v2.end());
+	
+	return result;
+	}
+
+// ---------------------------------------------------------------------------
+// Index
+// ---------------------------------------------------------------------------
+//
+int MulDataPath::Index() const
+	{
+	if(mData.get())
+		{
+		return mData->mIndex;
+		}
+	return -1;
+	}
+
+// ---------------------------------------------------------------------------
+// SetIndex
+// ---------------------------------------------------------------------------
+//
+void MulDataPath::SetIndex(int aIndex)
+	{
+	if( !mData.get() )
+		{
+		mData.reset( new (EMM) MulDataPathImpl() );
+		}
+	mData->mIndex = aIndex;
+	}
+
+// ---------------------------------------------------------------------------
+// IsEqual
+// ---------------------------------------------------------------------------
+//
+bool MulDataPath::IsEqual( const MulDataPath& aPath ) 
+	{
+	if( (*this) == aPath )
+		{
+		if( Depth() == -1 && aPath.Depth() == -1 )
+			{
+			return true;
+			}
+		else
+			{
+			return Index() == aPath.Index();
+			}
+		}
+	else
+		{
+		return false;
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// Operator ==
+// ---------------------------------------------------------------------------
+//
+bool MulDataPath::operator == ( const MulDataPath& aPath) 
+	{
+	#ifdef _DEBUG
+	int depth1 = Depth();
+	int depth2 = aPath.Depth();
+	#endif
+	
+	//if depth is -1 , it mean that it points to root node
+	if( Depth() == -1 && aPath.Depth() == -1 )
+		{
+		return true;
+		}
+	else if((Depth() == -1 && aPath.Depth() == 0 ) || (Depth() == 0 && aPath.Depth() == -1 ))
+		{
+		return true;	
+		}
+	else if( Depth() != aPath.Depth() )
+		{
+		return false;
+		}
+	else
+		{
+		return equal( mData->mPath.begin(), mData->mPath.end(), aPath.mData->mPath.begin());
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// Operator =
+// ---------------------------------------------------------------------------
+//
+void MulDataPath::operator= ( MulDataPath aPath )	
+	{
+	if( aPath.mData.get() )	
+		{
+		if( mData.get() )
+			{
+			mData->mPath.clear();		
+			}
+		
+		SetIndex( aPath.Index() );
+		for( int i = 0 ; i < aPath.Depth() ; ++i )
+			{
+			Append( aPath[i] );
+			}		
+		}
+	}
+	
+	} //namespace Alf
+
+//End of file