mulwidgets/muldatamodel/src/muldatapath.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:18 +0100
branchRCL_3
changeset 26 0e9bb658ef58
parent 0 e83bab7cf002
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

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