sl@0: // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: sl@0: #include "bm_suite.h" sl@0: sl@0: static const TInt32 KUidPropBenchmarkCategoryValue = 0x101f75b7; sl@0: static const TUid KPropBenchmarkCategory = { KUidPropBenchmarkCategoryValue }; sl@0: static _LIT_SECURITY_POLICY_PASS(KPassPolicy); sl@0: sl@0: typedef void (*MeasurementFunc)(TBMResult*, TBMUInt64 aIter, struct Measurement*); sl@0: enum TSetGetType sl@0: { sl@0: EOneArg, sl@0: EThreeArgsInt, sl@0: EThreeArgsBuf8, sl@0: EThreeArgsBuf16 sl@0: }; sl@0: sl@0: struct Measurement sl@0: { sl@0: MeasurementFunc iFunc; sl@0: TPtrC iName; sl@0: TBool iRemote; sl@0: RProperty::TType iType; sl@0: TInt iSize; sl@0: TSetGetType iSetGetType; sl@0: sl@0: Measurement(MeasurementFunc aFunc, const TDesC& aName, sl@0: RProperty::TType aType, TInt aSize, TBool aRemote = EFalse, sl@0: TSetGetType aSetGetType = EOneArg) : sl@0: iFunc(aFunc), iName(aName), iRemote(aRemote), iType(aType), iSize(aSize), sl@0: iSetGetType(aSetGetType) {} sl@0: }; sl@0: sl@0: class Property : public BMProgram sl@0: { sl@0: public : sl@0: Property() : BMProgram(_L("Properties")) sl@0: {} sl@0: virtual TBMResult* Run(TBMUInt64 aIter, TInt* aCount); sl@0: sl@0: sl@0: static TBMResult iResults[]; sl@0: static Measurement iMeasurements[]; sl@0: sl@0: static void NotificationLatencyParent(TBMResult* aResult, TBMUInt64 aIter, Measurement*); sl@0: static TInt NotificationLatencyChild(TAny*); sl@0: sl@0: static void SetOverhead(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM); sl@0: static void GetOverhead(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM); sl@0: sl@0: sl@0: private: sl@0: static TBuf8 iInBuf; sl@0: static TBuf8 iOutBuf; sl@0: static TBuf16 iInBuf16; sl@0: static TBuf16 iOutBuf16; sl@0: }; sl@0: sl@0: Measurement Property::iMeasurements[] = sl@0: { sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local Int Notification Latency "), sl@0: RProperty::EInt, 0, EFalse), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote Int Notification Latency"), sl@0: RProperty::EInt, 0,ETrue), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local Byte(1) Notification Latency"), sl@0: RProperty::EByteArray, 1, EFalse), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(1) Notification Latency"), sl@0: RProperty::EByteArray, 1, ETrue), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local Byte(8) Notification Latency"), sl@0: RProperty::EByteArray, 8, EFalse), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(8) Notification Latency"), sl@0: RProperty::EByteArray, 8,ETrue), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local Byte(512) Notification Latency"), sl@0: RProperty::EByteArray, 512, EFalse), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(512) Notification Latency"), sl@0: RProperty::EByteArray, 512,ETrue), sl@0: sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local Int Notification Latency ThreeArgsInt"), sl@0: RProperty::EInt, 0, EFalse, EThreeArgsInt), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote Int Notification Latency ThreeArgsInt"), sl@0: RProperty::EInt, 0,ETrue, EThreeArgsInt), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local Byte(1) Notification Latency ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 1, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(1) Notification Latency ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 1, ETrue, EThreeArgsBuf8), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local TUint16(1) Notification Latency ThreeArgsBuf16"), sl@0: RProperty::EByteArray, 1, EFalse, EThreeArgsBuf16), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote TUint16(1) Notification Latency ThreeArgsBuf16"), sl@0: RProperty::EByteArray, 1, ETrue, EThreeArgsBuf16), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local Byte(8) Notification Latency ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 8, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(8) Notification Latency ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 8,ETrue, EThreeArgsBuf8), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local TUint16(8) Notification Latency ThreeArgsBuf16"), sl@0: RProperty::EByteArray, 8, EFalse, EThreeArgsBuf16), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote TUint16(8) Notification Latency ThreeArgsBuf16"), sl@0: RProperty::EByteArray, 8,ETrue, EThreeArgsBuf16), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local Byte(512) Notification Latency ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 512, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote Byte(512) Notification Latency ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 512,ETrue, EThreeArgsBuf8), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Local TUint16(512) Notification Latency ThreeArgsBuf16"), sl@0: RProperty::ELargeByteArray, 512, EFalse, EThreeArgsBuf16), sl@0: Measurement(&Property::NotificationLatencyParent, _L("Remote TUint16(512) Notification Latency ThreeArgsBuf16"), sl@0: RProperty::ELargeByteArray, 512,ETrue, EThreeArgsBuf16), sl@0: sl@0: sl@0: sl@0: Measurement(&Property::SetOverhead, _L("Int Set Overhead"), sl@0: RProperty::EInt, 0), sl@0: Measurement(&Property::SetOverhead, _L("Byte(1) Set Overhead"), sl@0: RProperty::EByteArray, 1), sl@0: Measurement(&Property::SetOverhead, _L("Byte(8) Set Overhead"), sl@0: RProperty::EByteArray, 8), sl@0: Measurement(&Property::SetOverhead, _L("Byte(512) Set Overhead"), sl@0: RProperty::EByteArray, 512), sl@0: sl@0: Measurement(&Property::SetOverhead, _L("Int Set Overhead ThreeArgsInt"), sl@0: RProperty::EInt, 0, EFalse, EThreeArgsInt), sl@0: Measurement(&Property::SetOverhead, _L("Byte(1) Set Overhead ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 1, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::SetOverhead, _L("TUint16(1) Set Overhead ThreeArgsBuf16"), sl@0: RProperty::EByteArray, 1, EFalse, EThreeArgsBuf16), sl@0: Measurement(&Property::SetOverhead, _L("Byte(8) Set Overhead ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 8, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::SetOverhead, _L("TUint16(8) Set Overhead ThreeArgsBuf16"), sl@0: RProperty::EByteArray, 8, EFalse, EThreeArgsBuf16), sl@0: Measurement(&Property::SetOverhead, _L("Byte(512) Set Overhead ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 512, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::SetOverhead, _L("TUint16(512) Set Overhead ThreeArgsBuf16"), sl@0: RProperty::ELargeByteArray, 512, EFalse, EThreeArgsBuf16), sl@0: sl@0: sl@0: sl@0: Measurement(&Property::GetOverhead, _L("Int Get Overhead"), sl@0: RProperty::EInt, 0), sl@0: Measurement(&Property::GetOverhead, _L("Byte(1) Get Overhead"), sl@0: RProperty::EByteArray, 1), sl@0: Measurement(&Property::GetOverhead, _L("Byte(8) Get Overhead"), sl@0: RProperty::EByteArray, 8), sl@0: Measurement(&Property::GetOverhead, _L("Byte(512) Get Overhead"), sl@0: RProperty::EByteArray, 512), sl@0: sl@0: Measurement(&Property::GetOverhead, _L("Int Get Overhead ThreeArgsInt"), sl@0: RProperty::EInt, 0, EFalse, EThreeArgsInt), sl@0: Measurement(&Property::GetOverhead, _L("Byte(1) Get Overhead ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 1, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::GetOverhead, _L("TUint16(1) Get Overhead ThreeArgsBuf16"), sl@0: RProperty::EByteArray, 1, EFalse, EThreeArgsBuf16), sl@0: Measurement(&Property::GetOverhead, _L("Byte(8) Get Overhead ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 8, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::GetOverhead, _L("TUint16(8) Get Overhead ThreeArgsBuf16"), sl@0: RProperty::EByteArray, 8, EFalse, EThreeArgsBuf16), sl@0: Measurement(&Property::GetOverhead, _L("Byte(512) Get Overhead ThreeArgsBuf8"), sl@0: RProperty::EByteArray, 512, EFalse, EThreeArgsBuf8), sl@0: Measurement(&Property::GetOverhead, _L("TUint16(512) Get Overhead ThreeArgsBuf16"), sl@0: RProperty::ELargeByteArray, 512, EFalse, EThreeArgsBuf16), sl@0: sl@0: }; sl@0: TBMResult Property::iResults[sizeof(Property::iMeasurements)/sizeof(Property::iMeasurements[0])]; sl@0: sl@0: TBuf8 Property::iInBuf(RProperty::KMaxPropertySize); sl@0: TBuf8 Property::iOutBuf(RProperty::KMaxPropertySize); sl@0: TBuf16 Property::iInBuf16(RProperty::KMaxPropertySize); sl@0: TBuf16 Property::iOutBuf16(RProperty::KMaxPropertySize); sl@0: sl@0: sl@0: static Property property; sl@0: sl@0: class NotificationLatencyArgs : public TBMSpawnArgs sl@0: { sl@0: public: sl@0: sl@0: TBMUInt64 iIterationCount; sl@0: RProperty::TType iType; sl@0: TInt iSize; sl@0: TSetGetType iSetGetType; sl@0: sl@0: NotificationLatencyArgs(RProperty::TType aType, TInt aSize, TInt aRemote, TBMUInt64 aIter, sl@0: TSetGetType aSetGetType); sl@0: }; sl@0: sl@0: NotificationLatencyArgs::NotificationLatencyArgs(RProperty::TType aType, TInt aSize, TInt aRemote, sl@0: TBMUInt64 aIter, TSetGetType aSetGetType) : sl@0: TBMSpawnArgs(Property::NotificationLatencyChild, KBMPriorityLow, aRemote, sizeof(*this)), sl@0: iIterationCount(aIter), iType(aType), iSize(aSize), iSetGetType(aSetGetType) sl@0: { sl@0: } sl@0: sl@0: void Property::NotificationLatencyParent(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM) sl@0: { sl@0: RProperty time; sl@0: TInt r = time.Define(KPropBenchmarkCategory, 0, RProperty::EByteArray, KPassPolicy, KPassPolicy); sl@0: BM_ERROR(r, r == KErrNone); sl@0: r = time.Attach(KPropBenchmarkCategory, 0); sl@0: BM_ERROR(r, r == KErrNone); sl@0: sl@0: RProperty prop; sl@0: r = prop.Define(KPropBenchmarkCategory, 1, aM->iType, KPassPolicy, KPassPolicy); sl@0: BM_ERROR(r, r == KErrNone); sl@0: r = prop.Attach(KPropBenchmarkCategory, 1); sl@0: BM_ERROR(r, r == KErrNone); sl@0: sl@0: NotificationLatencyArgs sl(aM->iType, aM->iSize, aM->iRemote, aIter, aM->iSetGetType); sl@0: MBMChild* child = property.SpawnChild(&sl); sl@0: for (TBMUInt64 i = 0; i < aIter; ++i) sl@0: { sl@0: TRequestStatus st; sl@0: prop.Subscribe(st); sl@0: User::WaitForRequest(st); sl@0: switch(aM->iSetGetType) sl@0: { sl@0: case EOneArg: sl@0: if (aM->iType == RProperty::EInt) sl@0: { sl@0: TInt value; sl@0: r = prop.Get(value); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: else sl@0: { sl@0: r = prop.Get(iInBuf); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsInt: sl@0: { sl@0: TInt value; sl@0: r = prop.Get(KPropBenchmarkCategory, 1, value); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsBuf8: sl@0: r = prop.Get(KPropBenchmarkCategory, 1, iInBuf); sl@0: BM_ERROR(r, r == KErrNone); sl@0: break; sl@0: case EThreeArgsBuf16: sl@0: r = prop.Get(KPropBenchmarkCategory, 1, iInBuf16); sl@0: BM_ERROR(r, r == KErrNone); sl@0: break; sl@0: } sl@0: sl@0: TBMTicks now; sl@0: ::bmTimer.Stamp(&now); sl@0: BM_ERROR(st.Int(), st.Int() == KErrNone); sl@0: sl@0: // subscribe for the time just before Set() sl@0: time.Subscribe(st); sl@0: User::WaitForRequest(st); sl@0: BM_ERROR(st.Int(), st.Int() == KErrNone); sl@0: // get the time just before Set() sl@0: TBMTicks propSetTime; sl@0: TPtr8 ptr((TUint8*) &propSetTime, sizeof(propSetTime), sizeof(propSetTime)); sl@0: r = time.Get(KPropBenchmarkCategory, 0, ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: sl@0: aResult->Cumulate(TBMTicksDelta(propSetTime, now)); sl@0: } sl@0: prop.Close(); sl@0: time.Close(); sl@0: child->WaitChildExit(); sl@0: r = prop.Delete(KPropBenchmarkCategory, 1); sl@0: BM_ERROR(r, r == KErrNone); sl@0: r = time.Delete(KPropBenchmarkCategory, 0); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: sl@0: TInt Property::NotificationLatencyChild(TAny* cookie) sl@0: { sl@0: NotificationLatencyArgs* sl = (NotificationLatencyArgs*) cookie; sl@0: TInt prio = BMProgram::SetAbsPriority(RThread(), sl->iChildOrigPriority); sl@0: sl@0: for (TInt j = 0; j < RProperty::KMaxPropertySize; ++j) sl@0: { sl@0: iOutBuf[j] = (TUint8)(j + 1); sl@0: } sl@0: RProperty time; sl@0: RProperty prop; sl@0: TInt r = prop.Attach(KPropBenchmarkCategory, 1); sl@0: BM_ERROR(r, r == KErrNone); sl@0: for (TBMUInt64 i = 0; i < sl->iIterationCount; ++i) sl@0: { sl@0: TBMTicks propSetTime; sl@0: ::bmTimer.Stamp(&propSetTime); sl@0: switch(sl->iSetGetType) sl@0: { sl@0: case EOneArg: sl@0: if (sl->iType == RProperty::EInt) sl@0: { sl@0: TInt value = 0xdeadbeef; sl@0: r = prop.Set(value); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: else sl@0: { sl@0: TPtrC8 ptr(iOutBuf.Ptr(), sl->iSize); sl@0: r = prop.Set(ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsInt: sl@0: { sl@0: TInt value = 0xdeadbeef; sl@0: r = prop.Set(KPropBenchmarkCategory, 1, value); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsBuf8: sl@0: { sl@0: TPtrC8 ptr(iOutBuf.Ptr(), sl->iSize); sl@0: r = prop.Set(KPropBenchmarkCategory, 1, ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsBuf16: sl@0: { sl@0: TPtrC16 ptr(iOutBuf16.Ptr(), sl->iSize); sl@0: r = prop.Set(KPropBenchmarkCategory, 1, ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: } sl@0: // publish the time just before Set() sl@0: TPtr8 ptr((TUint8*) &propSetTime, sizeof(propSetTime), sizeof(propSetTime)); sl@0: r = time.Set(KPropBenchmarkCategory, 0, ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: prop.Close(); sl@0: time.Close(); sl@0: sl@0: BMProgram::SetAbsPriority(RThread(), prio); sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: void Property::SetOverhead(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM) sl@0: { sl@0: RProperty prop; sl@0: TInt r = prop.Define(KPropBenchmarkCategory, 1, aM->iType, KPassPolicy, KPassPolicy); sl@0: BM_ERROR(r, r == KErrNone); sl@0: r = prop.Attach(KPropBenchmarkCategory, 1); sl@0: BM_ERROR(r, r == KErrNone); sl@0: sl@0: if (aM->iType == RProperty::EByteArray) sl@0: { sl@0: TPtrC8 ptr(iOutBuf.Ptr(), aM->iSize); sl@0: r = prop.Set(ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: sl@0: TBMTimeInterval ti; sl@0: ti.Begin(); sl@0: for (TBMUInt64 i = 0; i < aIter; ++i) sl@0: { sl@0: switch(aM->iSetGetType) sl@0: { sl@0: case EOneArg: sl@0: if (aM->iType == RProperty::EInt) sl@0: { sl@0: TInt value = 1; sl@0: r = prop.Set(value); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: else sl@0: { sl@0: TPtrC8 ptr(iOutBuf.Ptr(), aM->iSize); sl@0: r = prop.Set(ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsInt: sl@0: { sl@0: TInt value = 1; sl@0: r = prop.Set(KPropBenchmarkCategory, 1, value); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsBuf8: sl@0: { sl@0: TPtrC8 ptr(iOutBuf.Ptr(), aM->iSize); sl@0: r = prop.Set(KPropBenchmarkCategory, 1, ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsBuf16: sl@0: { sl@0: TPtrC16 ptr(iOutBuf16.Ptr(), aM->iSize); sl@0: r = prop.Set(KPropBenchmarkCategory, 1, ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: } sl@0: } sl@0: TBMTicks t = ti.End(); sl@0: sl@0: prop.Close(); sl@0: r = prop.Delete(KPropBenchmarkCategory, 1); sl@0: BM_ERROR(r, r == KErrNone); sl@0: sl@0: aResult->Cumulate(t, aIter); sl@0: } sl@0: sl@0: void Property::GetOverhead(TBMResult* aResult, TBMUInt64 aIter, struct Measurement* aM) sl@0: { sl@0: RProperty prop; sl@0: TInt r = prop.Define(KPropBenchmarkCategory, 1, aM->iType, KPassPolicy, KPassPolicy); sl@0: BM_ERROR(r, r == KErrNone); sl@0: r = prop.Attach(KPropBenchmarkCategory, 1); sl@0: BM_ERROR(r, r == KErrNone); sl@0: sl@0: if (aM->iType == RProperty::EByteArray) sl@0: { sl@0: TPtrC8 ptr(iOutBuf.Ptr(), aM->iSize); sl@0: r = prop.Set(ptr); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: sl@0: TBMTimeInterval ti; sl@0: ti.Begin(); sl@0: for (TBMUInt64 i = 0; i < aIter; ++i) sl@0: { sl@0: switch(aM->iSetGetType) sl@0: { sl@0: case EOneArg: sl@0: if (aM->iType == RProperty::EInt) sl@0: { sl@0: TInt value = 1; sl@0: r = prop.Get(value); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: else sl@0: { sl@0: r = prop.Get(iInBuf); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsInt: sl@0: { sl@0: TInt value = 1; sl@0: r = prop.Get(KPropBenchmarkCategory, 1, value); sl@0: BM_ERROR(r, r == KErrNone); sl@0: } sl@0: break; sl@0: case EThreeArgsBuf8: sl@0: r = prop.Get(KPropBenchmarkCategory, 1, iInBuf); sl@0: BM_ERROR(r, r == KErrNone); sl@0: break; sl@0: case EThreeArgsBuf16: sl@0: r = prop.Get(KPropBenchmarkCategory, 1, iInBuf16); sl@0: BM_ERROR(r, r == KErrNone); sl@0: break; sl@0: } sl@0: } sl@0: TBMTicks t = ti.End(); sl@0: sl@0: prop.Close(); sl@0: r = prop.Delete(KPropBenchmarkCategory, 1); sl@0: BM_ERROR(r, r == KErrNone); sl@0: sl@0: aResult->Cumulate(t, aIter); sl@0: } sl@0: sl@0: sl@0: sl@0: TBMResult* Property::Run(TBMUInt64 aIter, TInt* aCount) sl@0: { sl@0: TInt count = sizeof(iResults)/sizeof(iResults[0]); sl@0: sl@0: for (TInt i = 0; i < count; ++i) sl@0: { sl@0: iResults[i].Reset(iMeasurements[i].iName); sl@0: iMeasurements[i].iFunc(&iResults[i], aIter, &iMeasurements[i]); sl@0: iResults[i].Update(); sl@0: } sl@0: sl@0: *aCount = count; sl@0: return iResults; sl@0: } sl@0: sl@0: void AddProperty() sl@0: { sl@0: BMProgram* next = bmSuite; sl@0: bmSuite=(BMProgram*)&property; sl@0: bmSuite->Next()=next; sl@0: }