Back to revision 1109. Accidentally checked in more files than I intended.

git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@1111 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
rich_sposato 2011-09-20 23:19:14 +00:00
parent 16094ffe39
commit ca6a94ac97
16 changed files with 344 additions and 450 deletions

View file

@ -85,10 +85,7 @@
/// If you write your own policy, you must implement these 3 functions:
/// -# void static Delete( const P * p )
/// -# static P * Default( void )
/// -# Default constructor.
/// -# Copy constructor.
/// -# Templated copy constructor.
/// -# void Swap( YourDeletePolicy & )
/// -# void Swap( YourResetPolicy & )
///
/// \par ResetPolicy
/// A reset policy tells the ReleaseAll and ResetAll functions whether they
@ -238,6 +235,45 @@ 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
///
@ -2032,27 +2068,19 @@ 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 )
{
PointerType p = GetPointer();
KP::OnDereference( p );
KP::OnDereference( GetPointer() );
DP::OnCheckRange( index );
PointerType p = GetPointer();
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
{
ConstPointerType p = GetPointer();
KP::OnDereference( p );
KP::OnDereference( GetPointer() );
DP::OnCheckRange( index );
ConstPointerType p = GetPointer();
return p[ index ];
}

View file

@ -28,29 +28,21 @@
// The __APPLE__ macro does not refer to a compiler, but to the Apple OSX operating system.
#if defined( __APPLE__ )
#warning "GCC for Apple does not allow thread_local storage, so you can not use some parts of Loki."
#undef LOKI_THINKS_COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#undef COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#elif defined( __CYGWIN__ )
#if ( __GNUC__ <= 3 )
#warning "Older versions of GCC for Cygwin do not allow thread_local storage, so you can not use some parts of Loki."
#undef LOKI_THINKS_COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#undef COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#endif
#elif ( __GNUC__ == 4 ) // GNU versions other than Cygwin.
#if ( __GNUC_MINOR__ < 4 )
#warning "GCC versions before 4.4 implements thread_local storage incorrectly, so you can not use some parts of Loki."
#undef LOKI_THINKS_COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#else
#warning "Versions 4.4 through 4.6 of GCC implemented thread_local storage for some platforms, but not others. Run ThreadLocal test project."
#if ( __GNUC_MINOR__ == 4 )
#warning "GCC version 4.4 implements thread_local storage incorrectly, so you can not use some parts of Loki."
#undef COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#endif
#endif
#elif defined( _MSC_VER )
#if ( _MSC_VER < 1300 )
#warning "Only Visual Studio versions 7.0 and after support thread local storage properly, so you can not use some parts of Loki."
#undef LOKI_THINKS_COMPILER_ALLOWS_THREAD_LOCAL_STORAGE
#endif
#endif
#endif
#if defined( LOKI_THINKS_COMPILER_ALLOWS_THREAD_LOCAL_STORAGE ) && !defined( LOKI_THREAD_LOCAL )
@ -65,7 +57,11 @@
you can't use some parts of Loki.
*/
#if defined( _MSC_VER )
#define LOKI_THREAD_LOCAL __declspec( thread )
#if ( _MSC_VER >= 1300 )
#define LOKI_THREAD_LOCAL __declspec( thread )
#else
#error "Only Visual Studio versions 7.0 and after supported."
#endif
#elif ( __GNUC__ )
#define LOKI_THREAD_LOCAL __thread

View file

@ -1339,17 +1339,17 @@ getline(
typename flex_string<E, T, A, S>::value_type delim)
{
size_t nread = 0;
typename std::basic_istream<typename flex_string<E, T, A, S>::value_type,
typename basic_istream<typename flex_string<E, T, A, S>::value_type,
typename flex_string<E, T, A, S>::traits_type>::sentry sentry(is, true);
if (sentry) {
::std::basic_streambuf<typename flex_string<E, T, A, S>::value_type,
basic_streambuf<typename flex_string<E, T, A, S>::value_type,
typename flex_string<E, T, A, S>::traits_type>* buf = is.rdbuf();
str.clear();
while (nread < str.max_size()) {
int c1 = buf->sbumpc();
if (flex_string<E, T, A, S>::traits_type::eq_int_type(c1, flex_string<E, T, A, S>::traits_type::eof())) {
is.setstate(::std::ios_base::eofbit);
is.setstate(ios_base::eofbit);
break;
}
else {
@ -1363,7 +1363,7 @@ getline(
}
}
if (nread == 0 || nread >= str.max_size())
is.setstate(::std::ios_base::failbit);
is.setstate(ios_base::failbit);
return is;
}