diff -r b73a2e62868f -r 6752808b2036 metadataengine/client/src/mdeobjectdef.cpp --- a/metadataengine/client/src/mdeobjectdef.cpp Tue Feb 02 00:24:33 2010 +0200 +++ b/metadataengine/client/src/mdeobjectdef.cpp Fri Feb 19 23:14:48 2010 +0200 @@ -59,8 +59,9 @@ { aSchemaBuffer.PositionL( propertyOffset + i * sizeof(TMdCPropertyDef) ); const TMdCPropertyDef& propertyDef = TMdCPropertyDef::GetFromBufferL(aSchemaBuffer); - CMdEPropertyDef* propertyDefImpl = CMdEPropertyDef::NewL( propertyDef, aSchemaBuffer, *this ); - iPropertyDefs.InsertInOrder( propertyDefImpl, TLinearOrder(CMdEObjectDef::CompareProperties) ); + + CMdEPropertyDef* defImpl = CMdEPropertyDef::NewL( propertyDef, aSchemaBuffer, *this ); + iPropertyDefs.InsertInOrder(defImpl, TLinearOrder(CMdEObjectDef::CompareProperties)); } } @@ -157,11 +158,48 @@ CMdEPropertyDef* CMdEObjectDef::GetPropertyDefL(TDefId aId, CMdEObjectDef* aChild) { - const TInt i = iPropertyDefs.FindInOrder(aId, CMdEObjectDef::CompareProperties ); + const TInt count = iPropertyDefs.Count(); + + TInt low( 0 ); + TInt high( count ); + TBool linearSearchRequired( EFalse ); - if (i >= 0 && i < iPropertyDefs.Count() && iPropertyDefs[i] ) + while( low < high ) { - return iPropertyDefs[i]; + TInt mid( (low+high)>>1 ); + + if( !iPropertyDefs[mid] ) + { + linearSearchRequired = ETrue; + break; + } + + TInt compare( aId - iPropertyDefs[mid]->Id() ); + if( compare == 0 ) + { + return iPropertyDefs[mid]; + } + else if( compare > 0 ) + { + low = mid + 1; + } + else + { + high = mid; + } + } + + if( linearSearchRequired ) + { + for ( TInt i = 0; i < count; ++i ) + { + CMdEPropertyDef* propDef = iPropertyDefs[i]; + + if( propDef && propDef->Id() == aId ) + { + return propDef; + } + } } CMdEObjectDef* parent = ParentL(); @@ -189,13 +227,8 @@ return iPropertyDefs[aIndex]; } -TInt CMdEObjectDef::CompareProperties( const CMdEPropertyDef& aFirst, const CMdEPropertyDef& aSecond ) +TInt CMdEObjectDef::CompareProperties(const CMdEPropertyDef& aFirst, const CMdEPropertyDef& aSecond) { return aFirst.Id() - aSecond.Id(); } -TInt CMdEObjectDef::CompareProperties( const TDefId* aFirst, const CMdEPropertyDef& aSecond ) - { - return *aFirst - aSecond.Id(); - } -