--- /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