/************************************************************************* * * * ODER's Utilities Library. Copyright (C) 2008 Oleh Derevenko. * * All rights reserved. e-mail: odar@eleks.com (change all "a" to "e") * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of EITHER: * * (1) The GNU Lesser General Public License as published by the Free * * Software Foundation; either version 3 of the License, or (at * * your option) any later version. The text of the GNU Lesser * * General Public License is included with this library in the * * file LICENSE-LESSER.TXT. Since LGPL is the extension of GPL * * the text of GNU General Public License is also provided for * * your information in file LICENSE.TXT. * * (2) The BSD-style license that is included with this library in * * the file LICENSE-BSD.TXT. * * (3) The zlib/libpng license that is included with this library in * * the file LICENSE-ZLIB.TXT * * * * This library is distributed WITHOUT ANY WARRANTY, including implied * * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the files LICENSE.TXT and LICENSE-LESSER.TXT or LICENSE-BSD.TXT * * or LICENSE-ZLIB.TXT for more details. * * * *************************************************************************/ #include #include #if _OU_COMPILER == _OU_COMPILER_MSVC #pragma warning(disable:4786) #endif #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS #include #endif #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS #include #endif #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS #include #endif #include #include #include #include #include #include #include #include #include #include using namespace _OU_NAMESPACE; #include #include ////////////////////////////////////////////////////////////////////////// typedef bool (*CFeatureTestProcedure)(); bool TestSubsystem(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount, const unsigned int uiFeatureMax, const char *const *aszFeatureNames, CFeatureTestProcedure const *afnFeatureTests) { unsigned int nSuccessCount = 0; for (unsigned int uiSubsystemFeature = 0; uiSubsystemFeature != uiFeatureMax; ++uiSubsystemFeature) { const char *szFeatureName = aszFeatureNames[uiSubsystemFeature]; printf("Testing %34s: ", szFeatureName); CFeatureTestProcedure fnTestProcedure = afnFeatureTests[uiSubsystemFeature]; bool bTestResult = fnTestProcedure(); printf("%s\n", bTestResult ? "success" : "*** failure ***"); if (bTestResult) { nSuccessCount += 1; } } nOutSuccessCount = nSuccessCount; nOutTestCount = uiFeatureMax; return nSuccessCount == uiFeatureMax; } ////////////////////////////////////////////////////////////////////////// #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS bool g_bTestTLSAPIInitialized = false; HTLSKEY g_htkTestTLSKey; enum ETESTTLSVALUES { TTV_FIRSTVALUE, TTV_SECONDVALUE, TTV__MAX, }; unsigned int g_uiTestTLSDestructorCallCount = 0; unsigned int g_uiTestTLSDestructorSuccessCount = 0; void _OU_CONVENTION_CALLBACK TestTlsSecondValueDestructor(void *pv_Value) { g_uiTestTLSDestructorCallCount += 1; if (pv_Value == (void *)(&TestTlsSecondValueDestructor)) { g_uiTestTLSDestructorSuccessCount += 1; } } bool TestTls_Initialization() { bool bResult = false; do { if (!CTLSInitialization::InitializeTLSAPI(g_htkTestTLSKey, 1, 0)) { break; } CTLSInitialization::FinalizeTLSAPI(); if (!CTLSInitialization::InitializeTLSAPI(g_htkTestTLSKey, TTV__MAX, CTLSInitialization::SIF_MANUAL_CLEANUP_ON_THREAD_EXIT)) { break; } g_bTestTLSAPIInitialized = true; bResult = true; } while (false); return bResult; } bool TestTls_GetSetValue() { bool bResult = false; do { tlsvaluetype vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE); if (vtFirstValue != 0) { break; } tlsvaluetype vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE); if (vtSecondValue != 0) { break; } if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE, (tlsvaluetype)&TestTls_GetSetValue)) { break; } if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)&TestTlsSecondValueDestructor, &TestTlsSecondValueDestructor)) { break; } vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE); if ((void *)vtFirstValue != &TestTls_GetSetValue) { break; } vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE); if ((void *)vtSecondValue != &TestTlsSecondValueDestructor) { break; } if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, 0, &TestTlsSecondValueDestructor)) { break; } vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE); if (vtSecondValue != 0) { break; } if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)&TestTlsSecondValueDestructor, &TestTlsSecondValueDestructor)) { break; } if (g_uiTestTLSDestructorCallCount != 0) { break; } bResult = true; } while (false); return bResult; } bool TestTls_UnsafeGetSetValue() { bool bResult = false; do { tlsvaluetype vtFirstValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE); if ((void *)vtFirstValue != &TestTls_GetSetValue) { break; } tlsvaluetype vtSecondValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE); if ((void *)vtSecondValue != &TestTlsSecondValueDestructor) { break; } CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE, (tlsvaluetype)(size_t)(-1)); CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(size_t)(-1)); vtFirstValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE); if ((size_t)vtFirstValue != (size_t)(-1)) { break; } vtSecondValue = CThreadLocalStorage::UnsafeGetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE); if ((size_t)vtSecondValue != (size_t)(-1)) { break; } // Safe function used by intent !!! vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE); if ((size_t)vtFirstValue != (size_t)(-1)) { break; } // Safe function used by intent !!! vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE); if ((size_t)vtSecondValue != (size_t)(-1)) { break; } CThreadLocalStorage::UnsafeSetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(&TestTlsSecondValueDestructor)); if (g_uiTestTLSDestructorCallCount != 0) { break; } bResult = true; } while (false); return bResult; } bool TestTls_CleanupDestructor() { bool bResult = false; do { CTLSInitialization::CleanupOnThreadExit(); if (g_uiTestTLSDestructorCallCount != 1 || g_uiTestTLSDestructorSuccessCount != 1) { break; } tlsvaluetype vtFirstValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_FIRSTVALUE); if (vtFirstValue != 0) { break; } // Safe function used by intent !!! tlsvaluetype vtSecondValue = CThreadLocalStorage::GetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE); if (vtSecondValue != 0) { break; } g_uiTestTLSDestructorCallCount = 0; g_uiTestTLSDestructorSuccessCount = 0; CTLSInitialization::CleanupOnThreadExit(); if (g_uiTestTLSDestructorCallCount != 0) { break; } if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, 0, &TestTlsSecondValueDestructor)) { break; } CTLSInitialization::CleanupOnThreadExit(); if (g_uiTestTLSDestructorCallCount != 0) { break; } if (!CThreadLocalStorage::SetStorageValue(g_htkTestTLSKey, TTV_SECONDVALUE, (tlsvaluetype)(size_t)(-1), &TestTlsSecondValueDestructor)) { break; } if (g_uiTestTLSDestructorCallCount != 0) { break; } bResult = true; } while (false); return bResult; } bool TestTls_Finalization() { OU_ASSERT(g_bTestTLSAPIInitialized); bool bResult = false; do { CTLSInitialization::FinalizeTLSAPI(); g_bTestTLSAPIInitialized = false; if (g_uiTestTLSDestructorCallCount != 1 || g_uiTestTLSDestructorSuccessCount != 0) { break; } bResult = true; } while (false); return bResult; } enum EOUTLSFEATURE { OHF__MIN, OHF_INITIALIZATION = OHF__MIN, OHF_GETSETVALUE, OHF_UNSAFEGETSETVALUE, OHF_CLEANUPDESTRUCTOR, OHF_FINALIZATION, OHF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestTls_Initialization, // OHF_INITIALIZATION &TestTls_GetSetValue, // OHF_GETSETVALUE, &TestTls_UnsafeGetSetValue, // OHF_UNSAFEGETSETVALUE, &TestTls_CleanupDestructor, // OHF_CLEANUPDESTRUCTOR, &TestTls_Finalization, // OHF_FINALIZATION, }; static const CEnumUnsortedElementArray g_afnTlsFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "API Initialization", // OHF_INITIALIZATION "Get.../SetStorageValue", // OHF_GETSETVALUE, "UnsafeGet.../UnsafeSetStorageValue", // OHF_UNSAFEGETSETVALUE, "Storage Cleanup/Value Destructors", // OHF_CLEANUPDESTRUCTOR, "API Finalization", // OHF_FINALIZATION, }; static const CEnumUnsortedElementArray g_aszTlsFeatureTestNames; bool TestTLS(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { bool bResult = TestSubsystem(nOutSuccessCount, nOutTestCount, OHF__MAX, g_aszTlsFeatureTestNames.GetStoragePointer(), g_afnTlsFeatureTestProcedures.GetStoragePointer()); if (g_bTestTLSAPIInitialized) { CTLSInitialization::FinalizeTLSAPI(); } return bResult; } #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS ////////////////////////////////////////////////////////////////////////// #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS bool TestAtomic_Increment() { bool bResult = false; do { volatile atomicord32 aoStorage = (atomicord32)(-1); // Putting function inside of conditional operator causes // incorrect code generation by GCC 4.0.1 on MacOS X Leopard 64 bit. atomicord32 aoIncrementFirstResult = AtomicIncrement(&aoStorage); if (aoIncrementFirstResult != 0 || aoStorage != (atomicord32)0) { break; } if (AtomicIncrement(&aoStorage) != (atomicord32)1 || aoStorage != (atomicord32)1) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_Decrement() { bool bResult = false; do { volatile atomicord32 aoStorage = (atomicord32)1; // Putting function inside of conditional operator causes // incorrect code generation by GCC 4.0.1 on MacOS X Leopard 64 bit. atomicord32 aoDecrementFirstResult = AtomicDecrement(&aoStorage); if (aoDecrementFirstResult != (atomicord32)0 || aoStorage != (atomicord32)0) { break; } if (AtomicDecrement(&aoStorage) != (atomicord32)(-1) || aoStorage != (atomicord32)(-1)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_IncrementNoResult() { bool bResult = false; do { volatile atomicord32 aoStorage = (atomicord32)(-1); AtomicIncrementNoResult(&aoStorage); if (aoStorage != (atomicord32)0) { break; } AtomicIncrementNoResult(&aoStorage); if (aoStorage != (atomicord32)1) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_DecrementNoResult() { bool bResult = false; do { volatile atomicord32 aoStorage = (atomicord32)1; AtomicDecrementNoResult(&aoStorage); if (aoStorage != (atomicord32)0) { break; } AtomicDecrementNoResult(&aoStorage); if (aoStorage != (atomicord32)(-1)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_Exchange() { bool bResult = false; do { volatile atomicord32 aoStorage = 0; if (AtomicExchange(&aoStorage, (atomicord32)1) != 0 || aoStorage != (atomicord32)1) { break; } if (AtomicExchange(&aoStorage, (atomicord32)(-1)) != (atomicord32)1 || aoStorage != (atomicord32)(-1)) { break; } if (AtomicExchange(&aoStorage, 0) != (atomicord32)(-1) || aoStorage != 0) { break; } if (AtomicExchange(&aoStorage, 0) != 0 || aoStorage != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_ExchangeAdd() { bool bResult = false; do { volatile atomicord32 aoStorage = 0; if (AtomicExchangeAdd(&aoStorage, (atomicord32)1) != 0 || aoStorage != (atomicord32)1) { break; } if (AtomicExchangeAdd(&aoStorage, (atomicord32)(-2)) != 1 || aoStorage != (atomicord32)(-1)) { break; } if (AtomicExchangeAdd(&aoStorage, (atomicord32)1) != (atomicord32)(-1) || aoStorage != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_ExchangeAddNoResult() { bool bResult = false; do { volatile atomicord32 aoStorage = 0; AtomicExchangeAddNoResult(&aoStorage, (atomicord32)1); if (aoStorage != (atomicord32)1) { break; } AtomicExchangeAddNoResult(&aoStorage, (atomicord32)(-2)); if (aoStorage != (atomicord32)(-1)) { break; } AtomicExchangeAddNoResult(&aoStorage, (atomicord32)1); if (aoStorage != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_CompareExchange() { bool bResult = false; do { volatile atomicord32 aoStorage = 0; if (AtomicCompareExchange(&aoStorage, 1, 1) || aoStorage != 0) { break; } if (!AtomicCompareExchange(&aoStorage, 0, 1) || aoStorage != 1) { break; } if (!AtomicCompareExchange(&aoStorage, 1, 1) || aoStorage != 1) { break; } if (!AtomicCompareExchange(&aoStorage, 1, (atomicord32)(-1)) || aoStorage != (atomicord32)(-1)) { break; } if (AtomicCompareExchange(&aoStorage, 1, (atomicord32)(-1)) || aoStorage != (atomicord32)(-1)) { break; } bResult = true; } while (false); return bResult; } const atomicord32 g_aoBitmask = (atomicord32)(OU_INT32_MIN + 1); bool TestAtomic_And() { bool bResult = false; do { volatile atomicord32 aoStorage = (atomicord32)OU_UINT32_MAX; if (AtomicAnd(&aoStorage, g_aoBitmask) != (atomicord32)OU_UINT32_MAX || aoStorage != g_aoBitmask) { break; } if (AtomicAnd(&aoStorage, 0) != g_aoBitmask || aoStorage != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_Or() { bool bResult = false; do { volatile atomicord32 aoStorage = 0; if (AtomicOr(&aoStorage, g_aoBitmask) != 0 || aoStorage != g_aoBitmask) { break; } if (AtomicOr(&aoStorage, (atomicord32)OU_UINT32_MAX) != g_aoBitmask || aoStorage != (atomicord32)OU_UINT32_MAX) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_Xor() { bool bResult = false; do { volatile atomicord32 aoStorage = 0; if (AtomicXor(&aoStorage, g_aoBitmask) != 0 || aoStorage != g_aoBitmask) { break; } if (AtomicXor(&aoStorage, (atomicord32)OU_UINT32_MAX) != g_aoBitmask || aoStorage != (atomicord32)(OU_UINT32_MAX ^ g_aoBitmask)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_AndNoResult() { bool bResult = false; do { volatile atomicord32 aoStorage = (atomicord32)OU_UINT32_MAX; AtomicAndNoResult(&aoStorage, g_aoBitmask); if (aoStorage != g_aoBitmask) { break; } AtomicAndNoResult(&aoStorage, 0); if (aoStorage != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_OrNoResult() { bool bResult = false; do { volatile atomicord32 aoStorage = 0; AtomicOrNoResult(&aoStorage, g_aoBitmask); if (aoStorage != g_aoBitmask) { break; } AtomicOrNoResult(&aoStorage, (atomicord32)OU_UINT32_MAX); if (aoStorage != (atomicord32)OU_UINT32_MAX) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_XorNoResult() { bool bResult = false; do { volatile atomicord32 aoStorage = 0; AtomicXorNoResult(&aoStorage, g_aoBitmask); if (aoStorage != g_aoBitmask) { break; } AtomicXorNoResult(&aoStorage, (atomicord32)OU_UINT32_MAX); if (aoStorage != (atomicord32)(OU_UINT32_MAX ^ g_aoBitmask)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_ExchangePointer() { bool bResult = false; do { volatile atomicptr apStorage = NULL; if (AtomicExchangePointer(&apStorage, (atomicptr)(&TestAtomic_ExchangePointer)) != NULL || apStorage != (atomicptr)(&TestAtomic_ExchangePointer)) { break; } if (AtomicExchangePointer(&apStorage, (atomicptr)(&apStorage)) != (atomicptr)(&TestAtomic_ExchangePointer) || apStorage != (atomicptr)(&apStorage)) { break; } if (AtomicExchangePointer(&apStorage, NULL) != (atomicptr)(&apStorage) || apStorage != NULL) { break; } bResult = true; } while (false); return bResult; } bool TestAtomic_CompareExchangePointer() { bool bResult = false; do { volatile atomicptr apStorage = NULL; if (AtomicCompareExchangePointer(&apStorage, (atomicptr)(&TestAtomic_CompareExchangePointer), (atomicptr)(&TestAtomic_CompareExchangePointer)) || apStorage != NULL) { break; } if (!AtomicCompareExchangePointer(&apStorage, NULL, (atomicptr)(&TestAtomic_CompareExchangePointer)) || apStorage != (atomicptr)(&TestAtomic_CompareExchangePointer)) { break; } if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&TestAtomic_CompareExchangePointer), (atomicptr)(&apStorage)) || apStorage != (atomicptr)(&apStorage)) { break; } if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&apStorage), (atomicptr)(&apStorage)) || apStorage != (atomicptr)(&apStorage)) { break; } if (AtomicCompareExchangePointer(&apStorage, NULL, NULL) || apStorage != (atomicptr)(&apStorage)) { break; } if (!AtomicCompareExchangePointer(&apStorage, (atomicptr)(&apStorage), NULL) || apStorage != NULL) { break; } bResult = true; } while (false); return bResult; } enum EOUATOMICFEATURE { OOF__MIN, OOF_INCREMENT = OOF__MIN, OOF_DECREMENT, OOF_INCREMENTNORESULT, OOF_DECREMENTNORESULT, OOF_EXCHANGE, OOF_EXCHANGEADD, OOF_EXCHANGEADDNORESULT, OOF_COMPAREEXCHANGE, OOF_AND, OOF_OR, OOF_XOR, OOF_ANDNORESULT, OOF_ORNORESULT, OOF_XORNORESULT, OOF_EXCHANGEPOINTER, OOF_COMPAREEXCHANGEPOINTER, OOF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestAtomic_Increment, // OOF_INCREMENT, &TestAtomic_Decrement, // OOF_DECREMENT, &TestAtomic_IncrementNoResult, // OOF_INCREMENTNORESULT, &TestAtomic_DecrementNoResult, // OOF_DECREMENTNORESULT, &TestAtomic_Exchange, // OOF_EXCHANGE, &TestAtomic_ExchangeAdd, // OOF_EXCHANGEADD, &TestAtomic_ExchangeAddNoResult, // OOF_EXCHANGEADDNORESULT, &TestAtomic_CompareExchange, // OOF_COMPAREEXCHANGE, &TestAtomic_And, // OOF_AND, &TestAtomic_Or, // OOF_OR, &TestAtomic_Xor, // OOF_XOR, &TestAtomic_AndNoResult, // OOF_ANDNORESULT, &TestAtomic_OrNoResult, // OOF_ORNORESULT, &TestAtomic_XorNoResult, // OOF_XORNORESULT, &TestAtomic_ExchangePointer, // OOF_EXCHANGEPOINTER, &TestAtomic_CompareExchangePointer, // OOF_COMPAREEXCHANGEPOINTER, }; static const CEnumUnsortedElementArray g_afnAtomicFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "AtomicIncrement", // OOF_INCREMENT, "AtomicDecrement", // OOF_DECREMENT, "AtomicIncrementNoResult", // OOF_INCREMENTNORESULT, "AtomicDecrementNoResult", // OOF_DECREMENTNORESULT, "AtomicExchange", // OOF_EXCHANGE, "AtomicExchangeAdd", // OOF_EXCHANGEADD, "AtomicExchangeAddNoResult", // OOF_EXCHANGEADDNORESULT, "AtomicCompareExchange", // OOF_COMPAREEXCHANGE, "AtomicAnd", // OOF_AND, "AtomicOr", // OOF_OR, "AtomicXor", // OOF_XOR, "AtomicAndNoResult", // OOF_ANDNORESULT, "AtomicOrNoResult", // OOF_ORNORESULT, "AtomicXorNoResult", // OOF_XORNORESULT, "AtomicExchangePointer", // OOF_EXCHANGEPOINTER, "AtomicCompareExchangePointer", // OOF_COMPAREEXCHANGEPOINTER, }; static const CEnumUnsortedElementArray g_aszAtomicFeatureTestNames; bool TestAtomic(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { bool bResult = false; nOutSuccessCount = 0; nOutTestCount = OOF__MAX; bool bAPIInitialized = false; do { if (!InitializeAtomicAPI()) { break; } bAPIInitialized = true; if (!TestSubsystem(nOutSuccessCount, nOutTestCount, OOF__MAX, g_aszAtomicFeatureTestNames.GetStoragePointer(), g_afnAtomicFeatureTestProcedures.GetStoragePointer())) { break; } bResult = true; } while (false); if (bAPIInitialized) { FinalizeAtomicAPI(); } return bResult; } #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS ////////////////////////////////////////////////////////////////////////// #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS const atomicord32 g_aoTestValue32 = (atomicord32)0xA5A5A5A5; const atomicord32 g_aoTestMask32 = (atomicord32)0xC6C6C6C6; const atomicord32 g_aoTestBit32 = (atomicord32)OU_INT32_MIN; const atomicord32 g_aoTestAnotherBit32 = (atomicord32)((uint32ou)OU_INT32_MIN >> 1); bool TestAtomicFlags_Constructors() { bool bResult = false; do { if (sizeof(CAtomicFlags::value_type) != sizeof(atomicord32)) { break; } CAtomicFlags afEmptyFlags; if (afEmptyFlags.QueryFlagsAllValues()) { break; } CAtomicFlags afFullFlags(OU_UINT32_MAX); if (afFullFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX) { break; } CAtomicFlags afCopyOfFullFlags(afFullFlags); if (afCopyOfFullFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_AssignFlagsAllValues() { bool bResult = false; do { CAtomicFlags afTestFlags; afTestFlags.AssignFlagsAllValues(OU_UINT32_MAX); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_UINT32_MAX) { break; } afTestFlags.AssignFlagsAllValues(0); if (afTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_QueryFlagsAllValues() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32) { break; } // Double check to be sure ;-) if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_SetFlagsMaskValue() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); afTestFlags.SetFlagsMaskValue(g_aoTestMask32, true); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestMask32)) { break; } afTestFlags.SetFlagsMaskValue(g_aoTestValue32, false); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(~g_aoTestValue32 & g_aoTestMask32)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_SignalFlagsMaskValue() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); afTestFlags.SignalFlagsMaskValue(g_aoTestMask32); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestMask32)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_DropFlagsMaskValue() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); afTestFlags.DropFlagsMaskValue(g_aoTestMask32); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 & ~g_aoTestMask32)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_ToggleSingleFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); bool bPreviousValue = afTestFlags.ToggleSingleFlagValue(g_aoTestBit32); if (bPreviousValue != ((g_aoTestValue32 & g_aoTestBit32) != 0) || afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 ^ g_aoTestBit32)) { break; } bool bAnotherPreviousValue = afTestFlags.ToggleSingleFlagValue(g_aoTestBit32); if (bAnotherPreviousValue == bPreviousValue || afTestFlags.QueryFlagsAllValues() != g_aoTestValue32) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_ModifySingleFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); bool bFirstModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, true); if (bFirstModification != ((g_aoTestValue32 & g_aoTestBit32) != g_aoTestBit32) || afTestFlags.QueryFlagsAllValues() != (atomicord32)(g_aoTestValue32 | g_aoTestBit32)) { break; } bool bAnotherModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, bFirstModification); if (bAnotherModification == bFirstModification || afTestFlags.QueryFlagsAllValues() != (bFirstModification ? (atomicord32)(g_aoTestValue32 | g_aoTestBit32) : (atomicord32)(g_aoTestValue32 & ~g_aoTestBit32))) { break; } bool bYetAnotherModification = afTestFlags.ModifySingleFlagValue(g_aoTestBit32, bAnotherModification); if (bYetAnotherModification != bAnotherModification || afTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (atomicord32)(g_aoTestValue32 | g_aoTestBit32) : (atomicord32)(g_aoTestValue32 & ~g_aoTestBit32))) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_AssignFlagsByMask() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); atomicord32 aoPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestMask32, g_aoTestMask32); const atomicord32 aoNewFlags = (g_aoTestValue32 & ~g_aoTestMask32) | g_aoTestMask32; if (aoPreviousFlags != g_aoTestValue32 || afTestFlags.QueryFlagsAllValues() != aoNewFlags) { break; } atomicord32 aoAnotherPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestValue32, 0); const atomicord32 aoAnotherNewFlags = aoNewFlags & ~g_aoTestValue32; if (aoAnotherPreviousFlags != aoNewFlags || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags) { break; } atomicord32 aoYetAnotherPreviousFlags = afTestFlags.AssignFlagsByMask(g_aoTestMask32, g_aoTestMask32 & g_aoTestValue32); OU_ASSERT((g_aoTestMask32 & g_aoTestValue32) != 0); // Test degeneration const atomicord32 aoYetAnotherNewFlags = (aoAnotherNewFlags & ~g_aoTestMask32) | (g_aoTestMask32 & g_aoTestValue32); OU_ASSERT(aoYetAnotherNewFlags != (atomicord32)OU_UINT32_MAX); // Test degeneration if (aoYetAnotherPreviousFlags != aoAnotherNewFlags || afTestFlags.QueryFlagsAllValues() != aoYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_AlterFlagsByMask() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); bool bWasModification = afTestFlags.AlterFlagsByMask(g_aoTestMask32, g_aoTestMask32); const atomicord32 aoNewFlags = (g_aoTestValue32 & ~g_aoTestMask32) | g_aoTestMask32; if (bWasModification != ((g_aoTestValue32 & g_aoTestMask32) != g_aoTestMask32) || afTestFlags.QueryFlagsAllValues() != aoNewFlags) { break; } bool bWasAnotherModification = afTestFlags.AlterFlagsByMask(g_aoTestValue32, 0); const atomicord32 aoAnotherNewFlags = aoNewFlags & ~g_aoTestValue32; if (bWasAnotherModification != ((aoNewFlags & g_aoTestValue32) != 0) || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags) { break; } bool bWasAnotherModificationRepeated = afTestFlags.AlterFlagsByMask(g_aoTestValue32, 0); if (bWasAnotherModificationRepeated || afTestFlags.QueryFlagsAllValues() != aoAnotherNewFlags) { break; } bool bWasYetAnotherModification = afTestFlags.AlterFlagsByMask(g_aoTestMask32, g_aoTestMask32 & g_aoTestValue32); OU_ASSERT((g_aoTestMask32 & g_aoTestValue32) != 0); // Test degeneration const atomicord32 aoYetAnotherNewFlags = (aoAnotherNewFlags & ~g_aoTestMask32) | (g_aoTestMask32 & g_aoTestValue32); OU_ASSERT(aoYetAnotherNewFlags != (atomicord32)OU_UINT32_MAX); // Test degeneration if (bWasYetAnotherModification != ((aoAnotherNewFlags & g_aoTestMask32) != (g_aoTestMask32 & g_aoTestValue32)) || afTestFlags.QueryFlagsAllValues() != aoYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_GetFlagsMaskValue() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); if (afTestFlags.GetFlagsMaskValue(g_aoTestMask32) != ((g_aoTestValue32 & g_aoTestMask32) != 0)) { break; } if (afTestFlags.GetFlagsMaskValue(~g_aoTestValue32)) { break; } if (!afTestFlags.GetFlagsMaskValue(OU_UINT32_MAX)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_QueryFlagsByMask() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); if (afTestFlags.QueryFlagsByMask(g_aoTestMask32) != (atomicord32)(g_aoTestValue32 & g_aoTestMask32)) { break; } if (afTestFlags.QueryFlagsByMask(0)) { break; } if (afTestFlags.QueryFlagsByMask(OU_UINT32_MAX) != g_aoTestValue32) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_OnlySignalSingleFlagOutOfMask() { bool bResult = false; do { CAtomicFlags afTestFlags(g_aoTestValue32); OU_ASSERT(g_aoTestValue32 != 0); // Test degeneration if (afTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_aoTestBit32)) { break; } if (afTestFlags.QueryFlagsAllValues() != g_aoTestValue32) { break; } afTestFlags.AssignFlagsAllValues(0); if (!afTestFlags.OnlySignalSingleFlagOutOfMask(g_aoTestBit32, g_aoTestBit32)) { break; } if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32) { break; } if (afTestFlags.OnlySignalSingleFlagOutOfMask(g_aoTestBit32, g_aoTestBit32)) { break; } if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32) { break; } if (afTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_aoTestAnotherBit32)) { break; } if (afTestFlags.QueryFlagsAllValues() != g_aoTestBit32) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumSetEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags; afTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true); if (afTestFlags.QueryFlagsAllValues() != 1) { break; } afTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1)) { break; } afTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN) { break; } afTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false); if (afTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumSignalEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags; afTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (afTestFlags.QueryFlagsAllValues() != 1) { break; } afTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1)) { break; } afTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1)) { break; } afTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumDropEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags(OU_UINT32_MAX); afTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 1)) { break; } afTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1)) { break; } afTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1)) { break; } afTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)~(OU_INT32_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumToggleEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags; bool bToggleFirstResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (bToggleFirstResult || afTestFlags.QueryFlagsAllValues() != 1) { break; } bool bToggleSecondResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (bToggleSecondResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1)) { break; } bool bToggleThirdResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (!bToggleThirdResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN) { break; } bool bToggleFourthResult = afTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (!bToggleFourthResult || afTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumModifyEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags; bool bModifyFirstResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true); if (!bModifyFirstResult || afTestFlags.QueryFlagsAllValues() != 1) { break; } bool bModifySecondResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true); if (!bModifySecondResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1)) { break; } bool bModifyThirdResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true); if (bModifyThirdResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1)) { break; } bool bModifyFourthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true); if (bModifyFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 1)) { break; } bool bModifyFifthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false); if (!bModifyFifthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)OU_INT32_MIN) { break; } bool bModifySixthResult = afTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false); if (!bModifySixthResult || afTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumSignalFirstEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags; bool bFirstResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (!bFirstResult || afTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (bSecondResult || afTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1); if (!bThirdResult || afTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = afTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (bFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumSignalLastEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags; bool bFirstResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (!bFirstResult || afTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (bSecondResult || afTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2); if (!bThirdResult || afTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = afTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (bFourthResult || afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_INT32_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumGetEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1)); if (!afTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT32_BITS)) { break; } if (afTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1)) { break; } if (afTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT32_BITS - 1)) { break; } if (!afTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumFindFirstEnumeratedFlag() { bool bResult = false; do { CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1)); unsigned int uiFirstResult = afTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT32_BITS); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = afTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT32_BITS - 1); if (uiSecondResult != OU_UINT32_BITS - 2) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumAllSignalEnumeratedFlags() { bool bResult = false; do { CAtomicFlags afTestFlags; afTestFlags.EnumAllSignalEnumeratedFlags(1, 1); if (afTestFlags.QueryFlagsAllValues() != 1) { break; } afTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT32_BITS - 2); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 2)) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumAllDropEnumeratedFlags() { bool bResult = false; do { CAtomicFlags afTestFlags(OU_UINT32_MAX); afTestFlags.EnumAllDropEnumeratedFlags(1, 1); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(OU_UINT32_MAX ^ 1)) { break; } afTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT32_BITS - 2); if (afTestFlags.QueryFlagsAllValues() != 2) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumAllQueryEnumeratedFlags() { bool bResult = false; do { CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1)); atomicord32 aoFirstResult = afTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT32_BITS); if (aoFirstResult != (atomicord32)(OU_INT32_MIN + 1)) { break; } atomicord32 aoSecondResult = afTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 1); if (aoSecondResult != (atomicord32)(OU_INT32_MIN)) { break; } atomicord32 aoThirdResult = afTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 2); if (aoThirdResult != 0) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_EnumAnyGetEnumeratedFlagValue() { bool bResult = false; do { CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1)); bool bFirstResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT32_BITS); if (!bFirstResult) { break; } bool bSecondResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 1); if (!bSecondResult) { break; } bool bThirdResult = afTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 2); if (bThirdResult) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_StoreFlagsEnumeratedValue() { bool bResult = false; do { CAtomicFlags afTestFlags; afTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2); if (afTestFlags.QueryFlagsAllValues() != (atomicord32)(2 << 1)) { break; } afTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT32_BITS - 2, 3); if (afTestFlags.QueryFlagsAllValues() != ((atomicord32)(2 << 1) | (atomicord32)(OU_INT32_MIN | (OU_INT32_MIN >> 1)))) { break; } bResult = true; } while (false); return bResult; } bool TestAtomicFlags_RetrieveFlagsEnumeratedValue() { bool bResult = false; do { CAtomicFlags afTestFlags((atomicord32)(OU_INT32_MIN + 1)); unsigned int aoFirstResult = afTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1); if (aoFirstResult != 0) { break; } unsigned int aoSecondResult = afTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT32_BITS - 2); if (aoSecondResult != 2) { break; } bResult = true; } while (false); return bResult; } enum EOUATOMICFLAGSFEATURE { OAF__MIN, OAF_CONSTRUCTORS = OAF__MIN, OAF_ASSIGNFLAGSALLVALUES, OAF_QUERYFLAGSALLVALUES, OAF_SETFLAGSMASKVALUE, OAF_SIGNALFLAGSMASKVALUE, OAF_DROPFLAGSMASKVALUE, OAF_TOGGLESINGLEFLAGVALUE, OAF_MODIFYSINGLEFLAGVALUE, OAF_ASSIGNFLAGSBYMASK, OAF_ALTERFLAGSBYMASK, OAF_GETFLAGSMASKVALUE, OAF_QUERYFLAGSBYMASK, OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK, OAF_ENUMSETENUMERATEDFLAGVALUE, OAF_ENUMSIGNALENUMERATEDFLAGVALUE, OAF_ENUMDROPENUMERATEDFLAGVALUE, OAF_ENUMTOGGLEENUMERATEDFLAGVALUE, OAF_ENUMMODIFYENUMERATEDFLAGVALUE, OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE, OAF_ENUMGETENUMERATEDFLAGVALUE, OAF_ENUMFINDFIRSTENUMERATEDFLAG, OAF_ENUMALLSIGNALENUMERATEDFLAGS, OAF_ENUMALLDROPENUMERATEDFLAGS, OAF_ENUMALLQUERYENUMERATEDFLAGS, OAF_ENUMANYGETENUMERATEDFLAGVALUE, OAF_STOREFLAGSENUMERATEDVALUE, OAF_RETRIEVEFLAGSENUMERATEDVALUE, OAF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestAtomicFlags_Constructors, // OAF_CONSTRUCTORS &TestAtomicFlags_AssignFlagsAllValues, // OAF_ASSIGNFLAGSALLVALUES, &TestAtomicFlags_QueryFlagsAllValues, // OAF_QUERYFLAGSALLVALUES, &TestAtomicFlags_SetFlagsMaskValue, // OAF_SETFLAGSMASKVALUE, &TestAtomicFlags_SignalFlagsMaskValue, // OAF_SIGNALFLAGSMASKVALUE, &TestAtomicFlags_DropFlagsMaskValue, // OAF_DROPFLAGSMASKVALUE, &TestAtomicFlags_ToggleSingleFlagValue, // OAF_TOGGLESINGLEFLAGVALUE, &TestAtomicFlags_ModifySingleFlagValue, // OAF_MODIFYSINGLEFLAGVALUE, &TestAtomicFlags_AssignFlagsByMask, // OAF_ASSIGNFLAGSBYMASK, &TestAtomicFlags_AlterFlagsByMask, // OAF_ALTERFLAGSBYMASK, &TestAtomicFlags_GetFlagsMaskValue, // OAF_GETFLAGSMASKVALUE, &TestAtomicFlags_QueryFlagsByMask, // OAF_QUERYFLAGSBYMASK, &TestAtomicFlags_OnlySignalSingleFlagOutOfMask, // OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK, &TestAtomicFlags_EnumSetEnumeratedFlagValue, // OAF_ENUMSETENUMERATEDFLAGVALUE, &TestAtomicFlags_EnumSignalEnumeratedFlagValue, // OAF_ENUMSIGNALENUMERATEDFLAGVALUE, &TestAtomicFlags_EnumDropEnumeratedFlagValue, // OAF_ENUMDROPENUMERATEDFLAGVALUE, &TestAtomicFlags_EnumToggleEnumeratedFlagValue, // OAF_ENUMTOGGLEENUMERATEDFLAGVALUE, &TestAtomicFlags_EnumModifyEnumeratedFlagValue, // OAF_ENUMMODIFYENUMERATEDFLAGVALUE, &TestAtomicFlags_EnumSignalFirstEnumeratedFlagValue, // OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, &TestAtomicFlags_EnumSignalLastEnumeratedFlagValue, // OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE, &TestAtomicFlags_EnumGetEnumeratedFlagValue, // OAF_ENUMGETENUMERATEDFLAGVALUE, &TestAtomicFlags_EnumFindFirstEnumeratedFlag, // OAF_ENUMFINDFIRSTENUMERATEDFLAG, &TestAtomicFlags_EnumAllSignalEnumeratedFlags, // OAF_ENUMALLSIGNALENUMERATEDFLAGS, &TestAtomicFlags_EnumAllDropEnumeratedFlags, // OAF_ENUMALLDROPENUMERATEDFLAGS, &TestAtomicFlags_EnumAllQueryEnumeratedFlags, // OAF_ENUMALLQUERYENUMERATEDFLAGS, &TestAtomicFlags_EnumAnyGetEnumeratedFlagValue, // OAF_ENUMANYGETENUMERATEDFLAGVALUE, &TestAtomicFlags_StoreFlagsEnumeratedValue, // OAF_STOREFLAGSENUMERATEDVALUE, &TestAtomicFlags_RetrieveFlagsEnumeratedValue, // OAF_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_afnAtomicFlagsFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Constructors", // OAF_CONSTRUCTORS "AssignFlagsAllValues", // OAF_ASSIGNFLAGSALLVALUES, "QueryFlagsAllValues", // OAF_QUERYFLAGSALLVALUES, "SetFlagsMaskValue", // OAF_SETFLAGSMASKVALUE, "SignalFlagsMaskValue", // OAF_SIGNALFLAGSMASKVALUE, "DropFlagsMaskValue", // OAF_DROPFLAGSMASKVALUE, "ToggleSingleFlagValue", // OAF_TOGGLESINGLEFLAGVALUE, "ModifySingleFlagValue", // OAF_MODIFYSINGLEFLAGVALUE, "AssignFlagsByMask", // OAF_ASSIGNFLAGSBYMASK, "AlterFlagsByMask", // OAF_ALTERFLAGSBYMASK, "GetFlagsMaskValue", // OAF_GETFLAGSMASKVALUE, "QueryFlagsByMask", // OAF_QUERYFLAGSBYMASK, "OnlySignalSingleFlagOutOfMask", // OAF_ONLYSIGNALSINGLEFLAGOUTOFMASK, "EnumSetEnumeratedFlagValue", // OAF_ENUMSETENUMERATEDFLAGVALUE, "EnumSignalEnumeratedFlagValue", // OAF_ENUMSIGNALENUMERATEDFLAGVALUE, "EnumDropEnumeratedFlagValue", // OAF_ENUMDROPENUMERATEDFLAGVALUE, "EnumToggleEnumeratedFlagValue", // OAF_ENUMTOGGLEENUMERATEDFLAGVALUE, "EnumModifyEnumeratedFlagValue", // OAF_ENUMMODIFYENUMERATEDFLAGVALUE, "EnumSignalFirstEnumeratedFlagValue", // OAF_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, "EnumSignalLastEnumeratedFlagValue", // OAF_ENUMSIGNALLASTENUMERATEDFLAGVALUE, "EnumGetEnumeratedFlagValue", // OAF_ENUMGETENUMERATEDFLAGVALUE, "EnumFindFirstEnumeratedFlag", // OAF_ENUMFINDFIRSTENUMERATEDFLAG, "EnumAllSignalEnumeratedFlags", // OAF_ENUMALLSIGNALENUMERATEDFLAGS, "EnumAllDropEnumeratedFlags", // OAF_ENUMALLDROPENUMERATEDFLAGS, "EnumAllQueryEnumeratedFlags", // OAF_ENUMALLQUERYENUMERATEDFLAGS, "EnumAnyGetEnumeratedFlagValue", // OAF_ENUMANYGETENUMERATEDFLAGVALUE, "StoreFlagsEnumeratedValue", // OAF_STOREFLAGSENUMERATEDVALUE, "RetrieveFlagsEnumeratedValue", // OAF_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_aszAtomicFlagsFeatureTestNames; bool TestAtomicFlags(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { bool bResult = false; nOutSuccessCount = 0; nOutTestCount = OAF__MAX; bool bAPIInitialized = false; do { if (!InitializeAtomicAPI()) { break; } bAPIInitialized = true; if (!TestSubsystem(nOutSuccessCount, nOutTestCount, OAF__MAX, g_aszAtomicFlagsFeatureTestNames.GetStoragePointer(), g_afnAtomicFlagsFeatureTestProcedures.GetStoragePointer())) { break; } bResult = true; } while (false); if (bAPIInitialized) { FinalizeAtomicAPI(); } return bResult; } #endif // #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS ////////////////////////////////////////////////////////////////////////// typedef CSimpleFlagsTemplate CSimpleFlags64; const uint64ou g_uiTestValue64 = ((uint64ou)0xA5A5A5A5 << 32) | 0xA5A5A5A5; const uint64ou g_uiTestMask64 = ((uint64ou)0xC6C6C6C6 << 32) | 0xC6C6C6C6; const uint64ou g_uiTestBit64 = (uint64ou)OU_INT64_MIN; const uint64ou g_uiTestAnotherBit64 = (uint64ou)((uint64ou)OU_INT64_MIN >> 1); bool TestSimpleFlags64_Constructors() { bool bResult = false; do { if (sizeof(CSimpleFlags64::value_type) != sizeof(uint64ou) || sizeof(CSimpleFlags64) != sizeof(uint64ou)) { break; } CSimpleFlags64 sfEmptyFlags; if (sfEmptyFlags.QueryFlagsAllValues()) { break; } CSimpleFlags64 sfFullFlags(OU_UINT64_MAX); if (sfFullFlags.QueryFlagsAllValues() != OU_UINT64_MAX) { break; } CSimpleFlags64 sfCopyOfFullFlags(sfFullFlags); if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT64_MAX) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_AssignFlagsAllValues() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; sfTestFlags.AssignFlagsAllValues(OU_UINT64_MAX); if (sfTestFlags.QueryFlagsAllValues() != OU_UINT64_MAX) { break; } sfTestFlags.AssignFlagsAllValues(0); if (sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_QueryFlagsAllValues() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64) { break; } // Double check to be sure ;-) if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_SetFlagsMaskValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); sfTestFlags.SetFlagsMaskValue(g_uiTestMask64, true); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestMask64)) { break; } sfTestFlags.SetFlagsMaskValue(g_uiTestValue64, false); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(~g_uiTestValue64 & g_uiTestMask64)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_SignalFlagsMaskValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); sfTestFlags.SignalFlagsMaskValue(g_uiTestMask64); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestMask64)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_DropFlagsMaskValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); sfTestFlags.DropFlagsMaskValue(g_uiTestMask64); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 & ~g_uiTestMask64)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_ToggleSingleFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit64); if (bPreviousValue != ((g_uiTestValue64 & g_uiTestBit64) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 ^ g_uiTestBit64)) { break; } bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit64); if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_ModifySingleFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, true); if (bFirstModification != ((g_uiTestValue64 & g_uiTestBit64) != g_uiTestBit64) || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(g_uiTestValue64 | g_uiTestBit64)) { break; } bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, bFirstModification); if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint64ou)(g_uiTestValue64 | g_uiTestBit64) : (uint64ou)(g_uiTestValue64 & ~g_uiTestBit64))) { break; } bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit64, bAnotherModification); if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint64ou)(g_uiTestValue64 | g_uiTestBit64) : (uint64ou)(g_uiTestValue64 & ~g_uiTestBit64))) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_AssignFlagsByMask() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); uint64ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask64, g_uiTestMask64); const uint64ou uiNewFlags = (g_uiTestValue64 & ~g_uiTestMask64) | g_uiTestMask64; if (uiPreviousFlags != g_uiTestValue64 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags) { break; } uint64ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue64, 0); const uint64ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue64; if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } uint64ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask64, g_uiTestMask64 & g_uiTestValue64); OU_ASSERT((g_uiTestMask64 & g_uiTestValue64) != 0); // Test degeneration const uint64ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask64) | (g_uiTestMask64 & g_uiTestValue64); OU_ASSERT(uiYetAnotherNewFlags != OU_UINT64_MAX); // Test degeneration if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_AlterFlagsByMask() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask64, g_uiTestMask64); const uint64ou uiNewFlags = (g_uiTestValue64 & ~g_uiTestMask64) | g_uiTestMask64; if (bWasModification != ((g_uiTestValue64 & g_uiTestMask64) != g_uiTestMask64) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags) { break; } bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue64, 0); const uint64ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue64; if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue64) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue64, 0); if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask64, g_uiTestMask64 & g_uiTestValue64); OU_ASSERT((g_uiTestMask64 & g_uiTestValue64) != 0); // Test degeneration const uint64ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask64) | (g_uiTestMask64 & g_uiTestValue64); OU_ASSERT(uiYetAnotherNewFlags != OU_UINT64_MAX); // Test degeneration if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask64) != (g_uiTestMask64 & g_uiTestValue64)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_GetFlagsMaskValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask64) != ((g_uiTestValue64 & g_uiTestMask64) != 0)) { break; } if (sfTestFlags.GetFlagsMaskValue(~g_uiTestValue64)) { break; } if (!sfTestFlags.GetFlagsMaskValue(OU_UINT64_MAX)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_QueryFlagsByMask() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); if (sfTestFlags.QueryFlagsByMask(g_uiTestMask64) != (uint64ou)(g_uiTestValue64 & g_uiTestMask64)) { break; } if (sfTestFlags.QueryFlagsByMask(0)) { break; } if (sfTestFlags.QueryFlagsByMask(OU_UINT64_MAX) != g_uiTestValue64) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_OnlySignalSingleFlagOutOfMask() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(g_uiTestValue64); OU_ASSERT(g_uiTestValue64 != 0); // Test degeneration if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT64_MAX, g_uiTestBit64)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue64) { break; } sfTestFlags.AssignFlagsAllValues(0); if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit64, g_uiTestBit64)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64) { break; } if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit64, g_uiTestBit64)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64) { break; } if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT64_MAX, g_uiTestAnotherBit64)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit64) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumSetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1)) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT64_BITS, false); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, false); if (sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumSignalEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT64_BITS); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1)) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT64_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1)) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumDropEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(OU_UINT64_MAX); sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT64_BITS); if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT64_MAX ^ 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT64_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)~(OU_INT64_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumToggleEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT64_BITS); if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS); if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1)) { break; } bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT64_BITS); if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN) { break; } bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS); if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumModifyEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true); if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true); if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1)) { break; } bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, true); if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1)) { break; } bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, true); if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 1)) { break; } bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT64_BITS, false); if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)OU_INT64_MIN) { break; } bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS, false); if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumSignalFirstEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT64_BITS); if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT64_BITS); if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT64_BITS - 1); if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS); if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumSignalLastEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2); if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS); if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_INT64_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumGetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1)); if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT64_BITS)) { break; } if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT64_BITS - 1)) { break; } if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT64_BITS - 1)) { break; } if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT64_BITS - 1, OU_UINT64_BITS)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumFindFirstEnumeratedFlag() { bool bResult = false; do { CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1)); unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT64_BITS); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT64_BITS - 1); if (uiSecondResult != OU_UINT64_BITS - 2) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumAllSignalEnumeratedFlags() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT64_BITS - 2); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_UINT64_MAX ^ 2)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumAllDropEnumeratedFlags() { bool bResult = false; do { CSimpleFlags64 sfTestFlags(OU_UINT64_MAX); sfTestFlags.EnumAllDropEnumeratedFlags(1, 1); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(OU_UINT64_MAX ^ 1)) { break; } sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT64_BITS - 2); if (sfTestFlags.QueryFlagsAllValues() != 2) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumAllQueryEnumeratedFlags() { bool bResult = false; do { CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1)); uint64ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT64_BITS); if (uiFirstResult != (uint64ou)(OU_INT64_MIN + 1)) { break; } uint64ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT64_BITS - 1); if (uiSecondResult != (uint64ou)(OU_INT64_MIN)) { break; } uint64ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT64_BITS - 2); if (uiThirdResult != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_EnumAnyGetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1)); bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT64_BITS); if (!bFirstResult) { break; } bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT64_BITS - 1); if (!bSecondResult) { break; } bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT64_BITS - 2); if (bThirdResult) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_StoreFlagsEnumeratedValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags; sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2); if (sfTestFlags.QueryFlagsAllValues() != (uint64ou)(2 << 1)) { break; } sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT64_BITS - 2, 3); if (sfTestFlags.QueryFlagsAllValues() != ((uint64ou)(2 << 1) | (uint64ou)(OU_INT64_MIN | (OU_INT64_MIN >> 1)))) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags64_RetrieveFlagsEnumeratedValue() { bool bResult = false; do { CSimpleFlags64 sfTestFlags((uint64ou)(OU_INT64_MIN + 1)); unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT64_BITS - 2); if (uiSecondResult != 2) { break; } bResult = true; } while (false); return bResult; } enum EOUSIMPLEFLAGSFEATURE64 { OSF64__MIN, OSF64_CONSTRUCTORS = OSF64__MIN, OSF64_ASSIGNFLAGSALLVALUES, OSF64_QUERYFLAGSALLVALUES, OSF64_SETFLAGSMASKVALUE, OSF64_SIGNALFLAGSMASKVALUE, OSF64_DROPFLAGSMASKVALUE, OSF64_TOGGLESINGLEFLAGVALUE, OSF64_MODIFYSINGLEFLAGVALUE, OSF64_ASSIGNFLAGSBYMASK, OSF64_ALTERFLAGSBYMASK, OSF64_GETFLAGSMASKVALUE, OSF64_QUERYFLAGSBYMASK, OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK, OSF64_ENUMSETENUMERATEDFLAGVALUE, OSF64_ENUMSIGNALENUMERATEDFLAGVALUE, OSF64_ENUMDROPENUMERATEDFLAGVALUE, OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE, OSF64_ENUMMODIFYENUMERATEDFLAGVALUE, OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE, OSF64_ENUMGETENUMERATEDFLAGVALUE, OSF64_ENUMFINDFIRSTENUMERATEDFLAG, OSF64_ENUMALLSIGNALENUMERATEDFLAGS, OSF64_ENUMALLDROPENUMERATEDFLAGS, OSF64_ENUMALLQUERYENUMERATEDFLAGS, OSF64_ENUMANYGETENUMERATEDFLAGVALUE, OSF64_STOREFLAGSENUMERATEDVALUE, OSF64_RETRIEVEFLAGSENUMERATEDVALUE, OSF64__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestSimpleFlags64_Constructors, // OSF64_CONSTRUCTORS &TestSimpleFlags64_AssignFlagsAllValues, // OSF64_ASSIGNFLAGSALLVALUES, &TestSimpleFlags64_QueryFlagsAllValues, // OSF64_QUERYFLAGSALLVALUES, &TestSimpleFlags64_SetFlagsMaskValue, // OSF64_SETFLAGSMASKVALUE, &TestSimpleFlags64_SignalFlagsMaskValue, // OSF64_SIGNALFLAGSMASKVALUE, &TestSimpleFlags64_DropFlagsMaskValue, // OSF64_DROPFLAGSMASKVALUE, &TestSimpleFlags64_ToggleSingleFlagValue, // OSF64_TOGGLESINGLEFLAGVALUE, &TestSimpleFlags64_ModifySingleFlagValue, // OSF64_MODIFYSINGLEFLAGVALUE, &TestSimpleFlags64_AssignFlagsByMask, // OSF64_ASSIGNFLAGSBYMASK, &TestSimpleFlags64_AlterFlagsByMask, // OSF64_ALTERFLAGSBYMASK, &TestSimpleFlags64_GetFlagsMaskValue, // OSF64_GETFLAGSMASKVALUE, &TestSimpleFlags64_QueryFlagsByMask, // OSF64_QUERYFLAGSBYMASK, &TestSimpleFlags64_OnlySignalSingleFlagOutOfMask, // OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK, &TestSimpleFlags64_EnumSetEnumeratedFlagValue, // OSF64_ENUMSETENUMERATEDFLAGVALUE, &TestSimpleFlags64_EnumSignalEnumeratedFlagValue, // OSF64_ENUMSIGNALENUMERATEDFLAGVALUE, &TestSimpleFlags64_EnumDropEnumeratedFlagValue, // OSF64_ENUMDROPENUMERATEDFLAGVALUE, &TestSimpleFlags64_EnumToggleEnumeratedFlagValue, // OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE, &TestSimpleFlags64_EnumModifyEnumeratedFlagValue, // OSF64_ENUMMODIFYENUMERATEDFLAGVALUE, &TestSimpleFlags64_EnumSignalFirstEnumeratedFlagValue, // OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, &TestSimpleFlags64_EnumSignalLastEnumeratedFlagValue, // OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE, &TestSimpleFlags64_EnumGetEnumeratedFlagValue, // OSF64_ENUMGETENUMERATEDFLAGVALUE, &TestSimpleFlags64_EnumFindFirstEnumeratedFlag, // OSF64_ENUMFINDFIRSTENUMERATEDFLAG, &TestSimpleFlags64_EnumAllSignalEnumeratedFlags, // OSF64_ENUMALLSIGNALENUMERATEDFLAGS, &TestSimpleFlags64_EnumAllDropEnumeratedFlags, // OSF64_ENUMALLDROPENUMERATEDFLAGS, &TestSimpleFlags64_EnumAllQueryEnumeratedFlags, // OSF64_ENUMALLQUERYENUMERATEDFLAGS, &TestSimpleFlags64_EnumAnyGetEnumeratedFlagValue, // OSF64_ENUMANYGETENUMERATEDFLAGVALUE, &TestSimpleFlags64_StoreFlagsEnumeratedValue, // OSF64_STOREFLAGSENUMERATEDVALUE, &TestSimpleFlags64_RetrieveFlagsEnumeratedValue, // OSF64_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_afnSimpleFlags64FeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Constructors", // OSF64_CONSTRUCTORS "AssignFlagsAllValues", // OSF64_ASSIGNFLAGSALLVALUES, "QueryFlagsAllValues", // OSF64_QUERYFLAGSALLVALUES, "SetFlagsMaskValue", // OSF64_SETFLAGSMASKVALUE, "SignalFlagsMaskValue", // OSF64_SIGNALFLAGSMASKVALUE, "DropFlagsMaskValue", // OSF64_DROPFLAGSMASKVALUE, "ToggleSingleFlagValue", // OSF64_TOGGLESINGLEFLAGVALUE, "ModifySingleFlagValue", // OSF64_MODIFYSINGLEFLAGVALUE, "AssignFlagsByMask", // OSF64_ASSIGNFLAGSBYMASK, "AlterFlagsByMask", // OSF64_ALTERFLAGSBYMASK, "GetFlagsMaskValue", // OSF64_GETFLAGSMASKVALUE, "QueryFlagsByMask", // OSF64_QUERYFLAGSBYMASK, "OnlySignalSingleFlagOutOfMask", // OSF64_ONLYSIGNALSINGLEFLAGOUTOFMASK, "EnumSetEnumeratedFlagValue", // OSF64_ENUMSETENUMERATEDFLAGVALUE, "EnumSignalEnumeratedFlagValue", // OSF64_ENUMSIGNALENUMERATEDFLAGVALUE, "EnumDropEnumeratedFlagValue", // OSF64_ENUMDROPENUMERATEDFLAGVALUE, "EnumToggleEnumeratedFlagValue", // OSF64_ENUMTOGGLEENUMERATEDFLAGVALUE, "EnumModifyEnumeratedFlagValue", // OSF64_ENUMMODIFYENUMERATEDFLAGVALUE, "EnumSignalFirstEnumeratedFlagValue", // OSF64_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, "EnumSignalLastEnumeratedFlagValue", // OSF64_ENUMSIGNALLASTENUMERATEDFLAGVALUE, "EnumGetEnumeratedFlagValue", // OSF64_ENUMGETENUMERATEDFLAGVALUE, "EnumFindFirstEnumeratedFlag", // OSF64_ENUMFINDFIRSTENUMERATEDFLAG, "EnumAllSignalEnumeratedFlags", // OSF64_ENUMALLSIGNALENUMERATEDFLAGS, "EnumAllDropEnumeratedFlags", // OSF64_ENUMALLDROPENUMERATEDFLAGS, "EnumAllQueryEnumeratedFlags", // OSF64_ENUMALLQUERYENUMERATEDFLAGS, "EnumAnyGetEnumeratedFlagValue", // OSF64_ENUMANYGETENUMERATEDFLAGVALUE, "StoreFlagsEnumeratedValue", // OSF64_STOREFLAGSENUMERATEDVALUE, "RetrieveFlagsEnumeratedValue", // OSF64_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_aszSimpleFlags64FeatureTestNames; bool TestSimpleFlags64(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF64__MAX, g_aszSimpleFlags64FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags64FeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// typedef CSimpleFlags CSimpleFlags32; const uint32ou g_uiTestValue32 = (uint32ou)0xA5A5A5A5; const uint32ou g_uiTestMask32 = (uint32ou)0xC6C6C6C6; const uint32ou g_uiTestBit32 = (uint32ou)OU_INT32_MIN; const uint32ou g_uiTestAnotherBit32 = (uint32ou)((uint32ou)OU_INT32_MIN >> 1); bool TestSimpleFlags32_Constructors() { bool bResult = false; do { if (sizeof(CSimpleFlags32::value_type) != sizeof(uint32ou) || sizeof(CSimpleFlags32) != sizeof(uint32ou)) { break; } CSimpleFlags32 sfEmptyFlags; if (sfEmptyFlags.QueryFlagsAllValues()) { break; } CSimpleFlags32 sfFullFlags(OU_UINT32_MAX); if (sfFullFlags.QueryFlagsAllValues() != OU_UINT32_MAX) { break; } CSimpleFlags32 sfCopyOfFullFlags(sfFullFlags); if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT32_MAX) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_AssignFlagsAllValues() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; sfTestFlags.AssignFlagsAllValues(OU_UINT32_MAX); if (sfTestFlags.QueryFlagsAllValues() != OU_UINT32_MAX) { break; } sfTestFlags.AssignFlagsAllValues(0); if (sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_QueryFlagsAllValues() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32) { break; } // Double check to be sure ;-) if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_SetFlagsMaskValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); sfTestFlags.SetFlagsMaskValue(g_uiTestMask32, true); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestMask32)) { break; } sfTestFlags.SetFlagsMaskValue(g_uiTestValue32, false); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(~g_uiTestValue32 & g_uiTestMask32)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_SignalFlagsMaskValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); sfTestFlags.SignalFlagsMaskValue(g_uiTestMask32); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestMask32)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_DropFlagsMaskValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); sfTestFlags.DropFlagsMaskValue(g_uiTestMask32); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 & ~g_uiTestMask32)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_ToggleSingleFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit32); if (bPreviousValue != ((g_uiTestValue32 & g_uiTestBit32) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 ^ g_uiTestBit32)) { break; } bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit32); if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_ModifySingleFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, true); if (bFirstModification != ((g_uiTestValue32 & g_uiTestBit32) != g_uiTestBit32) || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(g_uiTestValue32 | g_uiTestBit32)) { break; } bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, bFirstModification); if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint32ou)(g_uiTestValue32 | g_uiTestBit32) : (uint32ou)(g_uiTestValue32 & ~g_uiTestBit32))) { break; } bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit32, bAnotherModification); if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint32ou)(g_uiTestValue32 | g_uiTestBit32) : (uint32ou)(g_uiTestValue32 & ~g_uiTestBit32))) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_AssignFlagsByMask() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); uint32ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask32, g_uiTestMask32); const uint32ou uiNewFlags = (g_uiTestValue32 & ~g_uiTestMask32) | g_uiTestMask32; if (uiPreviousFlags != g_uiTestValue32 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags) { break; } uint32ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue32, 0); const uint32ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue32; if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } uint32ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask32, g_uiTestMask32 & g_uiTestValue32); OU_ASSERT((g_uiTestMask32 & g_uiTestValue32) != 0); // Test degeneration const uint32ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask32) | (g_uiTestMask32 & g_uiTestValue32); OU_ASSERT(uiYetAnotherNewFlags != OU_UINT32_MAX); // Test degeneration if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_AlterFlagsByMask() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask32, g_uiTestMask32); const uint32ou uiNewFlags = (g_uiTestValue32 & ~g_uiTestMask32) | g_uiTestMask32; if (bWasModification != ((g_uiTestValue32 & g_uiTestMask32) != g_uiTestMask32) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags) { break; } bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue32, 0); const uint32ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue32; if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue32) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue32, 0); if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask32, g_uiTestMask32 & g_uiTestValue32); OU_ASSERT((g_uiTestMask32 & g_uiTestValue32) != 0); // Test degeneration const uint32ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask32) | (g_uiTestMask32 & g_uiTestValue32); OU_ASSERT(uiYetAnotherNewFlags != OU_UINT32_MAX); // Test degeneration if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask32) != (g_uiTestMask32 & g_uiTestValue32)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_GetFlagsMaskValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask32) != ((g_uiTestValue32 & g_uiTestMask32) != 0)) { break; } if (sfTestFlags.GetFlagsMaskValue(~g_uiTestValue32)) { break; } if (!sfTestFlags.GetFlagsMaskValue(OU_UINT32_MAX)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_QueryFlagsByMask() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); if (sfTestFlags.QueryFlagsByMask(g_uiTestMask32) != (uint32ou)(g_uiTestValue32 & g_uiTestMask32)) { break; } if (sfTestFlags.QueryFlagsByMask(0)) { break; } if (sfTestFlags.QueryFlagsByMask(OU_UINT32_MAX) != g_uiTestValue32) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_OnlySignalSingleFlagOutOfMask() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(g_uiTestValue32); OU_ASSERT(g_uiTestValue32 != 0); // Test degeneration if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_uiTestBit32)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue32) { break; } sfTestFlags.AssignFlagsAllValues(0); if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit32, g_uiTestBit32)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32) { break; } if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit32, g_uiTestBit32)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32) { break; } if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT32_MAX, g_uiTestAnotherBit32)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit32) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumSetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1)) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false); if (sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumSignalEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1)) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1)) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumDropEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(OU_UINT32_MAX); sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT32_MAX ^ 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)~(OU_INT32_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumToggleEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1)) { break; } bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN) { break; } bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumModifyEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true); if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true); if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1)) { break; } bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, true); if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1)) { break; } bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, true); if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 1)) { break; } bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT32_BITS, false); if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)OU_INT32_MIN) { break; } bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS, false); if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumSignalFirstEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT32_BITS); if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1); if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumSignalLastEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2); if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS); if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_INT32_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumGetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1)); if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT32_BITS)) { break; } if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT32_BITS - 1)) { break; } if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT32_BITS - 1)) { break; } if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT32_BITS - 1, OU_UINT32_BITS)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumFindFirstEnumeratedFlag() { bool bResult = false; do { CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1)); unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT32_BITS); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT32_BITS - 1); if (uiSecondResult != OU_UINT32_BITS - 2) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumAllSignalEnumeratedFlags() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT32_BITS - 2); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_UINT32_MAX ^ 2)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumAllDropEnumeratedFlags() { bool bResult = false; do { CSimpleFlags32 sfTestFlags(OU_UINT32_MAX); sfTestFlags.EnumAllDropEnumeratedFlags(1, 1); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(OU_UINT32_MAX ^ 1)) { break; } sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT32_BITS - 2); if (sfTestFlags.QueryFlagsAllValues() != 2) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumAllQueryEnumeratedFlags() { bool bResult = false; do { CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1)); uint32ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT32_BITS); if (uiFirstResult != (uint32ou)(OU_INT32_MIN + 1)) { break; } uint32ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 1); if (uiSecondResult != (uint32ou)(OU_INT32_MIN)) { break; } uint32ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT32_BITS - 2); if (uiThirdResult != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_EnumAnyGetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1)); bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT32_BITS); if (!bFirstResult) { break; } bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 1); if (!bSecondResult) { break; } bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT32_BITS - 2); if (bThirdResult) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_StoreFlagsEnumeratedValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags; sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2); if (sfTestFlags.QueryFlagsAllValues() != (uint32ou)(2 << 1)) { break; } sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT32_BITS - 2, 3); if (sfTestFlags.QueryFlagsAllValues() != ((uint32ou)(2 << 1) | (uint32ou)(OU_INT32_MIN | (OU_INT32_MIN >> 1)))) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags32_RetrieveFlagsEnumeratedValue() { bool bResult = false; do { CSimpleFlags32 sfTestFlags((uint32ou)(OU_INT32_MIN + 1)); unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT32_BITS - 2); if (uiSecondResult != 2) { break; } bResult = true; } while (false); return bResult; } enum EOUSIMPLEFLAGSFEATURE32 { OSF32__MIN, OSF32_CONSTRUCTORS = OSF32__MIN, OSF32_ASSIGNFLAGSALLVALUES, OSF32_QUERYFLAGSALLVALUES, OSF32_SETFLAGSMASKVALUE, OSF32_SIGNALFLAGSMASKVALUE, OSF32_DROPFLAGSMASKVALUE, OSF32_TOGGLESINGLEFLAGVALUE, OSF32_MODIFYSINGLEFLAGVALUE, OSF32_ASSIGNFLAGSBYMASK, OSF32_ALTERFLAGSBYMASK, OSF32_GETFLAGSMASKVALUE, OSF32_QUERYFLAGSBYMASK, OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK, OSF32_ENUMSETENUMERATEDFLAGVALUE, OSF32_ENUMSIGNALENUMERATEDFLAGVALUE, OSF32_ENUMDROPENUMERATEDFLAGVALUE, OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE, OSF32_ENUMMODIFYENUMERATEDFLAGVALUE, OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE, OSF32_ENUMGETENUMERATEDFLAGVALUE, OSF32_ENUMFINDFIRSTENUMERATEDFLAG, OSF32_ENUMALLSIGNALENUMERATEDFLAGS, OSF32_ENUMALLDROPENUMERATEDFLAGS, OSF32_ENUMALLQUERYENUMERATEDFLAGS, OSF32_ENUMANYGETENUMERATEDFLAGVALUE, OSF32_STOREFLAGSENUMERATEDVALUE, OSF32_RETRIEVEFLAGSENUMERATEDVALUE, OSF32__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestSimpleFlags32_Constructors, // OSF32_CONSTRUCTORS &TestSimpleFlags32_AssignFlagsAllValues, // OSF32_ASSIGNFLAGSALLVALUES, &TestSimpleFlags32_QueryFlagsAllValues, // OSF32_QUERYFLAGSALLVALUES, &TestSimpleFlags32_SetFlagsMaskValue, // OSF32_SETFLAGSMASKVALUE, &TestSimpleFlags32_SignalFlagsMaskValue, // OSF32_SIGNALFLAGSMASKVALUE, &TestSimpleFlags32_DropFlagsMaskValue, // OSF32_DROPFLAGSMASKVALUE, &TestSimpleFlags32_ToggleSingleFlagValue, // OSF32_TOGGLESINGLEFLAGVALUE, &TestSimpleFlags32_ModifySingleFlagValue, // OSF32_MODIFYSINGLEFLAGVALUE, &TestSimpleFlags32_AssignFlagsByMask, // OSF32_ASSIGNFLAGSBYMASK, &TestSimpleFlags32_AlterFlagsByMask, // OSF32_ALTERFLAGSBYMASK, &TestSimpleFlags32_GetFlagsMaskValue, // OSF32_GETFLAGSMASKVALUE, &TestSimpleFlags32_QueryFlagsByMask, // OSF32_QUERYFLAGSBYMASK, &TestSimpleFlags32_OnlySignalSingleFlagOutOfMask, // OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK, &TestSimpleFlags32_EnumSetEnumeratedFlagValue, // OSF32_ENUMSETENUMERATEDFLAGVALUE, &TestSimpleFlags32_EnumSignalEnumeratedFlagValue, // OSF32_ENUMSIGNALENUMERATEDFLAGVALUE, &TestSimpleFlags32_EnumDropEnumeratedFlagValue, // OSF32_ENUMDROPENUMERATEDFLAGVALUE, &TestSimpleFlags32_EnumToggleEnumeratedFlagValue, // OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE, &TestSimpleFlags32_EnumModifyEnumeratedFlagValue, // OSF32_ENUMMODIFYENUMERATEDFLAGVALUE, &TestSimpleFlags32_EnumSignalFirstEnumeratedFlagValue, // OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, &TestSimpleFlags32_EnumSignalLastEnumeratedFlagValue, // OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE, &TestSimpleFlags32_EnumGetEnumeratedFlagValue, // OSF32_ENUMGETENUMERATEDFLAGVALUE, &TestSimpleFlags32_EnumFindFirstEnumeratedFlag, // OSF32_ENUMFINDFIRSTENUMERATEDFLAG, &TestSimpleFlags32_EnumAllSignalEnumeratedFlags, // OSF32_ENUMALLSIGNALENUMERATEDFLAGS, &TestSimpleFlags32_EnumAllDropEnumeratedFlags, // OSF32_ENUMALLDROPENUMERATEDFLAGS, &TestSimpleFlags32_EnumAllQueryEnumeratedFlags, // OSF32_ENUMALLQUERYENUMERATEDFLAGS, &TestSimpleFlags32_EnumAnyGetEnumeratedFlagValue, // OSF32_ENUMANYGETENUMERATEDFLAGVALUE, &TestSimpleFlags32_StoreFlagsEnumeratedValue, // OSF32_STOREFLAGSENUMERATEDVALUE, &TestSimpleFlags32_RetrieveFlagsEnumeratedValue, // OSF32_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_afnSimpleFlags32FeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Constructors", // OSF32_CONSTRUCTORS "AssignFlagsAllValues", // OSF32_ASSIGNFLAGSALLVALUES, "QueryFlagsAllValues", // OSF32_QUERYFLAGSALLVALUES, "SetFlagsMaskValue", // OSF32_SETFLAGSMASKVALUE, "SignalFlagsMaskValue", // OSF32_SIGNALFLAGSMASKVALUE, "DropFlagsMaskValue", // OSF32_DROPFLAGSMASKVALUE, "ToggleSingleFlagValue", // OSF32_TOGGLESINGLEFLAGVALUE, "ModifySingleFlagValue", // OSF32_MODIFYSINGLEFLAGVALUE, "AssignFlagsByMask", // OSF32_ASSIGNFLAGSBYMASK, "AlterFlagsByMask", // OSF32_ALTERFLAGSBYMASK, "GetFlagsMaskValue", // OSF32_GETFLAGSMASKVALUE, "QueryFlagsByMask", // OSF32_QUERYFLAGSBYMASK, "OnlySignalSingleFlagOutOfMask", // OSF32_ONLYSIGNALSINGLEFLAGOUTOFMASK, "EnumSetEnumeratedFlagValue", // OSF32_ENUMSETENUMERATEDFLAGVALUE, "EnumSignalEnumeratedFlagValue", // OSF32_ENUMSIGNALENUMERATEDFLAGVALUE, "EnumDropEnumeratedFlagValue", // OSF32_ENUMDROPENUMERATEDFLAGVALUE, "EnumToggleEnumeratedFlagValue", // OSF32_ENUMTOGGLEENUMERATEDFLAGVALUE, "EnumModifyEnumeratedFlagValue", // OSF32_ENUMMODIFYENUMERATEDFLAGVALUE, "EnumSignalFirstEnumeratedFlagValue", // OSF32_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, "EnumSignalLastEnumeratedFlagValue", // OSF32_ENUMSIGNALLASTENUMERATEDFLAGVALUE, "EnumGetEnumeratedFlagValue", // OSF32_ENUMGETENUMERATEDFLAGVALUE, "EnumFindFirstEnumeratedFlag", // OSF32_ENUMFINDFIRSTENUMERATEDFLAG, "EnumAllSignalEnumeratedFlags", // OSF32_ENUMALLSIGNALENUMERATEDFLAGS, "EnumAllDropEnumeratedFlags", // OSF32_ENUMALLDROPENUMERATEDFLAGS, "EnumAllQueryEnumeratedFlags", // OSF32_ENUMALLQUERYENUMERATEDFLAGS, "EnumAnyGetEnumeratedFlagValue", // OSF32_ENUMANYGETENUMERATEDFLAGVALUE, "StoreFlagsEnumeratedValue", // OSF32_STOREFLAGSENUMERATEDVALUE, "RetrieveFlagsEnumeratedValue", // OSF32_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_aszSimpleFlags32FeatureTestNames; bool TestSimpleFlags32(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF32__MAX, g_aszSimpleFlags32FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags32FeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// typedef CSimpleFlagsTemplate CSimpleFlags16; const uint16ou g_uiTestValue16 = (uint16ou)0xA5A5; const uint16ou g_uiTestMask16 = (uint16ou)0xC6C6; const uint16ou g_uiTestBit16 = (uint16ou)OU_INT16_MIN; const uint16ou g_uiTestAnotherBit16 = (uint16ou)((uint16ou)OU_INT16_MIN >> 1); bool TestSimpleFlags16_Constructors() { bool bResult = false; do { if (sizeof(CSimpleFlags16::value_type) != sizeof(uint16ou) || sizeof(CSimpleFlags16) != sizeof(uint16ou)) { break; } CSimpleFlags16 sfEmptyFlags; if (sfEmptyFlags.QueryFlagsAllValues()) { break; } CSimpleFlags16 sfFullFlags(OU_UINT16_MAX); if (sfFullFlags.QueryFlagsAllValues() != OU_UINT16_MAX) { break; } CSimpleFlags16 sfCopyOfFullFlags(sfFullFlags); if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT16_MAX) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_AssignFlagsAllValues() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; sfTestFlags.AssignFlagsAllValues(OU_UINT16_MAX); if (sfTestFlags.QueryFlagsAllValues() != OU_UINT16_MAX) { break; } sfTestFlags.AssignFlagsAllValues(0); if (sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_QueryFlagsAllValues() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16) { break; } // Double check to be sure ;-) if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_SetFlagsMaskValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); sfTestFlags.SetFlagsMaskValue(g_uiTestMask16, true); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestMask16)) { break; } sfTestFlags.SetFlagsMaskValue(g_uiTestValue16, false); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(~g_uiTestValue16 & g_uiTestMask16)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_SignalFlagsMaskValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); sfTestFlags.SignalFlagsMaskValue(g_uiTestMask16); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestMask16)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_DropFlagsMaskValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); sfTestFlags.DropFlagsMaskValue(g_uiTestMask16); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 & ~g_uiTestMask16)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_ToggleSingleFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit16); if (bPreviousValue != ((g_uiTestValue16 & g_uiTestBit16) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 ^ g_uiTestBit16)) { break; } bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit16); if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_ModifySingleFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, true); if (bFirstModification != ((g_uiTestValue16 & g_uiTestBit16) != g_uiTestBit16) || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(g_uiTestValue16 | g_uiTestBit16)) { break; } bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, bFirstModification); if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint16ou)(g_uiTestValue16 | g_uiTestBit16) : (uint16ou)(g_uiTestValue16 & ~g_uiTestBit16))) { break; } bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit16, bAnotherModification); if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint16ou)(g_uiTestValue16 | g_uiTestBit16) : (uint16ou)(g_uiTestValue16 & ~g_uiTestBit16))) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_AssignFlagsByMask() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); uint16ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask16, g_uiTestMask16); const uint16ou uiNewFlags = (g_uiTestValue16 & ~g_uiTestMask16) | g_uiTestMask16; if (uiPreviousFlags != g_uiTestValue16 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags) { break; } uint16ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue16, 0); const uint16ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue16; if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } uint16ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask16, g_uiTestMask16 & g_uiTestValue16); OU_ASSERT((g_uiTestMask16 & g_uiTestValue16) != 0); // Test degeneration const uint16ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask16) | (g_uiTestMask16 & g_uiTestValue16); OU_ASSERT(uiYetAnotherNewFlags != OU_UINT16_MAX); // Test degeneration if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_AlterFlagsByMask() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask16, g_uiTestMask16); const uint16ou uiNewFlags = (g_uiTestValue16 & ~g_uiTestMask16) | g_uiTestMask16; if (bWasModification != ((g_uiTestValue16 & g_uiTestMask16) != g_uiTestMask16) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags) { break; } bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue16, 0); const uint16ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue16; if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue16) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue16, 0); if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask16, g_uiTestMask16 & g_uiTestValue16); OU_ASSERT((g_uiTestMask16 & g_uiTestValue16) != 0); // Test degeneration const uint16ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask16) | (g_uiTestMask16 & g_uiTestValue16); OU_ASSERT(uiYetAnotherNewFlags != OU_UINT16_MAX); // Test degeneration if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask16) != (g_uiTestMask16 & g_uiTestValue16)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_GetFlagsMaskValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask16) != ((g_uiTestValue16 & g_uiTestMask16) != 0)) { break; } if (sfTestFlags.GetFlagsMaskValue((uint16ou)(~g_uiTestValue16))) { break; } if (!sfTestFlags.GetFlagsMaskValue(OU_UINT16_MAX)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_QueryFlagsByMask() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); if (sfTestFlags.QueryFlagsByMask(g_uiTestMask16) != (uint16ou)(g_uiTestValue16 & g_uiTestMask16)) { break; } if (sfTestFlags.QueryFlagsByMask(0)) { break; } if (sfTestFlags.QueryFlagsByMask(OU_UINT16_MAX) != g_uiTestValue16) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_OnlySignalSingleFlagOutOfMask() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(g_uiTestValue16); OU_ASSERT(g_uiTestValue16 != 0); // Test degeneration if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT16_MAX, g_uiTestBit16)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue16) { break; } sfTestFlags.AssignFlagsAllValues(0); if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit16, g_uiTestBit16)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16) { break; } if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit16, g_uiTestBit16)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16) { break; } if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT16_MAX, g_uiTestAnotherBit16)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit16) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumSetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1)) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT16_BITS, false); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, false); if (sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumSignalEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT16_BITS); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1)) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT16_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1)) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumDropEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(OU_UINT16_MAX); sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT16_BITS); if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT16_MAX ^ 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT16_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)~(OU_INT16_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumToggleEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT16_BITS); if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS); if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1)) { break; } bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT16_BITS); if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN) { break; } bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS); if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumModifyEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true); if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true); if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1)) { break; } bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, true); if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1)) { break; } bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, true); if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 1)) { break; } bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT16_BITS, false); if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)OU_INT16_MIN) { break; } bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS, false); if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumSignalFirstEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT16_BITS); if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT16_BITS); if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT16_BITS - 1); if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS); if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumSignalLastEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2); if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS); if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_INT16_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumGetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1)); if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT16_BITS)) { break; } if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT16_BITS - 1)) { break; } if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT16_BITS - 1)) { break; } if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT16_BITS - 1, OU_UINT16_BITS)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumFindFirstEnumeratedFlag() { bool bResult = false; do { CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1)); unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT16_BITS); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT16_BITS - 1); if (uiSecondResult != OU_UINT16_BITS - 2) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumAllSignalEnumeratedFlags() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT16_BITS - 2); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_UINT16_MAX ^ 2)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumAllDropEnumeratedFlags() { bool bResult = false; do { CSimpleFlags16 sfTestFlags(OU_UINT16_MAX); sfTestFlags.EnumAllDropEnumeratedFlags(1, 1); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(OU_UINT16_MAX ^ 1)) { break; } sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT16_BITS - 2); if (sfTestFlags.QueryFlagsAllValues() != 2) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumAllQueryEnumeratedFlags() { bool bResult = false; do { CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1)); uint16ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT16_BITS); if (uiFirstResult != (uint16ou)(OU_INT16_MIN + 1)) { break; } uint16ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT16_BITS - 1); if (uiSecondResult != (uint16ou)(OU_INT16_MIN)) { break; } uint16ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT16_BITS - 2); if (uiThirdResult != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_EnumAnyGetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1)); bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT16_BITS); if (!bFirstResult) { break; } bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT16_BITS - 1); if (!bSecondResult) { break; } bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT16_BITS - 2); if (bThirdResult) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_StoreFlagsEnumeratedValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags; sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2); if (sfTestFlags.QueryFlagsAllValues() != (uint16ou)(2 << 1)) { break; } sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT16_BITS - 2, 3); if (sfTestFlags.QueryFlagsAllValues() != ((uint16ou)(2 << 1) | (uint16ou)(OU_INT16_MIN | (OU_INT16_MIN >> 1)))) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags16_RetrieveFlagsEnumeratedValue() { bool bResult = false; do { CSimpleFlags16 sfTestFlags((uint16ou)(OU_INT16_MIN + 1)); unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT16_BITS - 2); if (uiSecondResult != 2) { break; } bResult = true; } while (false); return bResult; } enum EOUSIMPLEFLAGSFEATURE16 { OSF16__MIN, OSF16_CONSTRUCTORS = OSF16__MIN, OSF16_ASSIGNFLAGSALLVALUES, OSF16_QUERYFLAGSALLVALUES, OSF16_SETFLAGSMASKVALUE, OSF16_SIGNALFLAGSMASKVALUE, OSF16_DROPFLAGSMASKVALUE, OSF16_TOGGLESINGLEFLAGVALUE, OSF16_MODIFYSINGLEFLAGVALUE, OSF16_ASSIGNFLAGSBYMASK, OSF16_ALTERFLAGSBYMASK, OSF16_GETFLAGSMASKVALUE, OSF16_QUERYFLAGSBYMASK, OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK, OSF16_ENUMSETENUMERATEDFLAGVALUE, OSF16_ENUMSIGNALENUMERATEDFLAGVALUE, OSF16_ENUMDROPENUMERATEDFLAGVALUE, OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE, OSF16_ENUMMODIFYENUMERATEDFLAGVALUE, OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE, OSF16_ENUMGETENUMERATEDFLAGVALUE, OSF16_ENUMFINDFIRSTENUMERATEDFLAG, OSF16_ENUMALLSIGNALENUMERATEDFLAGS, OSF16_ENUMALLDROPENUMERATEDFLAGS, OSF16_ENUMALLQUERYENUMERATEDFLAGS, OSF16_ENUMANYGETENUMERATEDFLAGVALUE, OSF16_STOREFLAGSENUMERATEDVALUE, OSF16_RETRIEVEFLAGSENUMERATEDVALUE, OSF16__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestSimpleFlags16_Constructors, // OSF16_CONSTRUCTORS &TestSimpleFlags16_AssignFlagsAllValues, // OSF16_ASSIGNFLAGSALLVALUES, &TestSimpleFlags16_QueryFlagsAllValues, // OSF16_QUERYFLAGSALLVALUES, &TestSimpleFlags16_SetFlagsMaskValue, // OSF16_SETFLAGSMASKVALUE, &TestSimpleFlags16_SignalFlagsMaskValue, // OSF16_SIGNALFLAGSMASKVALUE, &TestSimpleFlags16_DropFlagsMaskValue, // OSF16_DROPFLAGSMASKVALUE, &TestSimpleFlags16_ToggleSingleFlagValue, // OSF16_TOGGLESINGLEFLAGVALUE, &TestSimpleFlags16_ModifySingleFlagValue, // OSF16_MODIFYSINGLEFLAGVALUE, &TestSimpleFlags16_AssignFlagsByMask, // OSF16_ASSIGNFLAGSBYMASK, &TestSimpleFlags16_AlterFlagsByMask, // OSF16_ALTERFLAGSBYMASK, &TestSimpleFlags16_GetFlagsMaskValue, // OSF16_GETFLAGSMASKVALUE, &TestSimpleFlags16_QueryFlagsByMask, // OSF16_QUERYFLAGSBYMASK, &TestSimpleFlags16_OnlySignalSingleFlagOutOfMask, // OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK, &TestSimpleFlags16_EnumSetEnumeratedFlagValue, // OSF16_ENUMSETENUMERATEDFLAGVALUE, &TestSimpleFlags16_EnumSignalEnumeratedFlagValue, // OSF16_ENUMSIGNALENUMERATEDFLAGVALUE, &TestSimpleFlags16_EnumDropEnumeratedFlagValue, // OSF16_ENUMDROPENUMERATEDFLAGVALUE, &TestSimpleFlags16_EnumToggleEnumeratedFlagValue, // OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE, &TestSimpleFlags16_EnumModifyEnumeratedFlagValue, // OSF16_ENUMMODIFYENUMERATEDFLAGVALUE, &TestSimpleFlags16_EnumSignalFirstEnumeratedFlagValue, // OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, &TestSimpleFlags16_EnumSignalLastEnumeratedFlagValue, // OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE, &TestSimpleFlags16_EnumGetEnumeratedFlagValue, // OSF16_ENUMGETENUMERATEDFLAGVALUE, &TestSimpleFlags16_EnumFindFirstEnumeratedFlag, // OSF16_ENUMFINDFIRSTENUMERATEDFLAG, &TestSimpleFlags16_EnumAllSignalEnumeratedFlags, // OSF16_ENUMALLSIGNALENUMERATEDFLAGS, &TestSimpleFlags16_EnumAllDropEnumeratedFlags, // OSF16_ENUMALLDROPENUMERATEDFLAGS, &TestSimpleFlags16_EnumAllQueryEnumeratedFlags, // OSF16_ENUMALLQUERYENUMERATEDFLAGS, &TestSimpleFlags16_EnumAnyGetEnumeratedFlagValue, // OSF16_ENUMANYGETENUMERATEDFLAGVALUE, &TestSimpleFlags16_StoreFlagsEnumeratedValue, // OSF16_STOREFLAGSENUMERATEDVALUE, &TestSimpleFlags16_RetrieveFlagsEnumeratedValue, // OSF16_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_afnSimpleFlags16FeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Constructors", // OSF16_CONSTRUCTORS "AssignFlagsAllValues", // OSF16_ASSIGNFLAGSALLVALUES, "QueryFlagsAllValues", // OSF16_QUERYFLAGSALLVALUES, "SetFlagsMaskValue", // OSF16_SETFLAGSMASKVALUE, "SignalFlagsMaskValue", // OSF16_SIGNALFLAGSMASKVALUE, "DropFlagsMaskValue", // OSF16_DROPFLAGSMASKVALUE, "ToggleSingleFlagValue", // OSF16_TOGGLESINGLEFLAGVALUE, "ModifySingleFlagValue", // OSF16_MODIFYSINGLEFLAGVALUE, "AssignFlagsByMask", // OSF16_ASSIGNFLAGSBYMASK, "AlterFlagsByMask", // OSF16_ALTERFLAGSBYMASK, "GetFlagsMaskValue", // OSF16_GETFLAGSMASKVALUE, "QueryFlagsByMask", // OSF16_QUERYFLAGSBYMASK, "OnlySignalSingleFlagOutOfMask", // OSF16_ONLYSIGNALSINGLEFLAGOUTOFMASK, "EnumSetEnumeratedFlagValue", // OSF16_ENUMSETENUMERATEDFLAGVALUE, "EnumSignalEnumeratedFlagValue", // OSF16_ENUMSIGNALENUMERATEDFLAGVALUE, "EnumDropEnumeratedFlagValue", // OSF16_ENUMDROPENUMERATEDFLAGVALUE, "EnumToggleEnumeratedFlagValue", // OSF16_ENUMTOGGLEENUMERATEDFLAGVALUE, "EnumModifyEnumeratedFlagValue", // OSF16_ENUMMODIFYENUMERATEDFLAGVALUE, "EnumSignalFirstEnumeratedFlagValue", // OSF16_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, "EnumSignalLastEnumeratedFlagValue", // OSF16_ENUMSIGNALLASTENUMERATEDFLAGVALUE, "EnumGetEnumeratedFlagValue", // OSF16_ENUMGETENUMERATEDFLAGVALUE, "EnumFindFirstEnumeratedFlag", // OSF16_ENUMFINDFIRSTENUMERATEDFLAG, "EnumAllSignalEnumeratedFlags", // OSF16_ENUMALLSIGNALENUMERATEDFLAGS, "EnumAllDropEnumeratedFlags", // OSF16_ENUMALLDROPENUMERATEDFLAGS, "EnumAllQueryEnumeratedFlags", // OSF16_ENUMALLQUERYENUMERATEDFLAGS, "EnumAnyGetEnumeratedFlagValue", // OSF16_ENUMANYGETENUMERATEDFLAGVALUE, "StoreFlagsEnumeratedValue", // OSF16_STOREFLAGSENUMERATEDVALUE, "RetrieveFlagsEnumeratedValue", // OSF16_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_aszSimpleFlags16FeatureTestNames; bool TestSimpleFlags16(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF16__MAX, g_aszSimpleFlags16FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags16FeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// typedef CSimpleFlagsTemplate CSimpleFlags8; const uint8ou g_uiTestValue8 = (uint8ou)0xA5; const uint8ou g_uiTestMask8 = (uint8ou)0xC6; const uint8ou g_uiTestBit8 = (uint8ou)OU_INT8_MIN; const uint8ou g_uiTestAnotherBit8 = (uint8ou)((uint8ou)OU_INT8_MIN >> 1); bool TestSimpleFlags8_Constructors() { bool bResult = false; do { if (sizeof(CSimpleFlags8::value_type) != sizeof(uint8ou) || sizeof(CSimpleFlags8) != sizeof(uint8ou)) { break; } CSimpleFlags8 sfEmptyFlags; if (sfEmptyFlags.QueryFlagsAllValues()) { break; } CSimpleFlags8 sfFullFlags(OU_UINT8_MAX); if (sfFullFlags.QueryFlagsAllValues() != OU_UINT8_MAX) { break; } CSimpleFlags8 sfCopyOfFullFlags(sfFullFlags); if (sfCopyOfFullFlags.QueryFlagsAllValues() != OU_UINT8_MAX) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_AssignFlagsAllValues() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; sfTestFlags.AssignFlagsAllValues(OU_UINT8_MAX); if (sfTestFlags.QueryFlagsAllValues() != OU_UINT8_MAX) { break; } sfTestFlags.AssignFlagsAllValues(0); if (sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_QueryFlagsAllValues() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8) { break; } // Double check to be sure ;-) if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_SetFlagsMaskValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); sfTestFlags.SetFlagsMaskValue(g_uiTestMask8, true); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestMask8)) { break; } sfTestFlags.SetFlagsMaskValue(g_uiTestValue8, false); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(~g_uiTestValue8 & g_uiTestMask8)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_SignalFlagsMaskValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); sfTestFlags.SignalFlagsMaskValue(g_uiTestMask8); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestMask8)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_DropFlagsMaskValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); sfTestFlags.DropFlagsMaskValue(g_uiTestMask8); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 & ~g_uiTestMask8)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_ToggleSingleFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); bool bPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit8); if (bPreviousValue != ((g_uiTestValue8 & g_uiTestBit8) != 0) || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 ^ g_uiTestBit8)) { break; } bool bAnotherPreviousValue = sfTestFlags.ToggleSingleFlagValue(g_uiTestBit8); if (bAnotherPreviousValue == bPreviousValue || sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_ModifySingleFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); bool bFirstModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, true); if (bFirstModification != ((g_uiTestValue8 & g_uiTestBit8) != g_uiTestBit8) || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(g_uiTestValue8 | g_uiTestBit8)) { break; } bool bAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, bFirstModification); if (bAnotherModification == bFirstModification || sfTestFlags.QueryFlagsAllValues() != (bFirstModification ? (uint8ou)(g_uiTestValue8 | g_uiTestBit8) : (uint8ou)(g_uiTestValue8 & ~g_uiTestBit8))) { break; } bool bYetAnotherModification = sfTestFlags.ModifySingleFlagValue(g_uiTestBit8, bAnotherModification); if (bYetAnotherModification != bAnotherModification || sfTestFlags.QueryFlagsAllValues() != (bAnotherModification ? (uint8ou)(g_uiTestValue8 | g_uiTestBit8) : (uint8ou)(g_uiTestValue8 & ~g_uiTestBit8))) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_AssignFlagsByMask() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); uint8ou uiPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask8, g_uiTestMask8); const uint8ou uiNewFlags = (g_uiTestValue8 & ~g_uiTestMask8) | g_uiTestMask8; if (uiPreviousFlags != g_uiTestValue8 || sfTestFlags.QueryFlagsAllValues() != uiNewFlags) { break; } uint8ou uiAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestValue8, 0); const uint8ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue8; if (uiAnotherPreviousFlags != uiNewFlags || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } uint8ou uiYetAnotherPreviousFlags = sfTestFlags.AssignFlagsByMask(g_uiTestMask8, g_uiTestMask8 & g_uiTestValue8); OU_ASSERT((g_uiTestMask8 & g_uiTestValue8) != 0); // Test degeneration const uint8ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask8) | (g_uiTestMask8 & g_uiTestValue8); OU_ASSERT(uiYetAnotherNewFlags != OU_UINT8_MAX); // Test degeneration if (uiYetAnotherPreviousFlags != uiAnotherNewFlags || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_AlterFlagsByMask() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); bool bWasModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask8, g_uiTestMask8); const uint8ou uiNewFlags = (g_uiTestValue8 & ~g_uiTestMask8) | g_uiTestMask8; if (bWasModification != ((g_uiTestValue8 & g_uiTestMask8) != g_uiTestMask8) || sfTestFlags.QueryFlagsAllValues() != uiNewFlags) { break; } bool bWasAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestValue8, 0); const uint8ou uiAnotherNewFlags = uiNewFlags & ~g_uiTestValue8; if (bWasAnotherModification != ((uiNewFlags & g_uiTestValue8) != 0) || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } bool bWasAnotherModificationRepeated = sfTestFlags.AlterFlagsByMask(g_uiTestValue8, 0); if (bWasAnotherModificationRepeated || sfTestFlags.QueryFlagsAllValues() != uiAnotherNewFlags) { break; } bool bWasYetAnotherModification = sfTestFlags.AlterFlagsByMask(g_uiTestMask8, g_uiTestMask8 & g_uiTestValue8); OU_ASSERT((g_uiTestMask8 & g_uiTestValue8) != 0); // Test degeneration const uint8ou uiYetAnotherNewFlags = (uiAnotherNewFlags & ~g_uiTestMask8) | (g_uiTestMask8 & g_uiTestValue8); OU_ASSERT(uiYetAnotherNewFlags != OU_UINT8_MAX); // Test degeneration if (bWasYetAnotherModification != ((uiAnotherNewFlags & g_uiTestMask8) != (g_uiTestMask8 & g_uiTestValue8)) || sfTestFlags.QueryFlagsAllValues() != uiYetAnotherNewFlags) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_GetFlagsMaskValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); if (sfTestFlags.GetFlagsMaskValue(g_uiTestMask8) != ((g_uiTestValue8 & g_uiTestMask8) != 0)) { break; } if (sfTestFlags.GetFlagsMaskValue((uint8ou)(~g_uiTestValue8))) { break; } if (!sfTestFlags.GetFlagsMaskValue(OU_UINT8_MAX)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_QueryFlagsByMask() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); if (sfTestFlags.QueryFlagsByMask(g_uiTestMask8) != (uint8ou)(g_uiTestValue8 & g_uiTestMask8)) { break; } if (sfTestFlags.QueryFlagsByMask(0)) { break; } if (sfTestFlags.QueryFlagsByMask(OU_UINT8_MAX) != g_uiTestValue8) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_OnlySignalSingleFlagOutOfMask() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(g_uiTestValue8); OU_ASSERT(g_uiTestValue8 != 0); // Test degeneration if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT8_MAX, g_uiTestBit8)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestValue8) { break; } sfTestFlags.AssignFlagsAllValues(0); if (!sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit8, g_uiTestBit8)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8) { break; } if (sfTestFlags.OnlySignalSingleFlagOutOfMask(g_uiTestBit8, g_uiTestBit8)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8) { break; } if (sfTestFlags.OnlySignalSingleFlagOutOfMask(OU_UINT8_MAX, g_uiTestAnotherBit8)) { break; } if (sfTestFlags.QueryFlagsAllValues() != g_uiTestBit8) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumSetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1)) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, 0, OU_UINT8_BITS, false); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN) { break; } sfTestFlags.EnumSetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, false); if (sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumSignalEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT8_BITS); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1)) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, 0, OU_UINT8_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1)) { break; } sfTestFlags.EnumSignalEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumDropEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(OU_UINT8_MAX); sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT8_BITS); if (sfTestFlags.QueryFlagsAllValues() != (OU_UINT8_MAX ^ 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, 0, OU_UINT8_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1)) { break; } sfTestFlags.EnumDropEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)~(OU_INT8_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumToggleEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; bool bToggleFirstResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT8_BITS); if (bToggleFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bToggleSecondResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS); if (bToggleSecondResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1)) { break; } bool bToggleThirdResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, 0, OU_UINT8_BITS); if (!bToggleThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN) { break; } bool bToggleFourthResult = sfTestFlags.EnumToggleEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS); if (!bToggleFourthResult || sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumModifyEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; bool bModifyFirstResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true); if (!bModifyFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bModifySecondResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true); if (!bModifySecondResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1)) { break; } bool bModifyThirdResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, true); if (bModifyThirdResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1)) { break; } bool bModifyFourthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, true); if (bModifyFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 1)) { break; } bool bModifyFifthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, 0, OU_UINT8_BITS, false); if (!bModifyFifthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)OU_INT8_MIN) { break; } bool bModifySixthResult = sfTestFlags.EnumModifyEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS, false); if (!bModifySixthResult || sfTestFlags.QueryFlagsAllValues() != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumSignalFirstEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; bool bFirstResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT8_BITS); if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, 0, OU_UINT8_BITS); if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(2, 0, OU_UINT8_BITS - 1); if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = sfTestFlags.EnumSignalFirstEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS); if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumSignalLastEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; bool bFirstResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (!bFirstResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bSecondResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 0, 1); if (bSecondResult || sfTestFlags.QueryFlagsAllValues() != 1) { break; } bool bThirdResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, 1, 2); if (!bThirdResult || sfTestFlags.QueryFlagsAllValues() != 3) { break; } bool bFourthResult = sfTestFlags.EnumSignalLastEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS); if (bFourthResult || sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_INT8_MIN + 3)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumGetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1)); if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, 0, OU_UINT8_BITS)) { break; } if (sfTestFlags.EnumGetEnumeratedFlagValue(2, 0, OU_UINT8_BITS - 1)) { break; } if (sfTestFlags.EnumGetEnumeratedFlagValue(1, 1, OU_UINT8_BITS - 1)) { break; } if (!sfTestFlags.EnumGetEnumeratedFlagValue(1, OU_UINT8_BITS - 1, OU_UINT8_BITS)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumFindFirstEnumeratedFlag() { bool bResult = false; do { CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1)); unsigned int uiFirstResult = sfTestFlags.EnumFindFirstEnumeratedFlag(1, OU_UINT8_BITS); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = sfTestFlags.EnumFindFirstEnumeratedFlag(2, OU_UINT8_BITS - 1); if (uiSecondResult != OU_UINT8_BITS - 2) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumAllSignalEnumeratedFlags() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; sfTestFlags.EnumAllSignalEnumeratedFlags(1, 1); if (sfTestFlags.QueryFlagsAllValues() != 1) { break; } sfTestFlags.EnumAllSignalEnumeratedFlags(4, OU_UINT8_BITS - 2); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_UINT8_MAX ^ 2)) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumAllDropEnumeratedFlags() { bool bResult = false; do { CSimpleFlags8 sfTestFlags(OU_UINT8_MAX); sfTestFlags.EnumAllDropEnumeratedFlags(1, 1); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(OU_UINT8_MAX ^ 1)) { break; } sfTestFlags.EnumAllDropEnumeratedFlags(4, OU_UINT8_BITS - 2); if (sfTestFlags.QueryFlagsAllValues() != 2) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumAllQueryEnumeratedFlags() { bool bResult = false; do { CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1)); uint8ou uiFirstResult = sfTestFlags.EnumAllQueryEnumeratedFlags(1, OU_UINT8_BITS); if (uiFirstResult != (uint8ou)(OU_INT8_MIN + 1)) { break; } uint8ou uiSecondResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT8_BITS - 1); if (uiSecondResult != (uint8ou)(OU_INT8_MIN)) { break; } uint8ou uiThirdResult = sfTestFlags.EnumAllQueryEnumeratedFlags(2, OU_UINT8_BITS - 2); if (uiThirdResult != 0) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_EnumAnyGetEnumeratedFlagValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1)); bool bFirstResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(1, OU_UINT8_BITS); if (!bFirstResult) { break; } bool bSecondResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT8_BITS - 1); if (!bSecondResult) { break; } bool bThirdResult = sfTestFlags.EnumAnyGetEnumeratedFlagValue(2, OU_UINT8_BITS - 2); if (bThirdResult) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_StoreFlagsEnumeratedValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags; sfTestFlags.StoreFlagsEnumeratedValue(0x03, 1, 2); if (sfTestFlags.QueryFlagsAllValues() != (uint8ou)(2 << 1)) { break; } sfTestFlags.StoreFlagsEnumeratedValue(0x03, OU_UINT8_BITS - 2, 3); if (sfTestFlags.QueryFlagsAllValues() != ((uint8ou)(2 << 1) | (uint8ou)(OU_INT8_MIN | (OU_INT8_MIN >> 1)))) { break; } bResult = true; } while (false); return bResult; } bool TestSimpleFlags8_RetrieveFlagsEnumeratedValue() { bool bResult = false; do { CSimpleFlags8 sfTestFlags((uint8ou)(OU_INT8_MIN + 1)); unsigned int uiFirstResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, 1); if (uiFirstResult != 0) { break; } unsigned int uiSecondResult = sfTestFlags.RetrieveFlagsEnumeratedValue(0x3, OU_UINT8_BITS - 2); if (uiSecondResult != 2) { break; } bResult = true; } while (false); return bResult; } enum EOUSIMPLEFLAGSFEATURE8 { OSF8__MIN, OSF8_CONSTRUCTORS = OSF8__MIN, OSF8_ASSIGNFLAGSALLVALUES, OSF8_QUERYFLAGSALLVALUES, OSF8_SETFLAGSMASKVALUE, OSF8_SIGNALFLAGSMASKVALUE, OSF8_DROPFLAGSMASKVALUE, OSF8_TOGGLESINGLEFLAGVALUE, OSF8_MODIFYSINGLEFLAGVALUE, OSF8_ASSIGNFLAGSBYMASK, OSF8_ALTERFLAGSBYMASK, OSF8_GETFLAGSMASKVALUE, OSF8_QUERYFLAGSBYMASK, OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK, OSF8_ENUMSETENUMERATEDFLAGVALUE, OSF8_ENUMSIGNALENUMERATEDFLAGVALUE, OSF8_ENUMDROPENUMERATEDFLAGVALUE, OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE, OSF8_ENUMMODIFYENUMERATEDFLAGVALUE, OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE, OSF8_ENUMGETENUMERATEDFLAGVALUE, OSF8_ENUMFINDFIRSTENUMERATEDFLAG, OSF8_ENUMALLSIGNALENUMERATEDFLAGS, OSF8_ENUMALLDROPENUMERATEDFLAGS, OSF8_ENUMALLQUERYENUMERATEDFLAGS, OSF8_ENUMANYGETENUMERATEDFLAGVALUE, OSF8_STOREFLAGSENUMERATEDVALUE, OSF8_RETRIEVEFLAGSENUMERATEDVALUE, OSF8__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestSimpleFlags8_Constructors, // OSF8_CONSTRUCTORS &TestSimpleFlags8_AssignFlagsAllValues, // OSF8_ASSIGNFLAGSALLVALUES, &TestSimpleFlags8_QueryFlagsAllValues, // OSF8_QUERYFLAGSALLVALUES, &TestSimpleFlags8_SetFlagsMaskValue, // OSF8_SETFLAGSMASKVALUE, &TestSimpleFlags8_SignalFlagsMaskValue, // OSF8_SIGNALFLAGSMASKVALUE, &TestSimpleFlags8_DropFlagsMaskValue, // OSF8_DROPFLAGSMASKVALUE, &TestSimpleFlags8_ToggleSingleFlagValue, // OSF8_TOGGLESINGLEFLAGVALUE, &TestSimpleFlags8_ModifySingleFlagValue, // OSF8_MODIFYSINGLEFLAGVALUE, &TestSimpleFlags8_AssignFlagsByMask, // OSF8_ASSIGNFLAGSBYMASK, &TestSimpleFlags8_AlterFlagsByMask, // OSF8_ALTERFLAGSBYMASK, &TestSimpleFlags8_GetFlagsMaskValue, // OSF8_GETFLAGSMASKVALUE, &TestSimpleFlags8_QueryFlagsByMask, // OSF8_QUERYFLAGSBYMASK, &TestSimpleFlags8_OnlySignalSingleFlagOutOfMask, // OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK, &TestSimpleFlags8_EnumSetEnumeratedFlagValue, // OSF8_ENUMSETENUMERATEDFLAGVALUE, &TestSimpleFlags8_EnumSignalEnumeratedFlagValue, // OSF8_ENUMSIGNALENUMERATEDFLAGVALUE, &TestSimpleFlags8_EnumDropEnumeratedFlagValue, // OSF8_ENUMDROPENUMERATEDFLAGVALUE, &TestSimpleFlags8_EnumToggleEnumeratedFlagValue, // OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE, &TestSimpleFlags8_EnumModifyEnumeratedFlagValue, // OSF8_ENUMMODIFYENUMERATEDFLAGVALUE, &TestSimpleFlags8_EnumSignalFirstEnumeratedFlagValue, // OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, &TestSimpleFlags8_EnumSignalLastEnumeratedFlagValue, // OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE, &TestSimpleFlags8_EnumGetEnumeratedFlagValue, // OSF8_ENUMGETENUMERATEDFLAGVALUE, &TestSimpleFlags8_EnumFindFirstEnumeratedFlag, // OSF8_ENUMFINDFIRSTENUMERATEDFLAG, &TestSimpleFlags8_EnumAllSignalEnumeratedFlags, // OSF8_ENUMALLSIGNALENUMERATEDFLAGS, &TestSimpleFlags8_EnumAllDropEnumeratedFlags, // OSF8_ENUMALLDROPENUMERATEDFLAGS, &TestSimpleFlags8_EnumAllQueryEnumeratedFlags, // OSF8_ENUMALLQUERYENUMERATEDFLAGS, &TestSimpleFlags8_EnumAnyGetEnumeratedFlagValue, // OSF8_ENUMANYGETENUMERATEDFLAGVALUE, &TestSimpleFlags8_StoreFlagsEnumeratedValue, // OSF8_STOREFLAGSENUMERATEDVALUE, &TestSimpleFlags8_RetrieveFlagsEnumeratedValue, // OSF8_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_afnSimpleFlags8FeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Constructors", // OSF8_CONSTRUCTORS "AssignFlagsAllValues", // OSF8_ASSIGNFLAGSALLVALUES, "QueryFlagsAllValues", // OSF8_QUERYFLAGSALLVALUES, "SetFlagsMaskValue", // OSF8_SETFLAGSMASKVALUE, "SignalFlagsMaskValue", // OSF8_SIGNALFLAGSMASKVALUE, "DropFlagsMaskValue", // OSF8_DROPFLAGSMASKVALUE, "ToggleSingleFlagValue", // OSF8_TOGGLESINGLEFLAGVALUE, "ModifySingleFlagValue", // OSF8_MODIFYSINGLEFLAGVALUE, "AssignFlagsByMask", // OSF8_ASSIGNFLAGSBYMASK, "AlterFlagsByMask", // OSF8_ALTERFLAGSBYMASK, "GetFlagsMaskValue", // OSF8_GETFLAGSMASKVALUE, "QueryFlagsByMask", // OSF8_QUERYFLAGSBYMASK, "OnlySignalSingleFlagOutOfMask", // OSF8_ONLYSIGNALSINGLEFLAGOUTOFMASK, "EnumSetEnumeratedFlagValue", // OSF8_ENUMSETENUMERATEDFLAGVALUE, "EnumSignalEnumeratedFlagValue", // OSF8_ENUMSIGNALENUMERATEDFLAGVALUE, "EnumDropEnumeratedFlagValue", // OSF8_ENUMDROPENUMERATEDFLAGVALUE, "EnumToggleEnumeratedFlagValue", // OSF8_ENUMTOGGLEENUMERATEDFLAGVALUE, "EnumModifyEnumeratedFlagValue", // OSF8_ENUMMODIFYENUMERATEDFLAGVALUE, "EnumSignalFirstEnumeratedFlagValue", // OSF8_ENUMSIGNALFIRSTENUMERATEDFLAGVALUE, "EnumSignalLastEnumeratedFlagValue", // OSF8_ENUMSIGNALLASTENUMERATEDFLAGVALUE, "EnumGetEnumeratedFlagValue", // OSF8_ENUMGETENUMERATEDFLAGVALUE, "EnumFindFirstEnumeratedFlag", // OSF8_ENUMFINDFIRSTENUMERATEDFLAG, "EnumAllSignalEnumeratedFlags", // OSF8_ENUMALLSIGNALENUMERATEDFLAGS, "EnumAllDropEnumeratedFlags", // OSF8_ENUMALLDROPENUMERATEDFLAGS, "EnumAllQueryEnumeratedFlags", // OSF8_ENUMALLQUERYENUMERATEDFLAGS, "EnumAnyGetEnumeratedFlagValue", // OSF8_ENUMANYGETENUMERATEDFLAGVALUE, "StoreFlagsEnumeratedValue", // OSF8_STOREFLAGSENUMERATEDVALUE, "RetrieveFlagsEnumeratedValue", // OSF8_RETRIEVEFLAGSENUMERATEDVALUE, }; static const CEnumUnsortedElementArray g_aszSimpleFlags8FeatureTestNames; bool TestSimpleFlags8(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OSF8__MAX, g_aszSimpleFlags8FeatureTestNames.GetStoragePointer(), g_afnSimpleFlags8FeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// bool TestFlagsDefines_EnumFlagsMask() { bool bResult = false; do { int64ou iMask; iMask = OU_FLAGS_ENUMFLAGS_MASK(uint8ou, 1, 1); if (iMask - 1 != 0) { break; } iMask = OU_FLAGS_ENUMFLAGS_MASK(uint8ou, 1, OU_UINT8_BITS); if (iMask ^ OU_UINT8_MAX) { break; } iMask = OU_FLAGS_ENUMFLAGS_MASK(uint16ou, 1, 1); if (iMask - 1 != 0) { break; } iMask = OU_FLAGS_ENUMFLAGS_MASK(uint16ou, 1, OU_UINT16_BITS); if (iMask ^ OU_UINT16_MAX) { break; } iMask = OU_FLAGS_ENUMFLAGS_MASK(uint32ou, 1, 1); if (iMask - 1 != 0) { break; } iMask = OU_FLAGS_ENUMFLAGS_MASK(uint32ou, 1, OU_UINT32_BITS); if (iMask ^ OU_UINT32_MAX) { break; } iMask = OU_FLAGS_ENUMFLAGS_MASK(uint64ou, 1, 1); if (iMask - 1 != 0) { break; } iMask = OU_FLAGS_ENUMFLAGS_MASK(uint64ou, 1, OU_UINT64_BITS); if (iMask ^ OU_UINT64_MAX) { break; } bResult = true; } while (false); return bResult; } bool TestFlagsDefines_EnumFlagsStartValid() { bool bResult = false; do { if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint8ou, 1, OU_UINT8_BITS)) { break; } /* if (OU_FLAGS_ENUMFLAGS_START_VALID(uint8ou, 1, OU_UINT8_BITS + 1)) { break; } */ if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint16ou, 1, OU_UINT16_BITS)) { break; } /* if (OU_FLAGS_ENUMFLAGS_START_VALID(uint16ou, 1, OU_UINT16_BITS + 1)) { break; } */ if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint32ou, 1, OU_UINT32_BITS)) { break; } /* if (OU_FLAGS_ENUMFLAGS_START_VALID(uint32ou, 1, OU_UINT32_BITS + 1)) { break; } */ if (!OU_FLAGS_ENUMFLAGS_START_VALID(uint64ou, 1, OU_UINT64_BITS)) { break; } /* if (OU_FLAGS_ENUMFLAGS_START_VALID(uint64ou, 1, OU_UINT64_BITS + 1)) { break; } */ bResult = true; } while (false); return bResult; } bool TestFlagsDefines_StoreEnumValueInMask() { bool bResult = false; do { if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 1)) { break; } if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 0, OU_UINT8_MAX) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, OU_UINT8_MAX, OU_UINT8_MAX)) { break; } if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 2, 1)) { break; } if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint8ou, 1, 0)) { break; } if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 1)) { break; } if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 0, OU_UINT16_MAX) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, OU_UINT16_MAX, OU_UINT16_MAX)) { break; } if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 2, 1)) { break; } if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint16ou, 1, 0)) { break; } if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 1)) { break; } if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 0, OU_UINT32_MAX) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, OU_UINT32_MAX, OU_UINT32_MAX)) { break; } if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 2, 1)) { break; } if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint32ou, 1, 0)) { break; } if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 0, 1) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 1)) { break; } if (!OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 0, OU_UINT64_MAX) || !OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, OU_UINT64_MAX, OU_UINT64_MAX)) { break; } if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 2) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 2, 1)) { break; } if (OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 0, 0) || OU_FLAGS_STOREENUM_VALUE_IN_MASK(uint64ou, 1, 0)) { break; } bResult = true; } while (false); return bResult; } bool TestFlagsDefines_FlagIsSingle() { bool bResult = false; do { if (!OU_FLAGS_FLAG_IS_SINGLE(uint8ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint8ou, OU_INT8_MIN)) { break; } if (OU_FLAGS_FLAG_IS_SINGLE(uint8ou, 0) || OU_FLAGS_FLAG_IS_SINGLE(uint8ou, 3) || OU_FLAGS_FLAG_IS_SINGLE(uint8ou, OU_INT8_MIN + 1)) { break; } if (!OU_FLAGS_FLAG_IS_SINGLE(uint16ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint16ou, OU_INT16_MIN)) { break; } if (OU_FLAGS_FLAG_IS_SINGLE(uint16ou, 0) || OU_FLAGS_FLAG_IS_SINGLE(uint16ou, 3) || OU_FLAGS_FLAG_IS_SINGLE(uint16ou, OU_INT16_MIN + 1)) { break; } if (!OU_FLAGS_FLAG_IS_SINGLE(uint32ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint32ou, OU_INT32_MIN)) { break; } if (OU_FLAGS_FLAG_IS_SINGLE(uint32ou, 0) || OU_FLAGS_FLAG_IS_SINGLE(uint32ou, 3) || OU_FLAGS_FLAG_IS_SINGLE(uint32ou, OU_INT32_MIN + 1)) { break; } if (!OU_FLAGS_FLAG_IS_SINGLE(uint64ou, 1) || !OU_FLAGS_FLAG_IS_SINGLE(uint64ou, OU_INT64_MIN)) { break; } if (OU_FLAGS_FLAG_IS_SINGLE(uint64ou, 0) || OU_FLAGS_FLAG_IS_SINGLE(uint64ou, 3) || OU_FLAGS_FLAG_IS_SINGLE(uint64ou, OU_INT64_MIN + 1)) { break; } bResult = true; } while (false); return bResult; } enum EOUFLAGSDEFINESFEATURE { OFF__MIN, OFF_ENUMFLAGS_MASK = OFF__MIN, OFF_ENUMFLAGS_START_VALID, OFF_STOREENUM_VALUE_IN_MASK, OFF_FLAG_IS_SINGLE, OFF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestFlagsDefines_EnumFlagsMask, // OFF_ENUMFLAGS_MASK, &TestFlagsDefines_EnumFlagsStartValid, // OFF_ENUMFLAGS_START_VALID, &TestFlagsDefines_StoreEnumValueInMask, // OFF_STOREENUM_VALUE_IN_MASK, &TestFlagsDefines_FlagIsSingle, // OFF_FLAG_IS_SINGLE, }; static const CEnumUnsortedElementArray g_afnFlagsDefineFeatureTestProcedures; template<>const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "ENUMFLAGS_MASK", // OFF_ENUMFLAGS_MASK = OFF__MIN, "ENUMFLAGS_START_VALID", // OFF_ENUMFLAGS_START_VALID, "STOREENUM_VALUE_IN_MASK", // OFF_STOREENUM_VALUE_IN_MASK, "FLAG_IS_SINGLE", // OFF_FLAG_IS_SINGLE, }; static const CEnumUnsortedElementArray g_aszFlagsDefineFeatureTestNames; bool TestFlagsDefines(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OFF__MAX, g_aszFlagsDefineFeatureTestNames.GetStoragePointer(), g_afnFlagsDefineFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// enum EENUMARRAYTESTENUM { ATE__MIN, ATE_FIRSTELEMENT = ATE__MIN, ATE_SECONDELEMENT, ATE_THIRDELEMENT, ATE__MAX, }; template<> const int CEnumUnsortedElementArray::m_aetElementArray[] = { 1, // ATE_FIRSTELEMENT, 3, // ATE_SECONDELEMENT, 2, // ATE_THIRDELEMENT, }; static const CEnumUnsortedElementArray g_ai_IntUnsortedArray; template<> const int CEnumSortedElementArray::m_aetElementArray[] = { 1, // ATE_FIRSTELEMENT, 2, // ATE_SECONDELEMENT, 3, // ATE_THIRDELEMENT, }; static const CEnumSortedElementArray g_ai_IntSortedArray; struct ConstCharPtrEq { bool operator ()(const char *szLeftValue, const char *szRightValue) const { return strcmp(szLeftValue, szRightValue) == 0; } }; struct ConstCharPtrLess { bool operator ()(const char *szLeftValue, const char *szRightValue) const { return strcmp(szLeftValue, szRightValue) < 0; } }; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "first", "third", "second", }; static const CEnumUnsortedElementArray g_aszStringUnsortedArray; template<> const char *const CEnumSortedElementArray::m_aetElementArray[] = { "first", "second", "third", }; static const CEnumSortedElementArray g_aszStringSortedArray; bool TestEnumArrays_UnsortedArray() { EENUMARRAYTESTENUM teEnumCurrent = ATE__MIN; for (; teEnumCurrent != ATE__MAX; ++teEnumCurrent) { int iCurrentValue = g_ai_IntUnsortedArray.Encode(teEnumCurrent); EENUMARRAYTESTENUM teIntDecodeCheck = g_ai_IntUnsortedArray.Decode(iCurrentValue); if (!g_ai_IntUnsortedArray.IsValidDecode(teIntDecodeCheck) || teIntDecodeCheck != teEnumCurrent) { break; } if (g_ai_IntUnsortedArray.GetStoragePointer()[teEnumCurrent] != iCurrentValue) { break; } const char *szCurrentString = g_aszStringUnsortedArray.Encode(teEnumCurrent); EENUMARRAYTESTENUM teStringDecodeCheck = g_aszStringUnsortedArray.Decode(szCurrentString); if (!g_aszStringUnsortedArray.IsValidDecode(teStringDecodeCheck) || teStringDecodeCheck != teEnumCurrent) { break; } if (strcmp(g_aszStringUnsortedArray.GetStoragePointer()[teEnumCurrent], szCurrentString) != 0) { break; } EENUMARRAYTESTENUM teInvalidDecodeCheck = g_aszStringUnsortedArray.Decode(szCurrentString + 1); if (teInvalidDecodeCheck != ATE__MAX || g_aszStringUnsortedArray.IsValidDecode(teInvalidDecodeCheck)) { break; } } bool bResult = teEnumCurrent == ATE__MAX; return bResult; } bool TestEnumArrays_SortedArray() { EENUMARRAYTESTENUM teEnumCurrent = ATE__MIN; for (; teEnumCurrent != ATE__MAX; ++teEnumCurrent) { int iCurrentValue = g_ai_IntSortedArray.Encode(teEnumCurrent); EENUMARRAYTESTENUM teIntDecodeCheck = g_ai_IntSortedArray.Decode(iCurrentValue); if (!g_ai_IntSortedArray.IsValidDecode(teIntDecodeCheck) || teIntDecodeCheck != teEnumCurrent) { break; } if (g_ai_IntSortedArray.GetStoragePointer()[teEnumCurrent] != iCurrentValue) { break; } const char *szCurrentString = g_aszStringSortedArray.Encode(teEnumCurrent); EENUMARRAYTESTENUM teStringDecodeCheck = g_aszStringSortedArray.Decode(szCurrentString); if (!g_aszStringSortedArray.IsValidDecode(teStringDecodeCheck) || teStringDecodeCheck != teEnumCurrent) { break; } if (strcmp(g_aszStringSortedArray.GetStoragePointer()[teEnumCurrent], szCurrentString) != 0) { break; } EENUMARRAYTESTENUM teInvalidDecodeCheck = g_aszStringSortedArray.Decode(szCurrentString + 1); if (teInvalidDecodeCheck != ATE__MAX || g_aszStringSortedArray.IsValidDecode(teInvalidDecodeCheck)) { break; } } bool bResult = teEnumCurrent == ATE__MAX; return bResult; } enum EOUENUMARRAYSFEATURE { ORF__MIN, ORF_UNSORTEDARRAY = ORF__MIN, ORF_SORTEDARRAY, ORF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestEnumArrays_UnsortedArray, // ORF_UNSORTEDARRAY, &TestEnumArrays_SortedArray, // ORF_SORTEDARRAY, }; static const CEnumUnsortedElementArray g_afnEnumArrayFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Unsorted Array", // ORF_UNSORTEDARRAY, "Sorted Array", // ORF_SORTEDARRAY, }; static const CEnumUnsortedElementArray g_aszEnumArrayFeatureTestNames; bool TestEnumArrays(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, ORF__MAX, g_aszEnumArrayFeatureTestNames.GetStoragePointer(), g_afnEnumArrayFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// enum ETESTTEMPLATES8 { TT8_ONE, TT8_TWO, }; enum ETESTTEMPLATES16 { TT16_ONE = 1000, TT16_TWO, }; enum ETESTTEMPLATES32 { TT32_ONE = 100000, TT32_TWO, }; bool TestTemplates_PrefixIncrement() { bool bResult = false; do { ETESTTEMPLATES8 t8Test = TT8_ONE; ETESTTEMPLATES16 t16Test = TT16_ONE; ETESTTEMPLATES32 t32Test = TT32_ONE; if (++t8Test != TT8_TWO || t8Test != TT8_TWO) { break; } ++t8Test = TT8_ONE; if (t8Test != TT8_ONE) { break; } if (++t16Test != TT16_TWO || t16Test != TT16_TWO) { break; } ++t16Test = TT16_ONE; if (t16Test != TT16_ONE) { break; } if (++t32Test != TT32_TWO || t32Test != TT32_TWO) { break; } ++t32Test = TT32_ONE; if (t32Test != TT32_ONE) { break; } bResult = true; } while (false); return bResult; } bool TestTemplates_PostfixIncrement() { bool bResult = false; do { ETESTTEMPLATES8 t8Test = TT8_ONE; ETESTTEMPLATES16 t16Test = TT16_ONE; ETESTTEMPLATES32 t32Test = TT32_ONE; if (t8Test++ != TT8_ONE || t8Test != TT8_TWO) { break; } if (t16Test++ != TT16_ONE || t16Test != TT16_TWO) { break; } if (t32Test++ != TT32_ONE || t32Test != TT32_TWO) { break; } bResult = true; } while (false); return bResult; } bool TestTemplates_PrefixDecrement() { bool bResult = false; do { ETESTTEMPLATES8 t8Test = TT8_TWO; ETESTTEMPLATES16 t16Test = TT16_TWO; ETESTTEMPLATES32 t32Test = TT32_TWO; if (--t8Test != TT8_ONE || t8Test != TT8_ONE) { break; } --t8Test = TT8_TWO; if (t8Test != TT8_TWO) { break; } if (--t16Test != TT16_ONE || t16Test != TT16_ONE) { break; } --t16Test = TT16_TWO; if (t16Test != TT16_TWO) { break; } if (--t32Test != TT32_ONE || t32Test != TT32_ONE) { break; } --t32Test = TT32_TWO; if (t32Test != TT32_TWO) { break; } bResult = true; } while (false); return bResult; } bool TestTemplates_PostfixDecrement() { bool bResult = false; do { ETESTTEMPLATES8 t8Test = TT8_TWO; ETESTTEMPLATES16 t16Test = TT16_TWO; ETESTTEMPLATES32 t32Test = TT32_TWO; if (t8Test-- != TT8_TWO || t8Test != TT8_ONE) { break; } if (t16Test-- != TT16_TWO || t16Test != TT16_ONE) { break; } if (t32Test-- != TT32_TWO || t32Test != TT32_ONE) { break; } bResult = true; } while (false); return bResult; } bool TestTemplates_IsEmptySz() { bool bResult = false; do { const char *szData = "a"; const char *szEmpty = ""; const char *szNull = NULL; if (IsEmptySz(szData) || !IsEmptySz(szEmpty) || !IsEmptySz(szNull)) { break; } bResult = true; } while (false); return bResult; } enum EOUTEMPLATESFEATURE { OTF__MIN, OTF_PREFIXINCREMENT = OTF__MIN, OTF_POSTFIXINCREMENT, OTF_PREFIXDECREMENT, OTF_POSTFIXDECREMENT, OTF_ISEMPTYSZ, OTF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestTemplates_PrefixIncrement, // OTF_PREFIXINCREMENT, &TestTemplates_PostfixIncrement, // OTF_POSTFIXINCREMENT, &TestTemplates_PrefixDecrement, // OTF_PREFIXDECREMENT, &TestTemplates_PostfixDecrement, // OTF_POSTFIXDECREMENT, &TestTemplates_IsEmptySz, // OTF_ISEMPTYSZ, }; static const CEnumUnsortedElementArray g_afnTemplateFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Prefix Increment", // OTF_PREFIXINCREMENT, "Postfix Increment", // OTF_POSTFIXINCREMENT, "Prefix Decrement", // OTF_PREFIXDECREMENT, "Postfix Decrement", // OTF_POSTFIXDECREMENT, "IsEmptySz", // OTF_ISEMPTYSZ, }; static const CEnumUnsortedElementArray g_aszTemplateFeatureTestNames; bool TestTemplates(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OTF__MAX, g_aszTemplateFeatureTestNames.GetStoragePointer(), g_afnTemplateFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// typedef CTypeSimpleWrapper CTestWrapper; bool TestTypeWrappers_Constructors() { CTestWrapper twEmptyWrapper; CTestWrapper twZeroWrapper(0); CTestWrapper twCopyWrapper(twZeroWrapper); return true; } bool TestTypeWrappers_Comparison() { bool bResult = false; do { CTestWrapper twOneWrapper(1); CTestWrapper twTwoWrapper(2); if (!(twTwoWrapper == twTwoWrapper) || twOneWrapper == twTwoWrapper) { break; } if (twTwoWrapper != twTwoWrapper || !(twOneWrapper != twTwoWrapper)) { break; } if (!(twOneWrapper < twTwoWrapper) || twTwoWrapper < twTwoWrapper || twTwoWrapper < twOneWrapper) { break; } if (twOneWrapper > twTwoWrapper || twTwoWrapper > twTwoWrapper || !(twTwoWrapper > twOneWrapper)) { break; } if (!(twOneWrapper <= twTwoWrapper) || !(twTwoWrapper <= twTwoWrapper) || twTwoWrapper <= twOneWrapper) { break; } if (twOneWrapper >= twTwoWrapper || !(twTwoWrapper >= twTwoWrapper) || !(twTwoWrapper >= twOneWrapper)) { break; } bResult = true; } while (false); return bResult; } bool TestTypeWrappers_BoolCasts() { bool bResult = false; do { CTestWrapper twZeroWrapper(0); CTestWrapper twOneWrapper(1); /* -- cast to bool is commented in definition if (twZeroWrapper || !(false || twOneWrapper)) { break; } */ if (!(!twZeroWrapper) || !twOneWrapper) { break; } bResult = true; } while (false); return bResult; } bool TestTypeWrappers_Assignment() { bool bResult = false; do { CTestWrapper twZeroWrapper(0); CTestWrapper twOneWrapper(1); CTestWrapper twTestWrapper; CTestWrapper &twFirstAssignmentReference = (twTestWrapper = (CTestWrapper::value_type)1); if (twTestWrapper != twOneWrapper || &twFirstAssignmentReference != &twTestWrapper) { break; } CTestWrapper &twSecondAssignmentReference = (twTestWrapper = twZeroWrapper); if (twTestWrapper != twZeroWrapper || &twSecondAssignmentReference != &twTestWrapper) { break; } bResult = true; } while (false); return bResult; } bool TestTypeWrappers_DataCast() { bool bResult = false; do { const CTestWrapper twZeroWrapper(0); CTestWrapper twOneWrapper(1); const CTestWrapper::value_type &wtZeroValue = (const CTestWrapper::value_type &)twZeroWrapper; CTestWrapper::value_type &wtOneValue = (CTestWrapper::value_type &)twOneWrapper; if (wtZeroValue != 0 || wtOneValue != 1) { break; } wtOneValue = 0; if (twOneWrapper != twZeroWrapper) { break; } bResult = true; } while (false); return bResult; } bool TestTypeWrappers_DataComparison() { bool bResult = false; do { const CTestWrapper twZeroWrapper(0); const CTestWrapper twOneWrapper(1); const CTestWrapper::value_type &wtZeroValue = twZeroWrapper; const CTestWrapper::value_type &wtOneValue = twOneWrapper; if (!(twZeroWrapper == wtZeroValue) || (twZeroWrapper == wtOneValue)) { break; } if (!(wtZeroValue == twZeroWrapper) || (wtOneValue == twZeroWrapper)) { break; } if ((twZeroWrapper != wtZeroValue) || !(twZeroWrapper != wtOneValue)) { break; } if ((wtZeroValue != twZeroWrapper) || !(wtOneValue != twZeroWrapper)) { break; } if ((twZeroWrapper < wtZeroValue) || !(twZeroWrapper < wtOneValue) || (twOneWrapper < wtZeroValue)) { break; } if ((wtZeroValue < twZeroWrapper) || (wtOneValue < twZeroWrapper) || !(wtZeroValue < twOneWrapper)) { break; } if ((twZeroWrapper > wtZeroValue) || (twZeroWrapper > wtOneValue) || !(twOneWrapper > wtZeroValue)) { break; } if ((wtZeroValue > twZeroWrapper) || !(wtOneValue > twZeroWrapper) || (wtZeroValue > twOneWrapper)) { break; } if (!(twZeroWrapper <= wtZeroValue) || !(twZeroWrapper <= wtOneValue) || (twOneWrapper <= wtZeroValue)) { break; } if (!(wtZeroValue <= twZeroWrapper) || (wtOneValue <= twZeroWrapper) || !(wtZeroValue <= twOneWrapper)) { break; } if (!(twZeroWrapper >= wtZeroValue) || (twZeroWrapper >= wtOneValue) || !(twOneWrapper >= wtZeroValue)) { break; } if (!(wtZeroValue >= twZeroWrapper) || !(wtOneValue >= twZeroWrapper) || (wtZeroValue >= twOneWrapper)) { break; } bResult = true; } while (false); return bResult; } enum EOUTYPEWRAPPERFEATURE { OWF__MIN, OWF_CONSTRUCTORS = OWF__MIN, OWF_COMPARISON, OWF_BOOLCASTS, OWF_ASSIGNMENT, OWF_DATACAST, OWF_DATACOMPARISON, OWF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestTypeWrappers_Constructors, // OWF_CONSTRUCTORS, &TestTypeWrappers_Comparison, // OWF_COMPARISON, &TestTypeWrappers_BoolCasts, // OWF_BOOLCASTS, &TestTypeWrappers_Assignment, // OWF_ASSIGNMENT, &TestTypeWrappers_DataCast, // OWF_DATACAST, &TestTypeWrappers_DataComparison, // OWF_DATACOMPARISON, }; static const CEnumUnsortedElementArray g_afnTypeWrapperFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Constructors", // OWF_CONSTRUCTORS, "Comparison Operators", // OWF_COMPARISON, "Boolean Casts", // OWF_BOOLCASTS, "Assignment Operators", // OWF_ASSIGNMENT, "Data Cast", // OWF_DATACAST, "Data Comparisons", // OWF_DATACOMPARISON, }; static const CEnumUnsortedElementArray g_aszTypeWrapperFeatureTestNames; bool TestTypeWrapper(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OWF__MAX, g_aszTypeWrapperFeatureTestNames.GetStoragePointer(), g_afnTypeWrapperFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// struct CTestCustomizations_Asserts_FailureInfo { EASSERTIONFAILURESEVERITY m_fsFailureSeverity; const char *m_szAssertionExpression; const char *m_szAssertionFileName; unsigned int m_uiAssertionSourceLine; }; static const CTestCustomizations_Asserts_FailureInfo g_fiAssertInvalidInfo = { AFS__MAX, NULL, NULL, 0 }; static CTestCustomizations_Asserts_FailureInfo g_fiAssertLastInfo; void _OU_CONVENTION_CALLBACK TestCustomizations_Asserts_AssertionFailure(EASSERTIONFAILURESEVERITY fsFailureSeverity, const char *szAssertionExpression, const char *szAssertionFileName, unsigned int uiAssertionSourceLine) { g_fiAssertLastInfo.m_fsFailureSeverity = fsFailureSeverity; g_fiAssertLastInfo.m_szAssertionExpression = szAssertionExpression; g_fiAssertLastInfo.m_szAssertionFileName = szAssertionFileName; g_fiAssertLastInfo.m_uiAssertionSourceLine = uiAssertionSourceLine; } bool TestCustomizations_Asserts() { bool bResult = false; CAssertionFailedProcedure fnAssertOldHandler = CAssertionCheckCustomization::GetAssertFailureCustomHandler(); CAssertionCheckCustomization::CustomizeAssertionChecks(&TestCustomizations_Asserts_AssertionFailure); do { #if !defined(NDEBUG) // Only callback invocation is checked here. // Availability of functionality depending on preprocessor defines // is verified in OST_ASSERT subsystem. OU_ASSERT(false); // const unsigned int uiAssertToVerifyLines = 14; -- see further in code if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_ASSERT || g_fiAssertLastInfo.m_szAssertionExpression == NULL || g_fiAssertLastInfo.m_szAssertionFileName == NULL || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0 || g_fiAssertLastInfo.m_uiAssertionSourceLine == 0) { break; } CTestCustomizations_Asserts_FailureInfo fiAssertFailureInfoSave = g_fiAssertLastInfo; g_fiAssertLastInfo = g_fiAssertInvalidInfo; OU_VERIFY(false); const unsigned int uiAssertToVerifyLines = 14; if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_ASSERT || g_fiAssertLastInfo.m_szAssertionExpression == NULL || strcmp(g_fiAssertLastInfo.m_szAssertionExpression, fiAssertFailureInfoSave.m_szAssertionExpression) != 0 || g_fiAssertLastInfo.m_szAssertionFileName == NULL || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0 || g_fiAssertLastInfo.m_uiAssertionSourceLine != fiAssertFailureInfoSave.m_uiAssertionSourceLine + uiAssertToVerifyLines) { break; } g_fiAssertLastInfo = g_fiAssertInvalidInfo; #endif // #if !defined(NDEBUG) /* -- can't verify OU_CHECK() as it crashes the application on failure OU_CHECK(false); if (g_fiAssertLastInfo.m_fsFailureSeverity != AFS_CHECK || g_fiAssertLastInfo.m_szAssertionExpression == NULL || g_fiAssertLastInfo.m_szAssertionFileName == NULL || strcmp(g_fiAssertLastInfo.m_szAssertionFileName, __FILE__) != 0 || g_fiAssertLastInfo.m_uiAssertionSourceLine == 0) { break; } */ bResult = true; } while (false); CAssertionCheckCustomization::CustomizeAssertionChecks(fnAssertOldHandler); return bResult; } void *const g_pv_MallocResult = (void *)(size_t)0x12345678; bool g_bMallocInvocation = false, g_bReallocInvocation = false; bool g_bFreeInvocation = false, g_bFreeSuccess = false; void *_OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Alloc(size_t nBlockSize) { g_bMallocInvocation = true; return (void *)((ptrdiff_t)g_pv_MallocResult + nBlockSize); } void *_OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Realloc(void *pv_OldBlock, size_t nBlockNewSize) { g_bReallocInvocation = true; return (void *)((ptrdiff_t)pv_OldBlock - nBlockNewSize); } void _OU_CONVENTION_CALLBACK TestCustomizations_MemMgr_Free(void *pv_OldBlock) { g_bFreeInvocation = true; g_bFreeSuccess = pv_OldBlock == g_pv_MallocResult; } bool TestCustomizations_MemMgr() { bool bResult = false; CMemoryAllocationProcedure fnAllocationOldProcedure = CMemoryManagerCustomization::GetMemoryAllocationCustomProcedure(); CMemoryReallocationProcedure fnReallocationOldProcedure = CMemoryManagerCustomization::GetMemoryReallocationCustomProcedure(); CMemoryDeallocationProcedure fnDeallocationOldProcedure = CMemoryManagerCustomization::GetMemoryDeallocationCustomProcedure(); CMemoryManagerCustomization::CustomizeMemoryManager(&TestCustomizations_MemMgr_Alloc, &TestCustomizations_MemMgr_Realloc, &TestCustomizations_MemMgr_Free); do { const size_t nBlockSize = 0x1000; void *pv_BlockAllocated = AllocateMemoryBlock(nBlockSize); if (!g_bMallocInvocation || pv_BlockAllocated != (void *)((size_t)g_pv_MallocResult + nBlockSize)) { break; } void *pv_BlockReallocated = ReallocateMemoryBlock(pv_BlockAllocated, 2 * nBlockSize); if (!g_bReallocInvocation || pv_BlockReallocated != (void *)((size_t)g_pv_MallocResult - nBlockSize)) { break; } FreeMemoryBlock(g_pv_MallocResult); if (!g_bFreeInvocation || !g_bFreeSuccess) { break; } bResult = true; } while (false); CMemoryManagerCustomization::CustomizeMemoryManager(fnAllocationOldProcedure, fnReallocationOldProcedure, fnDeallocationOldProcedure); return bResult; } enum EOUCUSTOMIZATIONFEATURE { OCF__MIN, OCF_ASSERTS = OCF__MIN, OCF_MEMMGR, OCF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestCustomizations_Asserts, // OCF_ASSERTS, &TestCustomizations_MemMgr, // OCF_MEMMGR, }; static const CEnumUnsortedElementArray g_afnCustomizationFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "Asserts", // OCF_ASSERTS, "Memory Manager", // OCF_MEMMGR, }; static const CEnumUnsortedElementArray g_aszCustomizationFeatureTestNames; bool TestCustomization(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OCF__MAX, g_aszCustomizationFeatureTestNames.GetStoragePointer(), g_afnCustomizationFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// static const size_t g_nTestMallocBlockInitialSize = 1001; static const size_t g_nTestMallocBlockNextSize = 65501; static const uint8ou g_uiTestMallocToken = 0xAA; static void *g_pv_MemoryBlock = NULL; bool TestMallocs_Allocate() { bool bResult = false; do { g_pv_MemoryBlock = AllocateMemoryBlock(g_nTestMallocBlockInitialSize); if (g_pv_MemoryBlock == NULL || OU_ALIGNED_SIZE((size_t)g_pv_MemoryBlock, _OU_MEMORY_REQUIRED_ALIGNMENT) != (size_t)g_pv_MemoryBlock) { break; } *((uint8ou *)g_pv_MemoryBlock + g_nTestMallocBlockInitialSize - 1) = g_uiTestMallocToken; bResult = true; } while (false); return bResult; } bool TestMallocs_Reallocate() { OU_ASSERT(g_nTestMallocBlockNextSize > g_nTestMallocBlockInitialSize); bool bResult = false; do { void *pv_OldMemoryBlock = g_pv_MemoryBlock; g_pv_MemoryBlock = ReallocateMemoryBlock(pv_OldMemoryBlock, g_nTestMallocBlockNextSize); if (g_pv_MemoryBlock == NULL || OU_ALIGNED_SIZE((size_t)g_pv_MemoryBlock, _OU_MEMORY_REQUIRED_ALIGNMENT) != (size_t)g_pv_MemoryBlock) { break; } if (*((uint8ou *)g_pv_MemoryBlock + g_nTestMallocBlockInitialSize - 1) != g_uiTestMallocToken) { break; } bResult = true; } while (false); return bResult; } bool TestMallocs_Deallocate() { FreeMemoryBlock(g_pv_MemoryBlock); FreeMemoryBlock(NULL); // Free must survive NULL-pointer return true; } enum EOUMALLOCFEATURE { OLF__MIN, OLF_ALLOCATE = OLF__MIN, OLF_REALLOCATE, OLF_DEALLOCATE, OLF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestMallocs_Allocate, // OLF_ALLOCATE, &TestMallocs_Reallocate, // OLF_REALLOCATE, &TestMallocs_Deallocate, // OLF_DEALLOCATE, }; static const CEnumUnsortedElementArray g_afnMallocFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "AllocateMemoryBlock", // OLF_ALLOCATE, "ReallocateMemoryBlock", // OLF_REALLOCATE, "FreeMemoryBlock", // OLF_DEALLOCATE, }; static const CEnumUnsortedElementArray g_aszMallocFeatureTestNames; bool TestMalloc(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OLF__MAX, g_aszMallocFeatureTestNames.GetStoragePointer(), g_afnMallocFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// bool TestAsserts_FalseFunction(bool &bVarInvocation) { bool bResult = true; bVarInvocation = !bVarInvocation; bool *pv_Pointer = &bResult; if (pv_Pointer) { bResult = false; } return bResult; } bool TestAsserts_TrueFunction(bool &bVarInvocation) { bool bResult = false; bVarInvocation = !bVarInvocation; bool *pv_Pointer = &bResult; if (pv_Pointer) { bResult = true; } return bResult; } bool TestAsserts_Assert() { bool bNDebugInvocation = false, bOrdinaryInvocation = false; #if defined(NDEBUG) OU_ASSERT(TestAsserts_FalseFunction(bNDebugInvocation)); bOrdinaryInvocation = true; #endif // #if defined(NDEBUG) OU_ASSERT(TestAsserts_TrueFunction(bOrdinaryInvocation)); return !bNDebugInvocation && bOrdinaryInvocation; } bool TestAsserts_Verify() { bool bNDebugInvocation = false, bOrdinaryInvocation = false; #if defined(NDEBUG) OU_VERIFY(TestAsserts_FalseFunction(bNDebugInvocation)); #else // #if !defined(NDEBUG) bNDebugInvocation = true; #endif // #if !defined(NDEBUG) OU_VERIFY(TestAsserts_TrueFunction(bOrdinaryInvocation)); return bNDebugInvocation && bOrdinaryInvocation; } bool TestAsserts_Check() { bool bOrdinaryInvocation = false; OU_CHECK(TestAsserts_TrueFunction(bOrdinaryInvocation)); return bOrdinaryInvocation; } enum EOUASSERTFEATURE { OEF__MIN, OEF_ASSERT = OEF__MIN, OEF_VERIFY, OEF_CHECK, OEF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestAsserts_Assert, // OEF_ASSERT, &TestAsserts_Verify, // OEF_VERIFY, &TestAsserts_Check, // OEF_CHECK, }; static const CEnumUnsortedElementArray g_afnAssertFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "OU_ASSERT", // OEF_ASSERT, "OU_VERIFY", // OEF_VERIFY, "OU_CHECK", // OEF_CHECK, }; static const CEnumUnsortedElementArray g_aszAssertFeatureTestNames; bool TestAssert(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OEF__MAX, g_aszAssertFeatureTestNames.GetStoragePointer(), g_afnAssertFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// struct CTestIntTypes_int8 { int8ou m_iPad; int8ou m_iValue; }; bool TestIntTypes_Int8() { bool bResult = false; do { if (sizeof(int8ou) != 1 || offsetof(CTestIntTypes_int8, m_iValue) != 1) { break; } if (OU_INT8_BITS != sizeof(int8ou) * OU_BITS_IN_BYTE ) { break; } if ((int8ou)OU_INT8_MIN == 0 || (int8ou)(OU_INT8_MIN << 1) != 0) { break; } if (~OU_INT8_MIN != OU_INT8_MAX || ~OU_INT8_MAX != OU_INT8_MIN) { break; } bResult = true; } while (false); return bResult; } struct CTestIntTypes_uint8 { int8ou m_iPad; uint8ou m_iValue; }; bool TestIntTypes_UInt8() { bool bResult = false; do { if (sizeof(uint8ou) != 1 || offsetof(CTestIntTypes_uint8, m_iValue) != 1) { break; } if (OU_UINT8_BITS != sizeof(uint8ou) * OU_BITS_IN_BYTE) { break; } if (OU_UINT8_MIN != 0) { break; } if (!(OU_UINT8_MAX & (uint8ou)1) || (OU_UINT8_MAX >> 1) != (uint8ou)OU_INT8_MAX) { break; } bResult = true; } while (false); return bResult; } struct CTestIntTypes_int16 { int8ou m_iPad; int16ou m_iValue; }; bool TestIntTypes_Int16() { bool bResult = false; do { if (sizeof(int16ou) != 2 || offsetof(CTestIntTypes_int16, m_iValue) != 2) { break; } if (OU_INT16_BITS != sizeof(int16ou) * OU_BITS_IN_BYTE ) { break; } if ((int16ou)OU_INT16_MIN == 0 || (int16ou)(OU_INT16_MIN << 1) != 0) { break; } if (~OU_INT16_MIN != OU_INT16_MAX || ~OU_INT16_MAX != OU_INT16_MIN) { break; } bResult = true; } while (false); return bResult; } struct CTestIntTypes_uint16 { int8ou m_iPad; uint16ou m_iValue; }; bool TestIntTypes_UInt16() { bool bResult = false; do { if (sizeof(uint16ou) != 2 || offsetof(CTestIntTypes_uint16, m_iValue) != 2) { break; } if (OU_UINT16_BITS != sizeof(uint16ou) * OU_BITS_IN_BYTE) { break; } if (OU_UINT16_MIN != 0) { break; } if (!(OU_UINT16_MAX & (uint16ou)1) || (OU_UINT16_MAX >> 1) != (uint16ou)OU_INT16_MAX) { break; } bResult = true; } while (false); return bResult; } struct CTestIntTypes_int32 { int8ou m_iPad; int32ou m_iValue; }; bool TestIntTypes_Int32() { bool bResult = false; do { if (sizeof(int32ou) != 4 || offsetof(CTestIntTypes_int32, m_iValue) != 4) { break; } if (OU_INT32_BITS != sizeof(int32ou) * OU_BITS_IN_BYTE ) { break; } if ((int32ou)OU_INT32_MIN == 0 || (int32ou)(OU_INT32_MIN << 1) != 0) { break; } if (~OU_INT32_MIN != OU_INT32_MAX || ~OU_INT32_MAX != OU_INT32_MIN) { break; } bResult = true; } while (false); return bResult; } struct CTestIntTypes_uint32 { int8ou m_iPad; uint32ou m_iValue; }; bool TestIntTypes_UInt32() { bool bResult = false; do { if (sizeof(uint32ou) != 4 || offsetof(CTestIntTypes_uint32, m_iValue) != 4) { break; } if (OU_UINT32_BITS != sizeof(uint32ou) * OU_BITS_IN_BYTE) { break; } if (OU_UINT32_MIN != 0) { break; } if (!(OU_UINT32_MAX & (uint32ou)1) || (OU_UINT32_MAX >> 1) != (uint32ou)OU_INT32_MAX) { break; } bResult = true; } while (false); return bResult; } struct CTestIntTypes_int64 { int8ou m_iPad; int64ou m_iValue; }; bool TestIntTypes_Int64() { bool bResult = false; do { if (sizeof(int64ou) != 8) { break; } #if _OU_TARGET_ARCH == _OU_TARGET_ARCH_X86 && _OU_TARGET_OS != _OU_TARGET_OS_MAC if (offsetof(CTestIntTypes_int64, m_iValue) != 8) { break; } #endif if (OU_INT64_BITS != sizeof(int64ou) * OU_BITS_IN_BYTE ) { break; } if ((int64ou)OU_INT64_MIN == 0 || (int64ou)(OU_INT64_MIN << 1) != 0) { break; } if (~OU_INT64_MIN != OU_INT64_MAX || ~OU_INT64_MAX != OU_INT64_MIN) { break; } bResult = true; } while (false); return bResult; } struct CTestIntTypes_uint64 { int8ou m_iPad; uint64ou m_iValue; }; bool TestIntTypes_UInt64() { bool bResult = false; do { if (sizeof(uint64ou) != 8) { break; } #if _OU_TARGET_ARCH == _OU_TARGET_ARCH_X86 && _OU_TARGET_OS != _OU_TARGET_OS_MAC if (offsetof(CTestIntTypes_uint64, m_iValue) != 8) { break; } #endif if (OU_UINT64_BITS != sizeof(uint64ou) * OU_BITS_IN_BYTE) { break; } if (OU_UINT64_MIN != 0) { break; } if (!(OU_UINT64_MAX & (uint64ou)1) || (OU_UINT64_MAX >> 1) != (uint64ou)OU_INT64_MAX) { break; } bResult = true; } while (false); return bResult; } enum EOUINTTYPEFEATURE { OIF__MIN, OIF_INT8 = OIF__MIN, OIF_UINT8, OIF_INT16, OIF_UINT16, OIF_INT32, OIF_UINT32, OIF_INT64, OIF_UINT64, OIF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestIntTypes_Int8, // OIF_INT8, &TestIntTypes_UInt8, // OIF_UINT8, &TestIntTypes_Int16, // OIF_INT16, &TestIntTypes_UInt16, // OIF_UINT16, &TestIntTypes_Int32, // OIF_INT32, &TestIntTypes_UInt32, // OIF_UINT32, &TestIntTypes_Int64, // OIF_INT64, &TestIntTypes_UInt64, // OIF_UINT64, }; static const CEnumUnsortedElementArray g_afnIntTypeFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "int8ou", // OIF_INT8, "uint8ou", // OIF_UINT8, "int16ou", // OIF_INT16, "uint16ou", // OIF_UINT16, "int32ou", // OIF_INT32, "uint32ou", // OIF_UINT32, "int64ou", // OIF_INT64, "uint64ou", // OIF_UINT64, }; static const CEnumUnsortedElementArray g_aszIntTypeFeatureTestNames; bool TestIntTypes(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OIF__MAX, g_aszIntTypeFeatureTestNames.GetStoragePointer(), g_afnIntTypeFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// struct CTestMacros_OffsetStruct { int8ou m_i8a; int16ou m_i16a; int32ou m_i32a; int64ou m_i64; int32ou m_i32b; int16ou m_i16b; int8ou m_i8b; }; bool TestMacros_OffsetOf() { size_t sOffset_i8a = offsetof(CTestMacros_OffsetStruct, m_i8a); size_t sOffset_i16a = offsetof(CTestMacros_OffsetStruct, m_i16a); size_t sOffset_i32a = offsetof(CTestMacros_OffsetStruct, m_i32a); size_t sOffset_i64 = offsetof(CTestMacros_OffsetStruct, m_i64); size_t sOffset_i32b = offsetof(CTestMacros_OffsetStruct, m_i32b); size_t sOffset_i16b = offsetof(CTestMacros_OffsetStruct, m_i16b); size_t sOffset_i8b = offsetof(CTestMacros_OffsetStruct, m_i8b); size_t sStructSize = sizeof(CTestMacros_OffsetStruct); return true && sOffset_i8a == 0 && sOffset_i16a == 2 && sOffset_i32a == 4 && sOffset_i64 == 8 && sOffset_i32b == 16 && sOffset_i16b == 20 && sOffset_i8b == 22 && sStructSize == 24; } bool TestMacros_AlignedSize() { return true && OU_ALIGNED_SIZE(0, sizeof(int8ou)) == 0 && OU_ALIGNED_SIZE(0, sizeof(int16ou)) == 0 && OU_ALIGNED_SIZE(0, sizeof(int32ou)) == 0 && OU_ALIGNED_SIZE(0, sizeof(int64ou)) == 0 && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int8ou)) == sizeof(int8ou) && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int16ou)) == sizeof(int16ou) && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int32ou)) == sizeof(int32ou) && OU_ALIGNED_SIZE(sizeof(int8ou), sizeof(int64ou)) == sizeof(int64ou) && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int8ou)) == sizeof(int16ou) && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int16ou)) == sizeof(int16ou) && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int32ou)) == sizeof(int32ou) && OU_ALIGNED_SIZE(sizeof(int16ou), sizeof(int64ou)) == sizeof(int64ou) && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int8ou)) == sizeof(int32ou) && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int16ou)) == sizeof(int32ou) && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int32ou)) == sizeof(int32ou) && OU_ALIGNED_SIZE(sizeof(int32ou), sizeof(int64ou)) == sizeof(int64ou) && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int8ou)) == sizeof(int64ou) && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int16ou)) == sizeof(int64ou) && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int32ou)) == sizeof(int64ou) && OU_ALIGNED_SIZE(sizeof(int64ou), sizeof(int64ou)) == sizeof(int64ou); } bool TestMacros_ArraySize() { static int m_ai_Array1[1]; static int m_aai_Array11[1][1]; static int m_ai_Array2[2]; static int m_aai_Array21[2][1]; static int m_aai_Array12[1][2]; return true && OU_ARRAY_SIZE(m_ai_Array1) == 1 && OU_ARRAY_SIZE(m_aai_Array11[0]) == 1 && OU_ARRAY_SIZE(m_aai_Array11) == 1 && OU_ARRAY_SIZE(m_ai_Array2) == 2 && OU_ARRAY_SIZE(m_aai_Array21[0]) == 1 && OU_ARRAY_SIZE(m_aai_Array21) == 2 && OU_ARRAY_SIZE(m_aai_Array12[0]) == 2 && OU_ARRAY_SIZE(m_aai_Array12) == 1; } bool TestMacros_InIntRange() { char iZero = 0; char iOne = 1; char iMinusOne = -1; unsigned int uiTen = 10; unsigned int uiNotZero = ~0U; return true && !OU_IN_INT_RANGE(iZero, 0, 0) && !OU_IN_INT_RANGE(iOne, 0, 0) && !OU_IN_INT_RANGE(iMinusOne, 0, 0) && !OU_IN_INT_RANGE(uiTen, 0, 0) && !OU_IN_INT_RANGE(uiNotZero, 0, 0) && OU_IN_INT_RANGE(iZero, 0, 1) && !OU_IN_INT_RANGE(iOne, 0, 1) && !OU_IN_INT_RANGE(iMinusOne, 0, 1) && !OU_IN_INT_RANGE(uiTen, 0, 1) && !OU_IN_INT_RANGE(uiNotZero, 0, 1) && !OU_IN_INT_RANGE(iZero, 1, 2) && OU_IN_INT_RANGE(iOne, 1, 2) && !OU_IN_INT_RANGE(iMinusOne, 1, 2) && !OU_IN_INT_RANGE(uiTen, 1, 2) && !OU_IN_INT_RANGE(uiNotZero, 1, 2) && OU_IN_INT_RANGE(iZero, -1, 1) && !OU_IN_INT_RANGE(iOne, -1, 1) && OU_IN_INT_RANGE(iMinusOne, -1, 1) && !OU_IN_INT_RANGE(uiTen, -1, 1) && OU_IN_INT_RANGE(uiNotZero, -1, 1) && !OU_IN_INT_RANGE(iZero, 1, -1) && OU_IN_INT_RANGE(iOne, 1, -1) && !OU_IN_INT_RANGE(iMinusOne, 1, -1) && OU_IN_INT_RANGE(uiTen, 1, -1) && !OU_IN_INT_RANGE(uiNotZero, 1, -1); } bool TestMacros_InI64Range() { char iZero = 0; char iOne = 1; char iMinusOne = -1; unsigned int uiTen = 10; unsigned int uiNotZero = ~0U; return true && !OU_IN_I64_RANGE(iZero, 0, 0) && !OU_IN_I64_RANGE(iOne, 0, 0) && !OU_IN_I64_RANGE(iMinusOne, 0, 0) && !OU_IN_I64_RANGE(uiTen, 0, 0) && !OU_IN_I64_RANGE(uiNotZero, 0, 0) && OU_IN_I64_RANGE(iZero, 0, 1) && !OU_IN_I64_RANGE(iOne, 0, 1) && !OU_IN_I64_RANGE(iMinusOne, 0, 1) && !OU_IN_I64_RANGE(uiTen, 0, 1) && !OU_IN_I64_RANGE(uiNotZero, 0, 1) && !OU_IN_I64_RANGE(iZero, 1, 2) && OU_IN_I64_RANGE(iOne, 1, 2) && !OU_IN_I64_RANGE(iMinusOne, 1, 2) && !OU_IN_I64_RANGE(uiTen, 1, 2) && !OU_IN_I64_RANGE(uiNotZero, 1, 2) && OU_IN_I64_RANGE(iZero, -1, 1) && !OU_IN_I64_RANGE(iOne, -1, 1) && OU_IN_I64_RANGE(iMinusOne, -1, 1) && !OU_IN_I64_RANGE(uiTen, -1, 1) && !OU_IN_I64_RANGE(uiNotZero, -1, 1) && !OU_IN_I64_RANGE(iZero, 1, -1) && OU_IN_I64_RANGE(iOne, 1, -1) && !OU_IN_I64_RANGE(iMinusOne, 1, -1) && OU_IN_I64_RANGE(uiTen, 1, -1) && OU_IN_I64_RANGE(uiNotZero, 1, -1); } bool TestMacros_InSizetRange() { char iZero = 0; char iOne = 1; char iMinusOne = -1; unsigned int uiTen = 10; unsigned int uiNotZero = ~0U; return true && !OU_IN_SIZET_RANGE(iZero, 0, 0) && !OU_IN_SIZET_RANGE(iOne, 0, 0) && !OU_IN_SIZET_RANGE(iMinusOne, 0, 0) && !OU_IN_SIZET_RANGE(uiTen, 0, 0) && !OU_IN_SIZET_RANGE(uiNotZero, 0, 0) && OU_IN_SIZET_RANGE(iZero, 0, 1) && !OU_IN_SIZET_RANGE(iOne, 0, 1) && !OU_IN_SIZET_RANGE(iMinusOne, 0, 1) && !OU_IN_SIZET_RANGE(uiTen, 0, 1) && !OU_IN_SIZET_RANGE(uiNotZero, 0, 1) && !OU_IN_SIZET_RANGE(iZero, 1, 2) && OU_IN_SIZET_RANGE(iOne, 1, 2) && !OU_IN_SIZET_RANGE(iMinusOne, 1, 2) && !OU_IN_SIZET_RANGE(uiTen, 1, 2) && !OU_IN_SIZET_RANGE(uiNotZero, 1, 2) && OU_IN_SIZET_RANGE(iZero, -1, 1) && !OU_IN_SIZET_RANGE(iOne, -1, 1) && OU_IN_SIZET_RANGE(iMinusOne, -1, 1) && !OU_IN_SIZET_RANGE(uiTen, -1, 1) && OU_IN_SIZET_RANGE(uiNotZero, -1, 1) == (sizeof(size_t) == sizeof(unsigned int)) && !OU_IN_SIZET_RANGE(iZero, 1, -1) && OU_IN_SIZET_RANGE(iOne, 1, -1) && !OU_IN_SIZET_RANGE(iMinusOne, 1, -1) && OU_IN_SIZET_RANGE(uiTen, 1, -1) && OU_IN_SIZET_RANGE(uiNotZero, 1, -1) != (sizeof(size_t) == sizeof(unsigned int)); } enum EOUMACROFEATURE { OMF__MIN, OMF_OFFSETOF = OMF__MIN, OMF_ALIGNEDSIZE, OMF_ARRAYSIZE, OMF_ININTRANGE, OMF_INI64RANGE, OMF_INSIZETRANGE, OMF__MAX, }; template<> CFeatureTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestMacros_OffsetOf, // OMF_OFFSETOF, &TestMacros_AlignedSize, // OMF_ALIGNEDSIZE, &TestMacros_ArraySize, // OMF_ARRAYSIZE, &TestMacros_InIntRange, // OMF_ININTRANGE, &TestMacros_InI64Range, // OMF_INI64RANGE, &TestMacros_InSizetRange, // OMF_INSIZETRANGE, }; static const CEnumUnsortedElementArray g_afnMacroFeatureTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "offsetof", // OMF_OFFSETOF, "OU_ALIGNED_SIZE", // OMF_ALIGNEDSIZE, "OU_ARRAY_SIZE", // OMF_ARRAYSIZE, "OU_IN_INT_RANGE", // OMF_ININTRANGE, "OU_IN_I64_RANGE", // OMF_INI64RANGE, "OU_IN_SIZET_RANGE", // OMF_INSIZETRANGE, }; static const CEnumUnsortedElementArray g_aszMacroFeatureTestNames; bool TestMacros(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { return TestSubsystem(nOutSuccessCount, nOutTestCount, OMF__MAX, g_aszMacroFeatureTestNames.GetStoragePointer(), g_afnMacroFeatureTestProcedures.GetStoragePointer()); } ////////////////////////////////////////////////////////////////////////// // Verifies that target order is not changed template<> int const CEnumSortedElementArray::m_aetElementArray[] = { _OU_TARGET_OS_GENUNIX, // _OU_TARGET_OS_GENUNIX _OU_TARGET_OS_WINDOWS, // _OU_TARGET_OS_WINDOWS _OU_TARGET_OS_QNX, // _OU_TARGET_OS_QNX _OU_TARGET_OS_MAC, // _OU_TARGET_OS_MAC _OU_TARGET_OS_AIX, // _OU_TARGET_OS_AIX _OU_TARGET_OS_SUNOS, // _OU_TARGET_OS_SUNOS _OU_TARGET_OS_IOS, // _OU_TARGET_OS_IOS }; static const CEnumSortedElementArray g_ai_TargetOrderCheck; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "GENERIC UNIX", // _OU_TARGET_OS_GENUNIX "WINDOWS", // _OU_TARGET_OS_WINDOWS "QNX", // _OU_TARGET_OS_QNX "MAC", // _OU_TARGET_OS_MAC "AIX", // _OU_TARGET_OS_AIX "SunOS", // _OU_TARGET_OS_SUNOS "iOS", // _OU_TARGET_OS_IOS }; static const CEnumUnsortedElementArray g_aszOSNames; // Verifies that bits order is not changed template<> int const CEnumSortedElementArray::m_aetElementArray[] = { _OU_TARGET_BITS_32, // _OU_TARGET_BITS_32 _OU_TARGET_BITS_64, // _OU_TARGET_BITS_64 }; static const CEnumSortedElementArray g_ai_BitsOrderCheck; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "32", // _OU_TARGET_BITS_32 "64", // _OU_TARGET_BITS_64 }; static const CEnumUnsortedElementArray g_aszBitsNames; // Verifies that architectures order is not changed template<> int const CEnumSortedElementArray::m_aetElementArray[] = { _OU_TARGET_ARCH_OTHER, // _OU_TARGET_ARCH_OTHER _OU_TARGET_ARCH_X86, // _OU_TARGET_ARCH_X86 _OU_TARGET_ARCH_IA64, // _OU_TARGET_ARCH_IA64 _OU_TARGET_ARCH_X64, // _OU_TARGET_ARCH_X64 _OU_TARGET_ARCH_POWERPC, // _OU_TARGET_ARCH_POWERPC _OU_TARGET_ARCH_SPARC, // _OU_TARGET_ARCH_SPARC _OU_TARGET_ARCH_ARM, // _OU_TARGET_ARCH_ARM }; static const CEnumSortedElementArray g_ai_ArchitecturesOrderCheck; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "OTHER", // _OU_TARGET_ARCH_OTHER "x86", // _OU_TARGET_ARCH_X86 "Itanium", // _OU_TARGET_ARCH_IA64 "x64", // _OU_TARGET_ARCH_X64 "PowerPC", // _OU_TARGET_ARCH_POWERPC "Sparc", // _OU_TARGET_ARCH_SPARC "ARM", // _OU_TARGET_ARCH_ARM }; static const CEnumUnsortedElementArray g_aszArchitecturesNames; // Verifies that compilers order is not changed template<> int const CEnumSortedElementArray::m_aetElementArray[] = { _OU_COMPILER__OTHER, // _OU_COMPILER__OTHER, _OU_COMPILER_GCC, // _OU_COMPILER_GCC, _OU_COMPILER_MSVC, // _OU_COMPILER_MSVC, }; static const CEnumSortedElementArray g_ai_CompilersOrderCheck; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "UNKNOWN", // _OU_COMPILER__OTHER, "GCC", // _OU_COMPILER_GCC, "MSVC", // _OU_COMPILER_MSVC, }; static const CEnumUnsortedElementArray g_aszCompilersNames; // Verifies that compiler versions order is not changed template<> int const CEnumSortedElementArray::m_aetElementArray[] = { _OU_COMPILER_VERSION__OTHER, // _OU_COMPILER_VERSION__OTHER, _OU_COMPILER_VERSION_MSVC1998, // _OU_COMPILER_VERSION_MSVC1998, _OU_COMPILER_VERSION_GCCLT4, // _OU_COMPILER_VERSION_GCCLT4, }; static const CEnumSortedElementArray g_ai_CompilersVersionOrderCheck; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "OTHER", // _OU_COMPILER_VERSION__OTHER, "MSVC1998", // _OU_COMPILER_VERSION_MSVC1998, "GCC LESS THAN 4.0", // _OU_COMPILER_VERSION_GCCLT4, }; static const CEnumUnsortedElementArray g_aszCompilerVersionNames; #define _TESTPLATFORM_DEFINITION_TEXT(Definition) #Definition #define TESTPLATFORM_TEFINITION_TEXT(Definition) _TESTPLATFORM_DEFINITION_TEXT(Definition) bool TestPlatform(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount) { const char *szOSName = g_aszOSNames.Encode(_OU_TARGET_OS - 1); const char *szBitsName = g_aszBitsNames.Encode(_OU_TARGET_BITS - 1); const char *szArchitectureName = g_aszArchitecturesNames.Encode(_OU_TARGET_ARCH - 1); const char *szCompilerName = g_aszCompilersNames.Encode(_OU_COMPILER - 1); const char *szCompilerVersion = g_aszCompilerVersionNames.Encode(_OU_COMPILER_VERSION - 1); printf("Target OS: %s\n", szOSName); printf("Target Bits: %s\n", szBitsName); printf("Target Architecture %s\n", szArchitectureName); printf("Compiler Name: %s\n", szCompilerName); printf("Compiler Version: %s\n", szCompilerVersion); printf("Method Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_METHOD)); printf("Function Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_API)); printf("Callback Convention: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_CONVENTION_CALLBACK)); printf("Alwaysinline definition: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_ALWAYSINLINE)); printf("Inline definition: %s\n", TESTPLATFORM_TEFINITION_TEXT(=_OU_INLINE)); nOutSuccessCount = 0; nOutTestCount = 0; return true; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// enum EOUSUBSYSTEMTEST { OST__MIN, OST_INTTYPES = OST__MIN, OST_MACROS, OST_TEMPLATES, OST_TYPEWRAPPER, OST_ASSERT, OST_MALLOC, OST_CUSTOMIZATION, OST_ENUMARRAYS, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS OST_ATOMIC, #endif OST_FLAGSDEFINES, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS OST_ATOMICFLAGS, #endif OST_SIMPLEFLAGS64, OST_SIMPLEFLAGS32, OST_SIMPLEFLAGS16, OST_SIMPLEFLAGS8, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS OST_TLS, #endif OST_PLATFORM, OST__MAX, }; typedef bool (*COUSubsystemTestProcedure)(unsigned int &nOutSuccessCount, unsigned int &nOutTestCount); template<> COUSubsystemTestProcedure const CEnumUnsortedElementArray::m_aetElementArray[] = { &TestIntTypes, // OST_INTTYPES, &TestMacros, // OST_MACROS, &TestTemplates, // OST_TEMPLATES, &TestTypeWrapper, // OST_TYPEWRAPPER, &TestAssert, // OST_ASSERT, &TestMalloc, // OST_MALLOC, &TestCustomization, // OST_CUSTOMIZATION, &TestEnumArrays, // OST_ENUMARRAYS, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS &TestAtomic, // OST_ATOMIC, #endif &TestFlagsDefines, // OST_FLAGSDEFINES, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS &TestAtomicFlags, // OST_ATOMICFLAGS, #endif &TestSimpleFlags64, // OST_SIMPLEFLAGS64, &TestSimpleFlags32, // OST_SIMPLEFLAGS32, &TestSimpleFlags16, // OST_SIMPLEFLAGS16, &TestSimpleFlags8, // OST_SIMPLEFLAGS8, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS &TestTLS, // OST_TLS, #endif &TestPlatform, // OST_PLATFORM, }; static const CEnumUnsortedElementArray g_afnOUSubsystemTestProcedures; template<> const char *const CEnumUnsortedElementArray::m_aetElementArray[] = { "IntTypes", // OST_INTTYPES, "Macros", // OST_MACROS, "Templates", // OST_TEMPLATES, "TypeWrapper", // OST_TYPEWRAPPER, "Assert", // OST_ASSERT, "Malloc", // OST_MALLOC, "Customization", // OST_CUSTOMIZATION, "EnumArrays", // OST_ENUMARRAYS, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS "Atomic", // OST_ATOMIC, #endif "FlagsDefines", // OST_FLAGSDEFINES, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_ATOMICS "AtomicFlags", // OST_ATOMICFLAGS, #endif "SimpleFlags64", // OST_SIMPLEFLAGS64, "SimpleFlags32", // OST_SIMPLEFLAGS32, "SimpleFlags16", // OST_SIMPLEFLAGS16, "SimpleFlags8", // OST_SIMPLEFLAGS8, #if _OU_FEATURE_SET >= _OU_FEATURE_SET_TLS "TLS", // OST_TLS, #endif "Platform", // OST_PLATFORM, }; static const CEnumUnsortedElementArray g_aszOUSubsystemNames; bool ProcessOUCoverageTests(unsigned int &nOutFailureCount) { unsigned int nSuccessCount = 0; for (EOUSUBSYSTEMTEST stSubsystemTest = OST__MIN; stSubsystemTest != OST__MAX; ++stSubsystemTest) { const char *szSubsystemName = g_aszOUSubsystemNames.Encode(stSubsystemTest); printf("\nTesting subsystem \"%s\"\n", szSubsystemName); printf("---------------------------------------------------\n"); unsigned int nSubsysytemSuccessCount = 0, nSubsystemTestCount = 1; COUSubsystemTestProcedure fnTestProcedure = g_afnOUSubsystemTestProcedures.Encode(stSubsystemTest); if (fnTestProcedure(nSubsysytemSuccessCount, nSubsystemTestCount) && nSubsysytemSuccessCount == nSubsystemTestCount) { nSuccessCount += 1; } unsigned int nSubsysytemFailureCount = nSubsystemTestCount - nSubsysytemSuccessCount; printf("---------------------------------------------------\n"); printf("Feature tests failed: %3u out of %3u\n", nSubsysytemFailureCount, nSubsystemTestCount); } unsigned int nFailureCount = OST__MAX - nSuccessCount; printf("\n===================================================\n"); printf("Subsystem tests failed: %3u out of %3u\n", nFailureCount, (unsigned int)OST__MAX); nOutFailureCount = nFailureCount; return nSuccessCount == OST__MAX; } int main(int argc, char* argv[]) { unsigned int nFailureCount; ProcessOUCoverageTests(nFailureCount); return nFailureCount; }