Added test project for Loki::SmartPtr class.
git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@549 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
parent
9f532a3ea0
commit
ebd2c77af9
3 changed files with 837 additions and 0 deletions
6
Loki.sln
6
Loki.sln
|
@ -41,6 +41,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DeletableSingleton", "test\
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DefaultAlloc", "test\SmallObj\DefaultAlloc.vcproj", "{D490B134-B794-42CF-8AF8-9FDA524B9D3B}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DefaultAlloc", "test\SmallObj\DefaultAlloc.vcproj", "{D490B134-B794-42CF-8AF8-9FDA524B9D3B}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SmartPtr", "test\SmartPtr\SmartPtr.vcproj", "{D7AB4FEF-E7AF-443D-93A5-37F323F2042D}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Win32 = Debug|Win32
|
Debug|Win32 = Debug|Win32
|
||||||
|
@ -103,6 +105,10 @@ Global
|
||||||
{D490B134-B794-42CF-8AF8-9FDA524B9D3B}.Debug|Win32.Build.0 = Debug|Win32
|
{D490B134-B794-42CF-8AF8-9FDA524B9D3B}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{D490B134-B794-42CF-8AF8-9FDA524B9D3B}.Release|Win32.ActiveCfg = Release|Win32
|
{D490B134-B794-42CF-8AF8-9FDA524B9D3B}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{D490B134-B794-42CF-8AF8-9FDA524B9D3B}.Release|Win32.Build.0 = Release|Win32
|
{D490B134-B794-42CF-8AF8-9FDA524B9D3B}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{D7AB4FEF-E7AF-443D-93A5-37F323F2042D}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D7AB4FEF-E7AF-443D-93A5-37F323F2042D}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{D7AB4FEF-E7AF-443D-93A5-37F323F2042D}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D7AB4FEF-E7AF-443D-93A5-37F323F2042D}.Release|Win32.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
205
test/SmartPtr/SmartPtr.vcproj
Normal file
205
test/SmartPtr/SmartPtr.vcproj
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="SmartPtr"
|
||||||
|
ProjectGUID="{D7AB4FEF-E7AF-443D-93A5-37F323F2042D}"
|
||||||
|
RootNamespace="SmartPtr"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="C:\Projects\loki\include"
|
||||||
|
WarningLevel="4"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="$(ProjectDir)\$(ConfigurationName)\$(ProjectName).exe"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories="C:\Projects\loki\include"
|
||||||
|
WarningLevel="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="$(ProjectDir)\$(ConfigurationName)\$(ProjectName).exe"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\main.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\Singleton.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\SmallObj.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\SmartPtr.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\loki\Singleton.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\loki\SmallObj.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\loki\SmartPtr.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\loki\Threads.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
626
test/SmartPtr/main.cpp
Normal file
626
test/SmartPtr/main.cpp
Normal file
|
@ -0,0 +1,626 @@
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Test program for The Loki Library
|
||||||
|
// Copyright (c) 2006 Richard Sposato
|
||||||
|
// Permission to use, copy, modify, distribute and sell this software for any
|
||||||
|
// purpose is hereby granted without fee, provided that the above copyright
|
||||||
|
// notice appear in all copies and that both that copyright notice and this
|
||||||
|
// permission notice appear in supporting documentation.
|
||||||
|
// The authors make no representations about the
|
||||||
|
// suitability of this software for any purpose. It is provided "as is"
|
||||||
|
// without express or implied warranty.
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// $Header$
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include <loki/SmartPtr.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Loki;
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class BaseClass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BaseClass( void )
|
||||||
|
{
|
||||||
|
s_constructions++;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~BaseClass( void )
|
||||||
|
{
|
||||||
|
s_destructions++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// These 2 functions are so we can pretend we have a COM object.
|
||||||
|
void AddRef( void ) {}
|
||||||
|
void Release( void ) {}
|
||||||
|
|
||||||
|
// This function is used only for the DeepCopy policy.
|
||||||
|
virtual BaseClass * Clone( void ) const
|
||||||
|
{
|
||||||
|
return new BaseClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool AllDestroyed( void )
|
||||||
|
{
|
||||||
|
return ( s_constructions == s_destructions );
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ExtraConstructions( void )
|
||||||
|
{
|
||||||
|
return ( s_constructions > s_destructions );
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ExtraDestructions( void )
|
||||||
|
{
|
||||||
|
return ( s_constructions < s_destructions );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// Not implemented.
|
||||||
|
BaseClass( const BaseClass & );
|
||||||
|
/// Not implemented.
|
||||||
|
BaseClass & operator = ( const BaseClass & );
|
||||||
|
|
||||||
|
static unsigned int s_constructions;
|
||||||
|
static unsigned int s_destructions;
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned int BaseClass::s_constructions = 0;
|
||||||
|
unsigned int BaseClass::s_destructions = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class PublicSubClass : public BaseClass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// This function is used only for the DeepCopy policy.
|
||||||
|
virtual BaseClass * Clone( void ) const
|
||||||
|
{
|
||||||
|
return new BaseClass();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class PrivateSubClass : private BaseClass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// This function is used only for the DeepCopy policy.
|
||||||
|
virtual BaseClass * Clone( void ) const
|
||||||
|
{
|
||||||
|
return new BaseClass();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/// @note Used for testing most policies.
|
||||||
|
typedef Loki::SmartPtr< BaseClass, RefCounted, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
/// @note These 3 are used for testing const policies.
|
||||||
|
typedef Loki::SmartPtr< const BaseClass, RefCounted, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
ConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
typedef Loki::SmartPtr< const BaseClass, RefCounted, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, PropagateConst >
|
||||||
|
ConstBase_RefCount_NoConvert_Assert_Propagate_ptr;
|
||||||
|
|
||||||
|
typedef Loki::SmartPtr< BaseClass, RefCounted, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, PropagateConst >
|
||||||
|
NonConstBase_RefCount_NoConvert_Assert_Propagate_ptr;
|
||||||
|
|
||||||
|
|
||||||
|
/// @note These 5 are used for testing ownership policies.
|
||||||
|
typedef Loki::SmartPtr< BaseClass, COMRefCounted, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
NonConstBase_ComRef_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
typedef Loki::SmartPtr< BaseClass, RefLinked, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
typedef Loki::SmartPtr< BaseClass, DeepCopy, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
NonConstBase_DeepCopy_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
typedef Loki::SmartPtr< BaseClass, DestructiveCopy, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
NonConstBase_KillCopy_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
typedef Loki::SmartPtr< BaseClass, NoCopy, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
NonConstBase_NoCopy_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
/// @note These 2 are used for testing inheritance.
|
||||||
|
typedef Loki::SmartPtr< PublicSubClass, RefCounted, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
typedef Loki::SmartPtr< PrivateSubClass, RefCounted, DisallowConversion,
|
||||||
|
AssertCheck, DefaultSPStorage, DontPropagateConst >
|
||||||
|
PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr;
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void DoConstConversionTests( void )
|
||||||
|
{
|
||||||
|
|
||||||
|
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 );
|
||||||
|
|
||||||
|
// p1 = p2; // illegal! converts const to non-const.
|
||||||
|
// p1 = p3; // illegal! converts const to non-const.
|
||||||
|
p1 = p4; // legal, but dubious. Changes const-propagation policy.
|
||||||
|
p2 = p1; // legal. natural const conversion.
|
||||||
|
p2 = p3; // legal, but dubious. Changes const-propagation policy.
|
||||||
|
p2 = p4; // legal, but dubious. Changes const-propagation policy.
|
||||||
|
p3 = p1; // legal, but dubious. Changes const-propagation policy.
|
||||||
|
p3 = p2; // legal, but dubious. Changes const-propagation policy.
|
||||||
|
p3 = p4; // legal. natural const conversion.
|
||||||
|
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.
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
// 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 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_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_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_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_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_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_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 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void DoInheritanceConversionTests( void )
|
||||||
|
{
|
||||||
|
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1;
|
||||||
|
PublicSub_RefCount_NoConvert_Assert_DontPropagate_ptr p2;
|
||||||
|
PrivateSub_RefCount_NoConvert_Assert_DontPropagate_ptr p3;
|
||||||
|
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void DoRefCountSwapTests( void )
|
||||||
|
{
|
||||||
|
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p1( new BaseClass );
|
||||||
|
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass );
|
||||||
|
|
||||||
|
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p3( p1 );
|
||||||
|
NonConstBase_RefCount_NoConvert_Assert_DontPropagate_ptr p4( p2 );
|
||||||
|
|
||||||
|
// p1 == p3 and p2 == 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 );
|
||||||
|
|
||||||
|
// 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( p2 );
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void DoRefLinkSwapTests( void )
|
||||||
|
{
|
||||||
|
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p1( new BaseClass );
|
||||||
|
NonConstBase_RefLink_NoConvert_Assert_DontPropagate_ptr p2( new BaseClass );
|
||||||
|
|
||||||
|
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 );
|
||||||
|
|
||||||
|
// 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 );
|
||||||
|
|
||||||
|
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 );
|
||||||
|
|
||||||
|
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( p2 ); // 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 );
|
||||||
|
|
||||||
|
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 );
|
||||||
|
|
||||||
|
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 );
|
||||||
|
|
||||||
|
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 );
|
||||||
|
|
||||||
|
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 <---> 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.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( 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 = 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 );
|
||||||
|
|
||||||
|
p5 = p3;
|
||||||
|
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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
int main( unsigned int , const char * [] )
|
||||||
|
{
|
||||||
|
|
||||||
|
DoRefCountSwapTests();
|
||||||
|
DoRefLinkSwapTests();
|
||||||
|
DoConstConversionTests();
|
||||||
|
DoOwnershipConversionTests();
|
||||||
|
DoInheritanceConversionTests();
|
||||||
|
|
||||||
|
// Check that nothing was leaked.
|
||||||
|
assert( BaseClass::AllDestroyed() );
|
||||||
|
assert( !BaseClass::ExtraConstructions() );
|
||||||
|
|
||||||
|
// Check that no destructor called too often.
|
||||||
|
assert( !BaseClass::ExtraDestructions() );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// $Log$
|
||||||
|
// Revision 1.1 2006/02/25 01:53:20 rich_sposato
|
||||||
|
// Added test project for Loki::SmartPtr class.
|
||||||
|
//
|
Loading…
Add table
Reference in a new issue