|
From: <ric...@us...> - 2011-09-20 17:52:17
|
Revision: 1106
http://loki-lib.svn.sourceforge.net/loki-lib/?rev=1106&view=rev
Author: rich_sposato
Date: 2011-09-20 17:52:11 +0000 (Tue, 20 Sep 2011)
Log Message:
-----------
Added ability for StrongPtr to handle arrays.
Modified Paths:
--------------
trunk/test/SmartPtr/strong.cpp
Modified: trunk/test/SmartPtr/strong.cpp
===================================================================
--- trunk/test/SmartPtr/strong.cpp 2011-09-20 17:51:46 UTC (rev 1105)
+++ trunk/test/SmartPtr/strong.cpp 2011-09-20 17:52:11 UTC (rev 1106)
@@ -1781,7 +1781,7 @@
namespace
{
- class Feline
+ class Feline : public BaseClass
{
public:
virtual ~Feline() {}
@@ -1796,7 +1796,12 @@
class Tiger : public Feline
{
public:
+ Tiger( void ) : m_stripes( 100 ) {}
virtual ~Tiger() {}
+ unsigned int GetStripes( void ) const { return m_stripes; }
+ void SetStripes( unsigned int s ) { m_stripes = s; }
+ private:
+ unsigned int m_stripes;
};
class Dog
@@ -2089,3 +2094,164 @@
// this will not compile:
//int i = f1.i;
}
+
+// ----------------------------------------------------------------------------
+
+/// Use these typedefs to test DeleteArray policy.
+
+typedef Loki::StrongPtr< Tiger, true, TwoRefCounts, DisallowConversion,
+ AssertCheck, CantResetWithStrong, DeleteArray, DontPropagateConst >
+ TigerArray_2RefCounts_ptr;
+
+typedef Loki::StrongPtr< Tiger, true, TwoRefLinks, DisallowConversion,
+ AssertCheck, CantResetWithStrong, DeleteArray, DontPropagateConst >
+ TigerArray_2RefLinks_ptr;
+
+typedef Loki::StrongPtr< Tiger, true, LockableTwoRefCounts, DisallowConversion,
+ AssertCheck, CantResetWithStrong, DeleteArray, DontPropagateConst >
+ TigerArray_Lock2RefCounts_ptr;
+
+// ----------------------------------------------------------------------------
+
+void DoStrongArrayTests( void )
+{
+ cout << "Starting DoStrongArrayTests." << endl;
+
+ {
+ // test default construction.
+ TigerArray_2RefCounts_ptr sp1;
+ assert( !sp1 );
+ assert( 0 == sp1.GetArrayCount() );
+
+ // test assignment.
+ sp1.Assign( new Tiger[ 8 ], 8 );
+ assert( sp1 );
+ assert( 8 == sp1.GetArrayCount() );
+ sp1[ 0 ].SetStripes( 8 );
+ sp1[ 1 ].SetStripes( 16 );
+ sp1[ 2 ].SetStripes( 24 );
+ sp1[ 3 ].SetStripes( 32 );
+ sp1[ 4 ].SetStripes( 40);
+ sp1[ 5 ].SetStripes( 48 );
+ sp1[ 6 ].SetStripes( 56 );
+ sp1[ 7 ].SetStripes( 64 );
+
+ // test initialization construction.
+ TigerArray_2RefCounts_ptr sp2( new Tiger[ 4 ], 4 );
+ assert( sp2 );
+ assert( 4 == sp2.GetArrayCount() );
+ sp2[ 0 ].SetStripes( 5 );
+ sp2[ 1 ].SetStripes( 10 );
+ sp2[ 2 ].SetStripes( 15 );
+ sp2[ 3 ].SetStripes( 20 );
+
+ // test range checking.
+ try
+ {
+ Tiger & p4 = sp2[ 4 ];
+ assert( false );
+ }
+ catch ( const ::std::out_of_range & ex )
+ {
+ assert( true );
+ }
+
+ // test range checking.
+ try
+ {
+ Tiger & p8 = sp1[ 8 ];
+ assert( false );
+ }
+ catch ( const ::std::out_of_range & ex )
+ {
+ assert( true );
+ }
+
+ // test swap.
+ sp2.Swap( sp1 );
+ assert( sp1 );
+ assert( sp2 );
+ // test checking of item count.
+ assert( 4 == sp1.GetArrayCount() );
+ assert( 8 == sp2.GetArrayCount() );
+
+ // test that operator[] returns reference to
+ assert( 5 == sp1[ 0 ].GetStripes() );
+ assert( 10 == sp1[ 1 ].GetStripes() );
+ assert( 15 == sp1[ 2 ].GetStripes() );
+ assert( 20 == sp1[ 3 ].GetStripes() );
+ assert( 8 == sp2[ 0 ].GetStripes() );
+ assert( 16 == sp2[ 1 ].GetStripes() );
+ assert( 24 == sp2[ 2 ].GetStripes() );
+ assert( 32 == sp2[ 3 ].GetStripes() );
+ assert( 40 == sp2[ 4 ].GetStripes() );
+ assert( 48 == sp2[ 5 ].GetStripes() );
+ assert( 56 == sp2[ 6 ].GetStripes() );
+ assert( 64 == sp2[ 7 ].GetStripes() );
+
+ try
+ {
+ Tiger & p4 = sp1[ 4 ];
+ assert( false );
+ }
+ catch ( const ::std::out_of_range & ex )
+ {
+ assert( true );
+ }
+
+ try
+ {
+ Tiger & p8 = sp2[ 8 ];
+ assert( false );
+ }
+ catch ( const ::std::out_of_range & ex )
+ {
+ assert( true );
+ }
+
+ const TigerArray_2RefCounts_ptr sp3( sp1 );
+ assert( sp3 == sp1 );
+ assert( sp3.GetArrayCount() == sp1.GetArrayCount() );
+ try
+ {
+ const Tiger & p4 = sp3[ 4 ];
+ assert( false );
+ }
+ catch ( const ::std::out_of_range & ex )
+ {
+ assert( true );
+ }
+
+ const TigerArray_2RefCounts_ptr sp5( sp2 );
+ assert( sp5 == sp2 );
+ assert( sp5.GetArrayCount() == sp2.GetArrayCount() );
+ try
+ {
+ const Tiger & p8 = sp5[ 8 ];
+ assert( false );
+ }
+ catch ( const ::std::out_of_range & ex )
+ {
+ assert( true );
+ }
+
+ sp2 = sp1;
+ assert( sp1 == sp2 );
+ assert( sp3 == sp2 );
+ assert( sp2.GetArrayCount() == sp1.GetArrayCount() );
+ assert( sp2.GetArrayCount() == sp1.GetArrayCount() );
+ assert( sp1 != sp5 );
+ assert( sp2 != sp5 );
+ assert( sp3 != sp5 );
+ assert( sp1.GetArrayCount() != sp5.GetArrayCount() );
+ assert( sp2.GetArrayCount() != sp5.GetArrayCount() );
+ assert( sp3.GetArrayCount() != sp5.GetArrayCount() );
+ }
+
+ assert( BaseClass::AllDestroyed() );
+ assert( !BaseClass::ExtraConstructions() );
+ assert( !BaseClass::ExtraDestructions() );
+ cout << "Finished DoStrongArrayTests." << endl;
+}
+
+// ----------------------------------------------------------------------------
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|