From: <ric...@us...> - 2011-09-07 22:50:46
|
Revision: 1095 http://loki-lib.svn.sourceforge.net/loki-lib/?rev=1095&view=rev Author: rich_sposato Date: 2011-09-07 22:50:38 +0000 (Wed, 07 Sep 2011) Log Message: ----------- Added tests for bug 3224518. Modified Paths: -------------- trunk/test/SmartPtr/main.cpp Modified: trunk/test/SmartPtr/main.cpp =================================================================== --- trunk/test/SmartPtr/main.cpp 2011-09-07 22:46:37 UTC (rev 1094) +++ trunk/test/SmartPtr/main.cpp 2011-09-07 22:50:38 UTC (rev 1095) @@ -54,7 +54,7 @@ class Thingy; typedef Loki::SmartPtr< Thingy, RefCounted, DisallowConversion, - AssertCheck, DefaultSPStorage, PropagateConst > + NoCheck, DefaultSPStorage, PropagateConst > Thingy_DefaultStorage_ptr; typedef Loki::SmartPtr< Thingy, RefCounted, DisallowConversion, @@ -69,18 +69,23 @@ AssertCheck, DefaultSPStorage, DontPropagateConst > NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr; -/// @note These 3 are used for testing const policies. +/// @note These 4 are used for testing const policies. + +typedef Loki::SmartPtr< BaseClass, RefCounted, DisallowConversion, + NoCheck, DefaultSPStorage, DontPropagateConst > + NonConstBase_RefCount_NoConvert_NoCheck_DontPropagate_ptr; + typedef Loki::SmartPtr< const BaseClass, RefCounted, DisallowConversion, - AssertCheck, DefaultSPStorage, DontPropagateConst > - ConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr; + NoCheck, DefaultSPStorage, DontPropagateConst > + ConstBase_RefCount_NoConvert_NoCheck_DontPropagate_ptr; typedef Loki::SmartPtr< const BaseClass, RefCounted, DisallowConversion, - AssertCheck, DefaultSPStorage, PropagateConst > - ConstBase_RefCount_NoConvert_Assert_Propagate_ptr; + NoCheck, DefaultSPStorage, PropagateConst > + ConstBase_RefCount_NoConvert_NoCheck_Propagate_ptr; typedef Loki::SmartPtr< BaseClass, RefCounted, DisallowConversion, - AssertCheck, DefaultSPStorage, PropagateConst > - NonConstBase_RefCount_NoConvert_Assert_Propagate_ptr; + NoCheck, DefaultSPStorage, PropagateConst > + NonConstBase_RefCount_NoConvert_NoCheck_Propagate_ptr; // ---------------------------------------------------------------------------- @@ -135,11 +140,12 @@ void DoConstConversionTests( void ) { + cout << "Starting DoConstConversionTests." << endl; - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1; - ConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2( p1 ); - ConstBase_RefCount_NoConvert_Assert_Propagate_ptr p3( p1 ); - NonConstBase_RefCount_NoConvert_Assert_Propagate_ptr p4( p1 ); + NonConstBase_RefCount_NoConvert_NoCheck_DontPropagate_ptr p1; + ConstBase_RefCount_NoConvert_NoCheck_DontPropagate_ptr p2( p1 ); + ConstBase_RefCount_NoConvert_NoCheck_Propagate_ptr p3( p1 ); + NonConstBase_RefCount_NoConvert_NoCheck_Propagate_ptr p4( p1 ); // p1 = p2; // illegal! converts const to non-const. // p1 = p3; // illegal! converts const to non-const. @@ -153,775 +159,824 @@ p4 = p1; // legal, but dubious. Changes const-propagation policy. // p4 = p2; // illegal! converts const to non-const. // p4 = p3; // illegal! converts const to non-const. + + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoConstConversionTests." << endl; } // ---------------------------------------------------------------------------- void DoOwnershipConversionTests( void ) { - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1; - NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p2; - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p3; - NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p4( new BaseClass ); - NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p5; - NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p6; + cout << "Starting DoOwnershipConversionTests." << endl; - // legal constructions. Each should allow copy with same policies. - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p7( p1 ); - NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p8( p2 ); - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p9( p3 ); - NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p10( p4 ); - NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p11( p5 ); + { + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1( new BaseClass ); + NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p3( new BaseClass ); + NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p4( new BaseClass ); + NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p5( new BaseClass ); + NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p6( new BaseClass ); - // illegal construction! Can't copy anything with NoCopy policy. - // NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p12( p6 ); + // legal constructions. Each should allow copy with same policies. + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p7( p1 ); + NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p8( p2 ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p9( p3 ); + NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p10( p4 ); + NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p11( p5 ); - // illegal constructions! Can't convert from one ownership policy to another. -// NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p13( p2 ); -// NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p14( p3 ); -// NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p15( p4 ); -// NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p16( p5 ); -// NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p17( p6 ); + // illegal construction! Can't copy anything with NoCopy policy. + // NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p12( p6 ); - // illegal constructions! Can't convert from one ownership policy to another. -// NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p18( p1 ); -// NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p19( p3 ); -// NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p20( p4 ); -// NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p21( p5 ); -// NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p22( p6 ); + // illegal constructions! Can't convert from one ownership policy to another. + // NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p13( p2 ); + // NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p14( p3 ); + // NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p15( p4 ); + // NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p16( p5 ); + // NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p17( p6 ); - // illegal constructions! Can't convert from one ownership policy to another. -// NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p23( p1 ); -// NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p24( p2 ); -// NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p25( p4 ); -// NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p26( p5 ); -// NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p27( p6 ); + // illegal constructions! Can't convert from one ownership policy to another. + // NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p18( p1 ); + // NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p19( p3 ); + // NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p20( p4 ); + // NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p21( p5 ); + // NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr p22( p6 ); - // illegal constructions! Can't convert from one ownership policy to another. -// NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p28( p1 ); -// NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p29( p2 ); -// NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p30( p3 ); -// NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p31( p5 ); -// NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p32( p6 ); + // illegal constructions! Can't convert from one ownership policy to another. + // NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p23( p1 ); + // NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p24( p2 ); + // NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p25( p4 ); + // NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p26( p5 ); + // NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p27( p6 ); - // illegal constructions! Can't convert from one ownership policy to another. -// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p33( p1 ); -// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p34( p2 ); -// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p35( p3 ); -// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p36( p4 ); -// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p37( p6 ); + // illegal constructions! Can't convert from one ownership policy to another. + // NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p28( p1 ); + // NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p29( p2 ); + // NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p30( p3 ); + // NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p31( p5 ); + // NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr p32( p6 ); - // illegal constructions! Can't convert from one ownership policy to another. -// NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p38( p1 ); -// NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p39( p2 ); -// NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p40( p3 ); -// NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p41( p4 ); -// NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p42( p5 ); + // illegal constructions! Can't convert from one ownership policy to another. + // NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p33( p1 ); + // NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p34( p2 ); + // NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p35( p3 ); + // NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p36( p4 ); + // NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p37( p6 ); - // These constructions are legal because the preserve const-ness. - ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p43( p5 ); - ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p44( p43 ); - const BaseClass * rawP = new BaseClass; - // These constructions are illegal because the don't preserve constness. -// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p45( rawP ); -// NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p46( p43 ); - ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p47( rawP ); + // illegal constructions! Can't convert from one ownership policy to another. + // NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p38( p1 ); + // NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p39( p2 ); + // NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p40( p3 ); + // NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p41( p4 ); + // NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr p42( p5 ); + } - NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p48; - // This assignment is legal because it preserves constness. - p48 = p5; - // This assignment is illegal because it won't preserve constness. -// p48 = p43; + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); - // illegal assignements! Can't convert from one ownership policy to another. -// p1 = p2; -// p1 = p3; -// p1 = p4; -// p1 = p5; -// p1 = p6; -// p2 = p1; -// p2 = p3; -// p2 = p4; -// p2 = p5; -// p2 = p6; -// p3 = p1; -// p3 = p2; -// p3 = p4; -// p3 = p5; -// p3 = p6; -// p4 = p1; -// p4 = p2; -// p4 = p3; -// p4 = p5; -// p4 = p6; -// p5 = p1; -// p5 = p2; -// p5 = p3; -// p5 = p4; -// p5 = p6; -// p6 = p1; -// p6 = p2; -// p6 = p3; -// p6 = p4; -// p6 = p5; + { + // These constructions are legal because the preserve const-ness. + const BaseClass * rawP = new BaseClass; + ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p43( rawP ); + ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p44( p43 ); + rawP = new BaseClass; + // These constructions are illegal because the don't preserve constness. + // NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p45( rawP ); + // NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p46( p43 ); + ConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p47( rawP ); + + NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p48; + NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr p49( new BaseClass ); + // This assignment is legal because it preserves constness. + p48 = p49; + // This assignment is illegal because it won't preserve constness. + // p48 = p43; + + // illegal assignments! Can't convert from one ownership policy to another. + // p1 = p2; + // p1 = p3; + // p1 = p4; + // p1 = p5; + // p1 = p6; + // p2 = p1; + // p2 = p3; + // p2 = p4; + // p2 = p5; + // p2 = p6; + // p3 = p1; + // p3 = p2; + // p3 = p4; + // p3 = p5; + // p3 = p6; + // p4 = p1; + // p4 = p2; + // p4 = p3; + // p4 = p5; + // p4 = p6; + // p5 = p1; + // p5 = p2; + // p5 = p3; + // p5 = p4; + // p5 = p6; + // p6 = p1; + // p6 = p2; + // p6 = p3; + // p6 = p4; + // p6 = p5; + } + + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoOwnershipConversionTests." << endl; } // ---------------------------------------------------------------------------- void DoInheritanceConversionTests( void ) { - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1; - PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p2; - PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p3; + cout << "Starting DoInheritanceConversionTests." << endl; - p1 = p2; // legal. Cast to public base class allowed. - assert( p1 == p2 ); -// p1 = p3; // illegal! Can't assign pointer since base class is private. -// p2 = p1; // illegal! Can't do cast to derived class in pointer assignment. -// p2 = p3; // illegal! Can't assign when types are unrelated. -// p3 = p1; // illegal! Can't do cast to derived class in pointer assignment. -// p3 = p2; // illegal! Can't assign when types are unrelated. + { + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1; + PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p2( new PublicSubClass ); + PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p3; - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p4( p2 ); - assert( p4 == p1 ); - assert( p4 == p2 ); - // These copy-constructions are illegal for reasons shown above. -// NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p5( p3 ); -// PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p6( p1 ); -// PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p7( p3 ); -// PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p8( p1 ); -// PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p9( p2 ); + p1 = p2; // legal. Cast to public base class allowed. + assert( p1 == p2 ); +// p1 = p3; // illegal! Can't assign pointer since base class is private. +// p2 = p1; // illegal! Can't do cast to derived class in pointer assignment. +// p2 = p3; // illegal! Can't assign when types are unrelated. +// p3 = p1; // illegal! Can't do cast to derived class in pointer assignment. +// p3 = p2; // illegal! Can't assign when types are unrelated. + + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p4( p2 ); + assert( p4 == p1 ); + assert( p4 == p2 ); + // These copy-constructions are illegal for reasons shown above. +// NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p5( p3 ); +// PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p6( p1 ); +// PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p7( p3 ); +// PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p8( p1 ); +// PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p9( p2 ); + } + + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoInheritanceConversionTests." << endl; } // ---------------------------------------------------------------------------- void DoRefCountSwapTests( void ) { - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1( new BaseClass ); - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass ); + cout << "Starting DoRefCountSwapTests." << endl; - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p3( p1 ); - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p4( p2 ); + { + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1( new BaseClass ); + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass ); - // p1 == p3 and p2 == p4 - assert( p1 == p3 ); - assert( p1 != p2 ); - assert( p1 != p4 ); - assert( p2 == p4 ); - assert( p2 != p3 ); - assert( p2 != p1 ); + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p3( p1 ); + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p4( p2 ); - // p1 == p4 and p2 == p3 - p3.Swap( p4 ); - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); + // p1 == p3 and p2 == p4 + assert( p1 == p3 ); + assert( p1 != p2 ); + assert( p1 != p4 ); + assert( p2 == p4 ); + assert( p2 != p3 ); + assert( p2 != p1 ); - // p1 == p3 and p2 == p4 - p3.Swap( p4 ); - assert( p1 == p3 ); - assert( p1 != p2 ); - assert( p1 != p4 ); - assert( p2 == p4 ); - assert( p2 != p3 ); - assert( p2 != p1 ); + // p1 == p4 and p2 == p3 + p3.Swap( p4 ); + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); - // p2 == p3 and p1 == p4 - p1.Swap( p2 ); - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); + // p1 == p3 and p2 == p4 + p3.Swap( p4 ); + assert( p1 == p3 ); + assert( p1 != p2 ); + assert( p1 != p4 ); + assert( p2 == p4 ); + assert( p2 != p3 ); + assert( p2 != p1 ); - // p2 == p3 and p1 == p4 - p1.Swap( p1 ); - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); + // p2 == p3 and p1 == p4 + p1.Swap( p2 ); + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); - // p2 == p3 and p4 == p1 - p1.Swap( p4 ); - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); + // p2 == p3 and p1 == p4 + p1.Swap( p1 ); + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); + + // p2 == p3 and p4 == p1 + p1.Swap( p4 ); + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); + } + + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoRefCountSwapTests." << endl; } // ---------------------------------------------------------------------------- void DoRefLinkSwapTests( void ) { + cout << "Starting DoRefLinkSwapTests." << endl; - BaseClass * pBaseClass = new BaseClass; - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p1( pBaseClass ); - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass ); - p1->DoThat(); - p2->DoThat(); + { + BaseClass * pBaseClass = new BaseClass; + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p1( pBaseClass ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass ); + p1->DoThat(); + p2->DoThat(); - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p3( p1 ); - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p4( p2 ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p3( p1 ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p4( p2 ); - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p5; - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p6( new BaseClass ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p5; + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p6( new BaseClass ); - BaseClass * pBare1 = GetImpl( p1 ); - BaseClass * pBare2 = GetImpl( p2 ); - BaseClass * pBare6 = GetImpl( p6 ); - const bool is1LessThan2 = ( pBare1 < pBare2 ); - const bool is1LessThan6 = ( pBare1 < pBare6 ); - const bool is2LessThan6 = ( pBare2 < pBare6 ); - assert( pBare1 != pBare2 ); - assert( pBare1 != pBare6 ); - assert( pBare2 != pBare6 ); - assert( p1 == pBare1 ); - assert( p2 == pBare2 ); - assert( p6 == pBare6 ); - assert( pBare1 == p1 ); - assert( pBare2 == p2 ); - assert( pBare6 == p6 ); - assert( pBare2 != p1 ); - assert( p1 != pBare2 ); + BaseClass * pBare1 = GetImpl( p1 ); + BaseClass * pBare2 = GetImpl( p2 ); + BaseClass * pBare6 = GetImpl( p6 ); + const bool is1LessThan2 = ( pBare1 < pBare2 ); + const bool is1LessThan6 = ( pBare1 < pBare6 ); + const bool is2LessThan6 = ( pBare2 < pBare6 ); + assert( pBare1 != pBare2 ); + assert( pBare1 != pBare6 ); + assert( pBare2 != pBare6 ); + assert( p1 == pBare1 ); + assert( p2 == pBare2 ); + assert( p6 == pBare6 ); + assert( pBare1 == p1 ); + assert( pBare2 == p2 ); + assert( pBare6 == p6 ); + assert( pBare2 != p1 ); + assert( p1 != pBare2 ); - if ( is1LessThan2 ) - { - assert( p1 < p2 ); - assert( p1 <= p2 ); + if ( is1LessThan2 ) + { + assert( p1 < p2 ); + assert( p1 <= p2 ); + assert( p1 != p2 ); + assert( p2 > p1 ); + assert( p2 >= p1 ); + assert( p1 < pBare2 ); + assert( p1 <= pBare2 ); + assert( pBare2 > p1 ); + assert( pBare2 >= p1 ); + } + else + { + assert( p2 < p1 ); + assert( p2 <= p1 ); + assert( p2 != p1 ); + assert( p1 > p2 ); + assert( p1 >= p2 ); + assert( p2 < pBare1 ); + assert( p2 <= pBare1 ); + assert( p2 != pBare1 ); + assert( pBare1 > p2 ); + assert( pBare1 >= p2 ); + } + + if ( is1LessThan6 ) + { + assert( p1 < p6 ); + assert( p1 <= p6 ); + assert( p1 != p6 ); + assert( p6 > p1 ); + assert( p6 >= p1 ); + assert( p1 < pBare6 ); + assert( p1 <= pBare6 ); + assert( pBare6 > p1 ); + assert( pBare6 >= p1 ); + } + else + { + assert( p6 < p1 ); + assert( p6 <= p1 ); + assert( p6 != p1 ); + assert( p1 > p6 ); + assert( p1 >= p6 ); + assert( p6 < pBare1 ); + assert( p6 <= pBare1 ); + assert( p6 != pBare1 ); + assert( pBare1 > p6 ); + assert( pBare1 >= p6 ); + } + + if ( is2LessThan6 ) + { + assert( p2 < p6 ); + assert( p2 <= p6 ); + assert( p2 != p6 ); + assert( p6 > p2 ); + assert( p6 >= p2 ); + assert( p2 < pBare6 ); + assert( p2 <= pBare6 ); + assert( pBare6 > p2 ); + assert( pBare6 >= p2 ); + } + else + { + assert( p6 < p2 ); + assert( p6 <= p2 ); + assert( p6 != p2 ); + assert( p2 > p6 ); + assert( p2 >= p6 ); + assert( p6 < pBare2 ); + assert( p6 <= pBare2 ); + assert( p6 != pBare2 ); + assert( pBare2 > p6 ); + assert( pBare2 >= p6 ); + } + + // p1 <---> p3 and p2 <---> p4 and p5 and p6 + assert( p1 == p3 ); assert( p1 != p2 ); - assert( p2 > p1 ); - assert( p2 >= p1 ); - assert( p1 < pBare2 ); - assert( p1 <= pBare2 ); - assert( pBare2 > p1 ); - assert( pBare2 >= p1 ); - } - else - { - assert( p2 < p1 ); - assert( p2 <= p1 ); + assert( p1 != p4 ); + assert( p2 == p4 ); + assert( p2 != p3 ); assert( p2 != p1 ); - assert( p1 > p2 ); - assert( p1 >= p2 ); - assert( p2 < pBare1 ); - assert( p2 <= pBare1 ); - assert( p2 != pBare1 ); - assert( pBare1 > p2 ); - assert( pBare1 >= p2 ); - } + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - if ( is1LessThan6 ) - { - assert( p1 < p6 ); - assert( p1 <= p6 ); - assert( p1 != p6 ); - assert( p6 > p1 ); - assert( p6 >= p1 ); - assert( p1 < pBare6 ); - assert( p1 <= pBare6 ); - assert( pBare6 > p1 ); - assert( pBare6 >= p1 ); - } - else - { - assert( p6 < p1 ); - assert( p6 <= p1 ); - assert( p6 != p1 ); - assert( p1 > p6 ); - assert( p1 >= p6 ); - assert( p6 < pBare1 ); - assert( p6 <= pBare1 ); - assert( p6 != pBare1 ); - assert( pBare1 > p6 ); - assert( pBare1 >= p6 ); - } + p3.Swap( p4 ); // p1 <---> p4 and p2 <---> p3 and p5 and p6 + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - if ( is2LessThan6 ) - { - assert( p2 < p6 ); - assert( p2 <= p6 ); - assert( p2 != p6 ); - assert( p6 > p2 ); - assert( p6 >= p2 ); - assert( p2 < pBare6 ); - assert( p2 <= pBare6 ); - assert( pBare6 > p2 ); - assert( pBare6 >= p2 ); - } - else - { - assert( p6 < p2 ); - assert( p6 <= p2 ); - assert( p6 != p2 ); - assert( p2 > p6 ); - assert( p2 >= p6 ); - assert( p6 < pBare2 ); - assert( p6 <= pBare2 ); - assert( p6 != pBare2 ); - assert( pBare2 > p6 ); - assert( pBare2 >= p6 ); - } + p3.Swap( p4 ); // p1 <---> p3 and p2 <---> p4 and p5 and p6 + assert( p1 == p3 ); + assert( p1 != p2 ); + assert( p1 != p4 ); + assert( p2 == p4 ); + assert( p2 != p3 ); + assert( p2 != p1 ); + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - // p1 <---> p3 and p2 <---> p4 and p5 and p6 - assert( p1 == p3 ); - assert( p1 != p2 ); - assert( p1 != p4 ); - assert( p2 == p4 ); - assert( p2 != p3 ); - assert( p2 != p1 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p1.Swap( p2 ); // p2 <---> p3 and p1 <---> p4 and p5 and p6 + assert( p1 != pBaseClass ); + assert( p2 == pBaseClass ); + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - p3.Swap( p4 ); // p1 <---> p4 and p2 <---> p3 and p5 and p6 - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p1.Swap( p1 ); // p2 <---> p3 and p1 <---> p4 and p5 and p6 + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - p3.Swap( p4 ); // p1 <---> p3 and p2 <---> p4 and p5 and p6 - assert( p1 == p3 ); - assert( p1 != p2 ); - assert( p1 != p4 ); - assert( p2 == p4 ); - assert( p2 != p3 ); - assert( p2 != p1 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p1.Swap( p4 ); // p2 <---> p3 and p4 <---> p1 and p5 and p6 + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - p1.Swap( p2 ); // p2 <---> p3 and p1 <---> p4 and p5 and p6 - assert( p1 != pBaseClass ); - assert( p2 == pBaseClass ); - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p4.Swap( p1 ); // p2 <---> p3 and p4 <---> p1 and p5 and p6 + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - p1.Swap( p1 ); // p2 <---> p3 and p1 <---> p4 and p5 and p6 - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p5.Swap( p5 ); // p2 <---> p3 and p4 <---> p1 and p5 and p6 + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); - p1.Swap( p4 ); // p2 <---> p3 and p4 <---> p1 and p5 and p6 - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p5.Swap( p1 ); // p2 <---> p3 and p4 <---> p5 and p1 and p6 + assert( p5 == p4 ); + assert( p5 != p2 ); + assert( p5 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p5 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p4 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - p4.Swap( p1 ); // p2 <---> p3 and p4 <---> p1 and p5 and p6 - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p6.Swap( p1 ); // p2 <---> p3 and p4 <---> p5 and p1 and p6 + assert( p5 == p4 ); + assert( p5 != p2 ); + assert( p5 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p5 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p4 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); - p5.Swap( p5 ); // p2 <---> p3 and p4 <---> p1 and p5 and p6 - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); + p5.Swap( p1 ); // p2 <---> p3 and p4 <---> p1 and p5 and p6 + assert( p1 == p4 ); + assert( p1 != p2 ); + assert( p1 != p3 ); + assert( p2 == p3 ); + assert( p2 != p4 ); + assert( p2 != p1 ); + assert( p1 != p5 ); + assert( p2 != p5 ); + assert( p3 != p5 ); + assert( p4 != p5 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); - p5.Swap( p1 ); // p2 <---> p3 and p4 <---> p5 and p1 and p6 - assert( p5 == p4 ); - assert( p5 != p2 ); - assert( p5 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p5 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p4 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p6 = p2; // p6 <---> p2 <---> p3 and p4 <---> p1 and p5 + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p5 != p3 ); + assert( p2 != p4 ); + assert( p2 != p5 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); - p6.Swap( p1 ); // p2 <---> p3 and p4 <---> p5 and p1 and p6 - assert( p5 == p4 ); - assert( p5 != p2 ); - assert( p5 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p5 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p4 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); + p5 = p3; // p6 <---> p2 <---> p3 <---> p5 and p4 <---> p1 + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); - p5.Swap( p1 ); // p2 <---> p3 and p4 <---> p1 and p5 and p6 - assert( p1 == p4 ); - assert( p1 != p2 ); - assert( p1 != p3 ); - assert( p2 == p3 ); - assert( p2 != p4 ); - assert( p2 != p1 ); - assert( p1 != p5 ); - assert( p2 != p5 ); - assert( p3 != p5 ); - assert( p4 != p5 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); + p5.Swap( p3 ); // p6 <---> p2 <---> p5 <---> p3 and p4 <---> p1 + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); - p6 = p2; // p6 <---> p2 <---> p3 and p4 <---> p1 and p5 - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p5 != p3 ); - assert( p2 != p4 ); - assert( p2 != p5 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); + p2.Swap( p3 ); // p6 <---> p3 <---> p5 <---> p2 and p4 <---> p1 + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); - p5 = p3; // p6 <---> p2 <---> p3 <---> p5 and p4 <---> p1 - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); + bool merged = false; + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p7( pBaseClass ); + assert( p7 == p7 ); + assert( p6 == p7 ); + assert( p1 != p7 ); + merged = p7.Merge( p6 ); + // p7 <---> p6 <---> p3 <---> p5 <---> p2 and p4 <---> p1 + assert( merged ); + assert( p6 == p7 ); + assert( p1 != p7 ); + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); + assert( p7 == p7 ); - p5.Swap( p3 ); // p6 <---> p2 <---> p5 <---> p3 and p4 <---> p1 - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p8( pBaseClass ); + assert( p6 == p8 ); + assert( p1 != p8 ); + merged = p6.Merge( p8 ); + // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 and p4 <---> p1 + assert( merged ); + assert( p6 == p8 ); + assert( p6 == p7 ); + assert( p1 != p7 ); + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); + assert( p7 == p7 ); + assert( p8 == p8 ); - p2.Swap( p3 ); // p6 <---> p3 <---> p5 <---> p2 and p4 <---> p1 - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); + merged = p6.Merge( p6 ); + // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 and p4 <---> p1 + assert( merged ); + assert( p6 == p8 ); + assert( p6 == p7 ); + assert( p1 != p7 ); + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); + assert( p7 == p7 ); + assert( p8 == p8 ); - bool merged = false; - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p7( pBaseClass ); - assert( p7 == p7 ); - assert( p6 == p7 ); - assert( p1 != p7 ); - merged = p7.Merge( p6 ); - // p7 <---> p6 <---> p3 <---> p5 <---> p2 and p4 <---> p1 - assert( merged ); - assert( p6 == p7 ); - assert( p1 != p7 ); - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); - assert( p7 == p7 ); + merged = p6.Merge( p3 ); + // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 and p4 <---> p1 + assert( merged ); + assert( p6 == p8 ); + assert( p6 == p7 ); + assert( p1 != p7 ); + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); + assert( p7 == p7 ); + assert( p8 == p8 ); - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p8( pBaseClass ); - assert( p6 == p8 ); - assert( p1 != p8 ); - merged = p6.Merge( p8 ); - // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 and p4 <---> p1 - assert( merged ); - assert( p6 == p8 ); - assert( p6 == p7 ); - assert( p1 != p7 ); - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); - assert( p7 == p7 ); - assert( p8 == p8 ); + merged = p5.Merge( p1 ); + // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 and p4 <---> p1 + assert( !merged ); + assert( p6 == p8 ); + assert( p6 == p7 ); + assert( p1 != p7 ); + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); + assert( p7 == p7 ); + assert( p8 == p8 ); - merged = p6.Merge( p6 ); - // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 and p4 <---> p1 - assert( merged ); - assert( p6 == p8 ); - assert( p6 == p7 ); - assert( p1 != p7 ); - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); - assert( p7 == p7 ); - assert( p8 == p8 ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p9( pBaseClass ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr pA( p9 ); + assert( p9 == pA ); + assert( p9 == p8 ); + assert( p1 != p8 ); + merged = p9.Merge( p1 ); + // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 + // and p4 <---> p1 and p9 <---> pA + assert( !merged ); + assert( p6 == p8 ); + assert( p6 == p7 ); + assert( p1 != p7 ); + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); + assert( p7 == p7 ); + assert( p8 == p8 ); + assert( p9 == p9 ); + assert( pA == pA ); - merged = p6.Merge( p3 ); - // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 and p4 <---> p1 - assert( merged ); - assert( p6 == p8 ); - assert( p6 == p7 ); - assert( p1 != p7 ); - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); - assert( p7 == p7 ); - assert( p8 == p8 ); + merged = p9.Merge( p2 ); + // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 <---> p9 <---> pA + // and p4 <---> p1 + assert( merged ); + assert( p6 == p8 ); + assert( p6 == p7 ); + assert( p1 != p7 ); + assert( p6 == p5 ); + assert( p6 == p2 ); + assert( p6 == p3 ); + assert( p5 == p3 ); + assert( p2 == p3 ); + assert( p1 == p4 ); + assert( p2 != p4 ); + assert( p1 != p5 ); + assert( p2 != p1 ); + assert( p3 != p1 ); + assert( p1 == p1 ); + assert( p2 == p2 ); + assert( p3 == p3 ); + assert( p4 == p4 ); + assert( p5 == p5 ); + assert( p6 == p6 ); + assert( p7 == p7 ); + assert( p8 == p8 ); + assert( p9 == p9 ); + assert( pA == pA ); + } - merged = p5.Merge( p1 ); - // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 and p4 <---> p1 - assert( !merged ); - assert( p6 == p8 ); - assert( p6 == p7 ); - assert( p1 != p7 ); - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); - assert( p7 == p7 ); - assert( p8 == p8 ); - - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p9( pBaseClass ); - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr pA( p9 ); - assert( p9 == pA ); - assert( p9 == p8 ); - assert( p1 != p8 ); - merged = p9.Merge( p1 ); - // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 - // and p4 <---> p1 and p9 <---> pA - assert( !merged ); - assert( p6 == p8 ); - assert( p6 == p7 ); - assert( p1 != p7 ); - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); - assert( p7 == p7 ); - assert( p8 == p8 ); - assert( p9 == p9 ); - assert( pA == pA ); - - merged = p9.Merge( p2 ); - // p7 <---> p6 <---> p8 <---> p3 <---> p5 <---> p2 <---> p9 <---> pA - // and p4 <---> p1 - assert( merged ); - assert( p6 == p8 ); - assert( p6 == p7 ); - assert( p1 != p7 ); - assert( p6 == p5 ); - assert( p6 == p2 ); - assert( p6 == p3 ); - assert( p5 == p3 ); - assert( p2 == p3 ); - assert( p1 == p4 ); - assert( p2 != p4 ); - assert( p1 != p5 ); - assert( p2 != p1 ); - assert( p3 != p1 ); - assert( p1 == p1 ); - assert( p2 == p2 ); - assert( p3 == p3 ); - assert( p4 == p4 ); - assert( p5 == p5 ); - assert( p6 == p6 ); - assert( p7 == p7 ); - assert( p8 == p8 ); - assert( p9 == p9 ); - assert( pA == pA ); + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoRefLinkSwapTests." << endl; } // ---------------------------------------------------------------------------- void DoRefLinkTests( void ) { + cout << "Starting DoRefLinkTests." << endl; const unsigned int ctorCount = BaseClass::GetCtorCount(); (void) ctorCount; const unsigned int dtorCount = BaseClass::GetDtorCount(); (void) dtorCount; @@ -951,12 +1006,18 @@ assert( dtorCount + 2 == BaseClass::GetDtorCount() ); assert( BaseClass::GetCtorCount() == BaseClass::GetDtorCount() ); + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoRefLinkTests." << endl; } // ---------------------------------------------------------------------------- void DoRefCountNullPointerTests( void ) { + cout << "Starting DoRefCountNullPointerTests." << endl; + BaseClass * pNull = NULL; (void) pNull; const unsigned int ctorCount = BaseClass::GetCtorCount(); (void) ctorCount; const unsigned int dtorCount = BaseClass::GetDtorCount(); (void) dtorCount; @@ -965,7 +1026,7 @@ { NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p0; NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1; - NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2( p0 ); + NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2; assert( !p0 ); assert( !p1 ); @@ -1005,12 +1066,19 @@ } assert( ctorCount == BaseClass::GetCtorCount() ); assert( dtorCount == BaseClass::GetDtorCount() ); + + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoRefCountNullPointerTests." << endl; } // ---------------------------------------------------------------------------- void DoRefLinkNullPointerTests( void ) { + cout << "Starting DoRefLinkNullPointerTests." << endl; + BaseClass * pNull = NULL; (void) pNull; const unsigned int ctorCount = BaseClass::GetCtorCount(); (void) ctorCount; const unsigned int dtorCount = BaseClass::GetDtorCount(); (void) dtorCount; @@ -1019,7 +1087,7 @@ { NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p0; NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p1; - NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p2( p0 ); + NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p2; assert( !p0 ); assert( !p1 ); @@ -1059,12 +1127,18 @@ } assert( ctorCount == BaseClass::GetCtorCount() ); assert( dtorCount == BaseClass::GetDtorCount() ); + + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoRefLinkNullPointerTests." << endl; } // ---------------------------------------------------------------------------- void DoComRefTest( void ) { + cout << "Starting DoComRefTest." << endl; const unsigned int ctorCount = MimicCOM::GetCtorCount(); (void) ctorCount; const unsigned int dtorCount = MimicCOM::GetDtorCount(); (void) dtorCount; @@ -1090,12 +1164,19 @@ } assert( ctorCount+2 == MimicCOM::GetCtorCount() ); assert( dtorCount+2 == MimicCOM::GetDtorCount() ); + + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoComRefTest." << endl; } // ---------------------------------------------------------------------------- void DoForwardReferenceTest( void ) { + cout << "Starting DoForwardReferenceTest." << endl; + /** @note These lines should cause the compiler to make a warning message about attempting to delete an undefined type. But it should not produce any error messages. @@ -1112,6 +1193,11 @@ //Thingy_HeapStorage_ptr p5( p4 ); //Thingy_HeapStorage_ptr p6; //p6 = p5; + + assert( BaseClass::AllDestroyed() ); + assert( !BaseClass::ExtraConstructions() ); + assert( !BaseClass::ExtraDestructions() ); + cout << "Finished DoForwardReferenceTest." << endl; } // ---------------------------------------------------------------------------- @@ -1122,25 +1208,63 @@ class Feline { public: - virtual ~Feline() {} + + static inline bool AllDestroyed( void ) + { + return ( s_constructions == s_destructions ); + } + + static inline bool ExtraConstructions( void ) + { + return ( s_constructions > s_destructions ); + } + + static inline bool ExtraDestructions( void ) + { + return ( s_constructions < s_destructions ); + } + + static inline unsigned int GetCtorCount( void ) + { + return s_constructions; + } + + static inline unsigned int GetDtorCount( void ) + { + return s_destructions; + } + + Feline( void ) { s_constructions++; } + virtual ~Feline() { s_destructions++; } + virtual Feline * Clone( void ) const = 0; + + private: + static unsigned int s_constructions; + static unsigned int s_destructions; }; - class Lion : public Feline + unsigned int Feline::s_constructions = 0; + unsigned int Feline::s_destructions = 0; + + class Tiger : public Feline { public: - virtual ~Lion() {} + virtual ~Tiger() {} + virtual Tiger * Clone( void ) const { return new Tiger( *this ); } }; - class Tiger : public Feline + class Lion : public Feline { public: - virtual ~Tiger() {} + virtual ~Lion() {} + virtual Lion * Clone( void ) const { return new Lion( *this ); } }; class Dog { public: virtual ~Dog() {} + virtual Dog * Clone( void ) const { return new Dog( *this ); } }; } @@ -1149,88 +1273,188 @@ void DoSmartPtrDynamicCastTests( void ) { - typedef ::Loki::SmartPtr< Feline > FelinePtr; - typedef ::Loki::SmartPtr< Lion > LionPtr; - typedef ::Loki::SmartPtr< Tiger > TigerPtr; - typedef ::Loki::SmartPtr< Dog > DogPtr; + cout << "Starting DoSmartPtrDynamicCastTests." << endl; - Feline * feline = new Lion; - Lion * lion = new Lion; - Tiger * tiger = new Tiger; - Dog * dog = new Dog; + typedef ::Loki::SmartPtr< Feline, RefCounted, DisallowConversion, NoCheck > FelinePtr; + typedef ::Loki::SmartPtr< Tiger, RefCounted, DisallowConversion, NoCheck > TigerPtr; + typedef ::Loki::SmartPtr< Lion, RefCounted, DisallowConversion, NoCheck > LionPtr; + typedef ::Loki::SmartPtr< Dog, RefCounted, DisallowConversion, No... [truncated message content] |