diff --git a/include/loki/StrongPtr.h b/include/loki/StrongPtr.h index 37efb57..4624272 100644 --- a/include/loki/StrongPtr.h +++ b/include/loki/StrongPtr.h @@ -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 ]; } diff --git a/src/StrongPtr.cpp b/src/StrongPtr.cpp index cdabcb0..1f3b5c5 100644 --- a/src/StrongPtr.cpp +++ b/src/StrongPtr.cpp @@ -15,9 +15,6 @@ #include -#include -#include - #include #ifdef DO_EXTRA_LOKI_TESTS #include @@ -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 )