git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@1112 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
rich_sposato 2011-09-20 23:25:41 +00:00
parent ca6a94ac97
commit bec200e5f8
2 changed files with 16 additions and 86 deletions

View file

@ -85,7 +85,10 @@
/// If you write your own policy, you must implement these 3 functions:
/// -# void static Delete( const P * p )
/// -# static P * Default( void )
/// -# void Swap( YourResetPolicy & )
/// -# Default constructor.
/// -# Copy constructor.
/// -# Templated copy constructor.
/// -# void Swap( YourDeletePolicy & )
///
/// \par ResetPolicy
/// A reset policy tells the ReleaseAll and ResetAll functions whether they
@ -235,45 +238,6 @@ protected:
inline void Swap( DeleteSingle & ) {}
};
namespace Private
{
////////////////////////////////////////////////////////////////////////////////
/// \class DeleteArrayBase
///
/// \ingroup StrongPointerDeleteGroup
/// Base class used only by the DeleteArray policy class. This stores the
/// number of elements in an array of shared objects.
////////////////////////////////////////////////////////////////////////////////
class DeleteArrayBase
{
public:
inline size_t GetArrayCount( void ) const { return m_itemCount; }
protected:
DeleteArrayBase( void ) : m_itemCount( 0 ) {}
explicit DeleteArrayBase( size_t itemCount ) : m_itemCount( itemCount ) {}
DeleteArrayBase( const DeleteArrayBase & that ) : m_itemCount( that.m_itemCount ) {}
void Swap( DeleteArrayBase & rhs );
void OnInit( const void * p ) const;
void OnCheckRange( size_t index ) const;
private:
size_t m_itemCount;
};
}
////////////////////////////////////////////////////////////////////////////////
/// \class DeleteArray
///
@ -2068,19 +2032,27 @@ public:
return * GetPointer();
}
/** operator[] returns a reference to an modifiable object. If the index is greater than or
equal to the number of elements, the function will throw a std::out_of_range exception.
This only works with DeleteArray policy. Any other policy will cause a compiler error.
*/
ReferenceType operator [] ( size_t index )
{
KP::OnDereference( GetPointer() );
DP::OnCheckRange( index );
PointerType p = GetPointer();
KP::OnDereference( p );
DP::OnCheckRange( index );
return p[ index ];
}
/** operator[] returns a reference to a const object. If the index is greater than or
equal to the number of elements, the function will throw a std::out_of_range exception.
This only works with DeleteArray policy. Any other policy will cause a compiler error.
*/
ConstReferenceType operator [] ( size_t index ) const
{
KP::OnDereference( GetPointer() );
DP::OnCheckRange( index );
ConstPointerType p = GetPointer();
KP::OnDereference( p );
DP::OnCheckRange( index );
return p[ index ];
}

View file

@ -15,9 +15,6 @@
#include <loki/StrongPtr.h>
#include <stdexcept>
#include <string>
#include <memory.h>
#ifdef DO_EXTRA_LOKI_TESTS
#include <cassert>
@ -41,45 +38,6 @@ namespace Private
// ----------------------------------------------------------------------------
void DeleteArrayBase::Swap( DeleteArrayBase & rhs )
{
assert( NULL != this );
const size_t temp = m_itemCount;
m_itemCount = rhs.m_itemCount;
rhs.m_itemCount = temp;
}
// ----------------------------------------------------------------------------
void DeleteArrayBase::OnInit( const void * p ) const
{
assert( NULL != this );
if ( NULL == p )
{
assert( 0 == m_itemCount );
}
else
{
assert( 0 < m_itemCount );
}
}
// ----------------------------------------------------------------------------
void DeleteArrayBase::OnCheckRange( size_t index ) const
{
assert( NULL != this );
if ( index < m_itemCount )
return;
const ::std::string message( "index out of range in ::Loki::DeleteArrayBase::OnCheckRange" );
throw ::std::out_of_range( message );
}
// ----------------------------------------------------------------------------
OneOwnerRefCountInfo::OneOwnerRefCountInfo( SingleOwnerRefCount * ptr )
: m_pointer( NULL )
, m_strongPtr( ptr )