diff -r 000000000000 -r 08ec8eefde2f persistentstorage/store/UBTREE/UB_KEY.CPP --- /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; + } + } +