persistentstorage/store/UBTREE/UB_KEY.CPP
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/store/UBTREE/UB_KEY.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,225 @@
+// Copyright (c) 2003-2009 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:
+//
+
+#include "UB_STD.H"
+
+typedef union
+	{
+	const TAny* tany;
+	const TInt8* tint8;
+	const TInt16* tint16;
+	const TInt32* tint32;
+	const TInt64* tint64;
+	const TUint8* tuint8;
+	const TUint16* tuint16;
+	const TUint32* tuint32;
+	} UPTR;
+
+EXPORT_C const TAny* MBtreeKey::Key(const TAny* anEntry) const
+/** Gets the key value for an entry.
+
+@param anEntry Object for which to get the key value
+@return Pointer to the key value */
+	{
+	return anEntry;
+	}
+
+EXPORT_C TBtreeKey::TBtreeKey(TInt aLength)
+//
+// Discriminating key. Does a raw memory comparison on given length
+//
+	: iKeyOffset(0),iCmpType(ECmpNormal8),iKeyLength(aLength)
+	{}
+
+EXPORT_C TBtreeKey::TBtreeKey()
+//
+// Discriminating key. Does a raw memory comparison on variable length (byte counted)
+//
+	: iKeyOffset(0),iCmpType(ECmpCollated16+1+ECmpNormal8)
+	{}
+
+EXPORT_C TBtreeKey::TBtreeKey(TInt anOffset,TKeyCmpText aType)
+//
+// Used to specify a variable length text key, the first character is a count of the actual character data that follows
+//
+	: iKeyOffset(anOffset),iCmpType(ECmpCollated16+aType+1)
+	{
+	switch (aType)
+		{
+	case ECmpNormal:
+	case ECmpFolded:
+	case ECmpCollated:
+		Panic(EInvalidKeyComparison);
+	default:
+		break;
+		}
+	}
+
+EXPORT_C TBtreeKey::TBtreeKey(TInt anOffset,TKeyCmpText aType,TInt aLength)
+//
+// Used for fixed length charecter data. the length is the character count, not the byte size
+//
+	: iKeyOffset(anOffset),iCmpType(aType),iKeyLength(aLength)
+	{
+	switch (aType)
+		{
+	case ECmpNormal:
+	case ECmpFolded:
+	case ECmpCollated:
+		Panic(EInvalidKeyComparison);
+	default:
+		break;
+		}
+	}
+
+EXPORT_C TBtreeKey::TBtreeKey(TInt anOffset,TKeyCmpNumeric aType)
+	: iKeyOffset(anOffset),iCmpType(aType)
+	{
+	switch (aType)
+		{
+	case ECmpTInt:
+	case ECmpTUint:
+		Panic(EInvalidKeyComparison);
+	default:
+		break;
+		}
+	}
+
+EXPORT_C const TAny* TBtreeKey::Key(const TAny* anEntry) const
+	{
+	return PtrAdd(anEntry,iKeyOffset);
+	}
+
+EXPORT_C TInt TBtreeKey::Compare(const TAny* aLeft,const TAny* aRight) const
+//
+// do the right thing
+//
+	{
+	UPTR left;
+	left.tany=aLeft;
+	UPTR right;
+	right.tany=aRight;
+	switch (iCmpType)
+		{
+	case ECmpNormal8:
+		return Mem::Compare(left.tuint8,iKeyLength,right.tuint8,iKeyLength);
+	case ECmpFolded8:
+		return Mem::CompareF(left.tuint8,iKeyLength,right.tuint8,iKeyLength);
+	case ECmpCollated8:
+		return Mem::CompareC(left.tuint8,iKeyLength,right.tuint8,iKeyLength);
+	case ECmpNormal16:
+		return Mem::Compare(left.tuint16,iKeyLength,right.tuint16,iKeyLength);
+	case ECmpFolded16:
+		return Mem::CompareF(left.tuint16,iKeyLength,right.tuint16,iKeyLength);
+	case ECmpCollated16:
+		return Mem::CompareC(left.tuint16,iKeyLength,right.tuint16,iKeyLength);
+	case ECmpCollated16+ECmpNormal8+1:
+		return Mem::Compare(left.tuint8+1,*left.tuint8,right.tuint8+1,*right.tuint8);
+	case ECmpCollated16+ECmpFolded8+1:
+		return Mem::CompareF(left.tuint8+1,*left.tuint8,right.tuint8+1,*right.tuint8);
+	case ECmpCollated16+ECmpCollated8+1:
+		return Mem::CompareC(left.tuint8+1,*left.tuint8,right.tuint8+1,*right.tuint8);
+	case ECmpCollated16+ECmpNormal16+1:
+		return Mem::Compare(left.tuint16+1,*left.tuint16,right.tuint16+1,*right.tuint16);
+	case ECmpCollated16+ECmpFolded16+1:
+		return Mem::CompareF(left.tuint16+1,*left.tuint16,right.tuint16+1,*right.tuint16);
+	case ECmpCollated16+ECmpCollated16+1:
+		return Mem::CompareC(left.tuint16+1,*left.tuint16,right.tuint16+1,*right.tuint16);
+	case ECmpTInt8:
+		return *left.tint8-*right.tint8;
+	case ECmpTUint8:
+		return TInt(*left.tuint8)-TInt(*right.tuint8);
+	case ECmpTInt16:
+		return *left.tint16-*right.tint16;
+	case ECmpTUint16:
+		return TInt(*left.tuint16)-TInt(*right.tuint16);
+	case ECmpTInt32:
+		if (*left.tint32<*right.tint32) 
+			return -1;
+		if (*left.tint32>*right.tint32) 
+			return 1;
+		break;	   
+	case ECmpTUint32:
+		if (*left.tuint32<*right.tuint32)
+			return -1;
+		if (*left.tuint32>*right.tuint32)
+			return 1;
+		break;
+	case ECmpTInt64:
+		if (*left.tint64<*right.tint64) 
+			return -1;
+		if (*left.tint64>*right.tint64) 
+			return 1;
+		break;	   
+	default:
+		break;
+		}
+	return 0;
+	}
+
+EXPORT_C void TBtreeKey::Between(const TAny* aLeft,const TAny*  /*aRight*/,TBtreePivot& aPivot) const
+	{
+//#pragma message( __FILE__ " : 'TBtreeKey::Between()' whizzy pivot generation not implemented" )
+	UPTR left;
+	left.tany=aLeft;
+//	UPTR right=(UPTR)aRight;
+	switch (iCmpType)
+		{
+	case ECmpNormal8:
+	case ECmpFolded8:
+	case ECmpCollated8:
+		aPivot.Copy(left.tuint8,iKeyLength);
+		break;
+	case ECmpNormal16:
+	case ECmpFolded16:
+	case ECmpCollated16:
+		aPivot.Copy(left.tuint8,iKeyLength<<1);
+		break;
+	case ECmpCollated16+ECmpNormal8+1:
+	case ECmpCollated16+ECmpFolded8+1:
+	case ECmpCollated16+ECmpCollated8+1:
+		aPivot.Copy(left.tuint8,1+*left.tuint8);	// include length count
+		break;
+	case ECmpCollated16+ECmpNormal16+1:
+	case ECmpCollated16+ECmpFolded16+1:
+	case ECmpCollated16+ECmpCollated16+1:
+		aPivot.Copy(left.tuint8,(1+*left.tuint16)<<1);	// include length count
+		break;
+	case ECmpTInt8:
+		aPivot.Copy(left.tuint8,sizeof(TInt8));
+		break;
+	case ECmpTUint8:
+		aPivot.Copy(left.tuint8,sizeof(TUint8));
+		break;
+	case ECmpTInt16:
+		aPivot.Copy(left.tuint8,sizeof(TInt16));
+		break;
+	case ECmpTUint16:
+		aPivot.Copy(left.tuint8,sizeof(TUint16));
+		break;
+	case ECmpTInt32:
+		aPivot.Copy(left.tuint8,sizeof(TInt16));
+		break;
+	case ECmpTUint32:
+		aPivot.Copy(left.tuint8,sizeof(TUint32));
+		break;
+	case ECmpTInt64:
+		aPivot.Copy(left.tuint8,sizeof(TInt64));
+		break;
+	default:
+		break;
+		}
+	}
+