PR libstdc++/28080 (partial)
2007-03-10 Paolo Carlini <pcarlini@suse.de> PR libstdc++/28080 (partial) * include/std/memory: Move C++03 implementation... * include/bits/stl_memory.h: ... here, new. * include/Makefile.am: Add. * include/bits/stl_tempbuf.h: Include the latter instead. * include/tr1/hashtable: Include allocator.h instead of the whole <memory>. * include/tr1/hashtable_policy.h: Include stl_function.h instead of <functional>. * include/Makefile.in: Regenerate. * testsuite/20_util/auto_ptr/assign_neg.cc: Adjust dg-error line numbers. From-SVN: r122805
This commit is contained in:
parent
ed574fe919
commit
b2c50382fb
9 changed files with 392 additions and 334 deletions
|
@ -1,3 +1,18 @@
|
|||
2007-03-10 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
PR libstdc++/28080 (partial)
|
||||
* include/std/memory: Move C++03 implementation...
|
||||
* include/bits/stl_memory.h: ... here, new.
|
||||
* include/Makefile.am: Add.
|
||||
* include/bits/stl_tempbuf.h: Include the latter instead.
|
||||
* include/tr1/hashtable: Include allocator.h instead of
|
||||
the whole <memory>.
|
||||
* include/tr1/hashtable_policy.h: Include stl_function.h
|
||||
instead of <functional>.
|
||||
* include/Makefile.in: Regenerate.
|
||||
* testsuite/20_util/auto_ptr/assign_neg.cc: Adjust dg-error
|
||||
line numbers.
|
||||
|
||||
2007-03-09 Douglas Gregor <doug.gregor@gmail.com>
|
||||
|
||||
* include/Makefile.in: Regenerate.
|
||||
|
|
|
@ -111,6 +111,7 @@ bits_headers = \
|
|||
${bits_srcdir}/stl_iterator_base_types.h \
|
||||
${bits_srcdir}/stl_list.h \
|
||||
${bits_srcdir}/stl_map.h \
|
||||
${bits_srcdir}/stl_memory.h \
|
||||
${bits_srcdir}/stl_multimap.h \
|
||||
${bits_srcdir}/stl_multiset.h \
|
||||
${bits_srcdir}/stl_numeric.h \
|
||||
|
|
|
@ -345,6 +345,7 @@ bits_headers = \
|
|||
${bits_srcdir}/stl_iterator_base_types.h \
|
||||
${bits_srcdir}/stl_list.h \
|
||||
${bits_srcdir}/stl_map.h \
|
||||
${bits_srcdir}/stl_memory.h \
|
||||
${bits_srcdir}/stl_multimap.h \
|
||||
${bits_srcdir}/stl_multiset.h \
|
||||
${bits_srcdir}/stl_numeric.h \
|
||||
|
|
367
libstdc++-v3/include/bits/stl_memory.h
Normal file
367
libstdc++-v3/include/bits/stl_memory.h
Normal file
|
@ -0,0 +1,367 @@
|
|||
// Memory implementation -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 2, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this library; see the file COPYING. If not, write to
|
||||
// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
// Boston, MA 02110-1301, USA.
|
||||
|
||||
// As a special exception, you may use this file as part of a free software
|
||||
// library without restriction. Specifically, if other files instantiate
|
||||
// templates or use macros or inline functions from this file, or you compile
|
||||
// this file and link it with other files to produce an executable, this
|
||||
// file does not by itself cause the resulting executable to be covered by
|
||||
// the GNU General Public License. This exception does not however
|
||||
// invalidate any other reasons why the executable file might be covered by
|
||||
// the GNU General Public License.
|
||||
|
||||
/** @file stl_memory.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _STL_MEMORY_H
|
||||
#define _STL_MEMORY_H 1
|
||||
|
||||
#include <bits/stl_algobase.h>
|
||||
#include <bits/allocator.h>
|
||||
#include <bits/stl_construct.h>
|
||||
#include <bits/stl_uninitialized.h>
|
||||
#include <bits/stl_raw_storage_iter.h>
|
||||
#include <debug/debug.h>
|
||||
#include <limits>
|
||||
|
||||
_GLIBCXX_BEGIN_NAMESPACE(std)
|
||||
|
||||
/**
|
||||
* @if maint
|
||||
* This is a helper function. The unused second parameter exists to
|
||||
* permit the real get_temporary_buffer to use template parameter deduction.
|
||||
*
|
||||
* XXX This should perhaps use the pool.
|
||||
* @endif
|
||||
*/
|
||||
template<typename _Tp>
|
||||
pair<_Tp*, ptrdiff_t>
|
||||
__get_temporary_buffer(ptrdiff_t __len, _Tp*)
|
||||
{
|
||||
const ptrdiff_t __max = numeric_limits<ptrdiff_t>::max() / sizeof(_Tp);
|
||||
if (__len > __max)
|
||||
__len = __max;
|
||||
|
||||
while (__len > 0)
|
||||
{
|
||||
_Tp* __tmp = static_cast<_Tp*>(::operator new(__len * sizeof(_Tp),
|
||||
nothrow));
|
||||
if (__tmp != 0)
|
||||
return pair<_Tp*, ptrdiff_t>(__tmp, __len);
|
||||
__len /= 2;
|
||||
}
|
||||
return pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Allocates a temporary buffer.
|
||||
* @param len The number of objects of type Tp.
|
||||
* @return See full description.
|
||||
*
|
||||
* Reinventing the wheel, but this time with prettier spokes!
|
||||
*
|
||||
* This function tries to obtain storage for @c len adjacent Tp
|
||||
* objects. The objects themselves are not constructed, of course.
|
||||
* A pair<> is returned containing "the buffer s address and
|
||||
* capacity (in the units of sizeof(Tp)), or a pair of 0 values if
|
||||
* no storage can be obtained." Note that the capacity obtained
|
||||
* may be less than that requested if the memory is unavailable;
|
||||
* you should compare len with the .second return value.
|
||||
*
|
||||
* Provides the nothrow exception guarantee.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
inline pair<_Tp*, ptrdiff_t>
|
||||
get_temporary_buffer(ptrdiff_t __len)
|
||||
{ return std::__get_temporary_buffer(__len, static_cast<_Tp*>(0)); }
|
||||
|
||||
/**
|
||||
* @brief The companion to get_temporary_buffer().
|
||||
* @param p A buffer previously allocated by get_temporary_buffer.
|
||||
* @return None.
|
||||
*
|
||||
* Frees the memory pointed to by p.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
void
|
||||
return_temporary_buffer(_Tp* __p)
|
||||
{ ::operator delete(__p, nothrow); }
|
||||
|
||||
/**
|
||||
* A wrapper class to provide auto_ptr with reference semantics.
|
||||
* For example, an auto_ptr can be assigned (or constructed from)
|
||||
* the result of a function which returns an auto_ptr by value.
|
||||
*
|
||||
* All the auto_ptr_ref stuff should happen behind the scenes.
|
||||
*/
|
||||
template<typename _Tp1>
|
||||
struct auto_ptr_ref
|
||||
{
|
||||
_Tp1* _M_ptr;
|
||||
|
||||
explicit
|
||||
auto_ptr_ref(_Tp1* __p): _M_ptr(__p) { }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief A simple smart pointer providing strict ownership semantics.
|
||||
*
|
||||
* The Standard says:
|
||||
* <pre>
|
||||
* An @c auto_ptr owns the object it holds a pointer to. Copying
|
||||
* an @c auto_ptr copies the pointer and transfers ownership to the
|
||||
* destination. If more than one @c auto_ptr owns the same object
|
||||
* at the same time the behavior of the program is undefined.
|
||||
*
|
||||
* The uses of @c auto_ptr include providing temporary
|
||||
* exception-safety for dynamically allocated memory, passing
|
||||
* ownership of dynamically allocated memory to a function, and
|
||||
* returning dynamically allocated memory from a function. @c
|
||||
* auto_ptr does not meet the CopyConstructible and Assignable
|
||||
* requirements for Standard Library <a
|
||||
* href="tables.html#65">container</a> elements and thus
|
||||
* instantiating a Standard Library container with an @c auto_ptr
|
||||
* results in undefined behavior.
|
||||
* </pre>
|
||||
* Quoted from [20.4.5]/3.
|
||||
*
|
||||
* Good examples of what can and cannot be done with auto_ptr can
|
||||
* be found in the libstdc++ testsuite.
|
||||
*
|
||||
* @if maint
|
||||
* _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
* 127. auto_ptr<> conversion issues
|
||||
* These resolutions have all been incorporated.
|
||||
* @endif
|
||||
*/
|
||||
template<typename _Tp>
|
||||
class auto_ptr
|
||||
{
|
||||
private:
|
||||
_Tp* _M_ptr;
|
||||
|
||||
public:
|
||||
/// The pointed-to type.
|
||||
typedef _Tp element_type;
|
||||
|
||||
/**
|
||||
* @brief An %auto_ptr is usually constructed from a raw pointer.
|
||||
* @param p A pointer (defaults to NULL).
|
||||
*
|
||||
* This object now @e owns the object pointed to by @a p.
|
||||
*/
|
||||
explicit
|
||||
auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
|
||||
|
||||
/**
|
||||
* @brief An %auto_ptr can be constructed from another %auto_ptr.
|
||||
* @param a Another %auto_ptr of the same type.
|
||||
*
|
||||
* This object now @e owns the object previously owned by @a a,
|
||||
* which has given up ownsership.
|
||||
*/
|
||||
auto_ptr(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }
|
||||
|
||||
/**
|
||||
* @brief An %auto_ptr can be constructed from another %auto_ptr.
|
||||
* @param a Another %auto_ptr of a different but related type.
|
||||
*
|
||||
* A pointer-to-Tp1 must be convertible to a
|
||||
* pointer-to-Tp/element_type.
|
||||
*
|
||||
* This object now @e owns the object previously owned by @a a,
|
||||
* which has given up ownsership.
|
||||
*/
|
||||
template<typename _Tp1>
|
||||
auto_ptr(auto_ptr<_Tp1>& __a) throw() : _M_ptr(__a.release()) { }
|
||||
|
||||
/**
|
||||
* @brief %auto_ptr assignment operator.
|
||||
* @param a Another %auto_ptr of the same type.
|
||||
*
|
||||
* This object now @e owns the object previously owned by @a a,
|
||||
* which has given up ownsership. The object that this one @e
|
||||
* used to own and track has been deleted.
|
||||
*/
|
||||
auto_ptr&
|
||||
operator=(auto_ptr& __a) throw()
|
||||
{
|
||||
reset(__a.release());
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief %auto_ptr assignment operator.
|
||||
* @param a Another %auto_ptr of a different but related type.
|
||||
*
|
||||
* A pointer-to-Tp1 must be convertible to a pointer-to-Tp/element_type.
|
||||
*
|
||||
* This object now @e owns the object previously owned by @a a,
|
||||
* which has given up ownsership. The object that this one @e
|
||||
* used to own and track has been deleted.
|
||||
*/
|
||||
template<typename _Tp1>
|
||||
auto_ptr&
|
||||
operator=(auto_ptr<_Tp1>& __a) throw()
|
||||
{
|
||||
reset(__a.release());
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* When the %auto_ptr goes out of scope, the object it owns is
|
||||
* deleted. If it no longer owns anything (i.e., @c get() is
|
||||
* @c NULL), then this has no effect.
|
||||
*
|
||||
* @if maint
|
||||
* The C++ standard says there is supposed to be an empty throw
|
||||
* specification here, but omitting it is standard conforming. Its
|
||||
* presence can be detected only if _Tp::~_Tp() throws, but this is
|
||||
* prohibited. [17.4.3.6]/2
|
||||
* @endif
|
||||
*/
|
||||
~auto_ptr() { delete _M_ptr; }
|
||||
|
||||
/**
|
||||
* @brief Smart pointer dereferencing.
|
||||
*
|
||||
* If this %auto_ptr no longer owns anything, then this
|
||||
* operation will crash. (For a smart pointer, "no longer owns
|
||||
* anything" is the same as being a null pointer, and you know
|
||||
* what happens when you dereference one of those...)
|
||||
*/
|
||||
element_type&
|
||||
operator*() const throw()
|
||||
{
|
||||
_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
|
||||
return *_M_ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Smart pointer dereferencing.
|
||||
*
|
||||
* This returns the pointer itself, which the language then will
|
||||
* automatically cause to be dereferenced.
|
||||
*/
|
||||
element_type*
|
||||
operator->() const throw()
|
||||
{
|
||||
_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
|
||||
return _M_ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Bypassing the smart pointer.
|
||||
* @return The raw pointer being managed.
|
||||
*
|
||||
* You can get a copy of the pointer that this object owns, for
|
||||
* situations such as passing to a function which only accepts
|
||||
* a raw pointer.
|
||||
*
|
||||
* @note This %auto_ptr still owns the memory.
|
||||
*/
|
||||
element_type*
|
||||
get() const throw() { return _M_ptr; }
|
||||
|
||||
/**
|
||||
* @brief Bypassing the smart pointer.
|
||||
* @return The raw pointer being managed.
|
||||
*
|
||||
* You can get a copy of the pointer that this object owns, for
|
||||
* situations such as passing to a function which only accepts
|
||||
* a raw pointer.
|
||||
*
|
||||
* @note This %auto_ptr no longer owns the memory. When this object
|
||||
* goes out of scope, nothing will happen.
|
||||
*/
|
||||
element_type*
|
||||
release() throw()
|
||||
{
|
||||
element_type* __tmp = _M_ptr;
|
||||
_M_ptr = 0;
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Forcibly deletes the managed object.
|
||||
* @param p A pointer (defaults to NULL).
|
||||
*
|
||||
* This object now @e owns the object pointed to by @a p. The
|
||||
* previous object has been deleted.
|
||||
*/
|
||||
void
|
||||
reset(element_type* __p = 0) throw()
|
||||
{
|
||||
if (__p != _M_ptr)
|
||||
{
|
||||
delete _M_ptr;
|
||||
_M_ptr = __p;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Automatic conversions
|
||||
*
|
||||
* These operations convert an %auto_ptr into and from an auto_ptr_ref
|
||||
* automatically as needed. This allows constructs such as
|
||||
* @code
|
||||
* auto_ptr<Derived> func_returning_auto_ptr(.....);
|
||||
* ...
|
||||
* auto_ptr<Base> ptr = func_returning_auto_ptr(.....);
|
||||
* @endcode
|
||||
*/
|
||||
auto_ptr(auto_ptr_ref<element_type> __ref) throw()
|
||||
: _M_ptr(__ref._M_ptr) { }
|
||||
|
||||
auto_ptr&
|
||||
operator=(auto_ptr_ref<element_type> __ref) throw()
|
||||
{
|
||||
if (__ref._M_ptr != this->get())
|
||||
{
|
||||
delete _M_ptr;
|
||||
_M_ptr = __ref._M_ptr;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp1>
|
||||
operator auto_ptr_ref<_Tp1>() throw()
|
||||
{ return auto_ptr_ref<_Tp1>(this->release()); }
|
||||
|
||||
template<typename _Tp1>
|
||||
operator auto_ptr<_Tp1>() throw()
|
||||
{ return auto_ptr<_Tp1>(this->release()); }
|
||||
};
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 541. shared_ptr template assignment and void
|
||||
template<>
|
||||
class auto_ptr<void>
|
||||
{
|
||||
public:
|
||||
typedef void element_type;
|
||||
};
|
||||
|
||||
_GLIBCXX_END_NAMESPACE
|
||||
|
||||
#endif /* _STL_MEMORY_H */
|
|
@ -1,6 +1,6 @@
|
|||
// Temporary buffer implementation -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
|
||||
// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
|
@ -62,7 +62,7 @@
|
|||
#ifndef _TEMPBUF_H
|
||||
#define _TEMPBUF_H 1
|
||||
|
||||
#include <memory>
|
||||
#include <bits/stl_memory.h>
|
||||
|
||||
_GLIBCXX_BEGIN_NAMESPACE(std)
|
||||
|
||||
|
|
|
@ -51,334 +51,8 @@
|
|||
|
||||
#pragma GCC system_header
|
||||
|
||||
#include <bits/stl_algobase.h>
|
||||
#include <bits/allocator.h>
|
||||
#include <bits/stl_construct.h>
|
||||
#include <bits/stl_uninitialized.h>
|
||||
#include <bits/stl_raw_storage_iter.h>
|
||||
#include <debug/debug.h>
|
||||
#include <limits>
|
||||
|
||||
_GLIBCXX_BEGIN_NAMESPACE(std)
|
||||
|
||||
/**
|
||||
* @if maint
|
||||
* This is a helper function. The unused second parameter exists to
|
||||
* permit the real get_temporary_buffer to use template parameter deduction.
|
||||
*
|
||||
* XXX This should perhaps use the pool.
|
||||
* @endif
|
||||
*/
|
||||
template<typename _Tp>
|
||||
pair<_Tp*, ptrdiff_t>
|
||||
__get_temporary_buffer(ptrdiff_t __len, _Tp*)
|
||||
{
|
||||
const ptrdiff_t __max = numeric_limits<ptrdiff_t>::max() / sizeof(_Tp);
|
||||
if (__len > __max)
|
||||
__len = __max;
|
||||
|
||||
while (__len > 0)
|
||||
{
|
||||
_Tp* __tmp = static_cast<_Tp*>(::operator new(__len * sizeof(_Tp),
|
||||
nothrow));
|
||||
if (__tmp != 0)
|
||||
return pair<_Tp*, ptrdiff_t>(__tmp, __len);
|
||||
__len /= 2;
|
||||
}
|
||||
return pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Allocates a temporary buffer.
|
||||
* @param len The number of objects of type Tp.
|
||||
* @return See full description.
|
||||
*
|
||||
* Reinventing the wheel, but this time with prettier spokes!
|
||||
*
|
||||
* This function tries to obtain storage for @c len adjacent Tp
|
||||
* objects. The objects themselves are not constructed, of course.
|
||||
* A pair<> is returned containing "the buffer s address and
|
||||
* capacity (in the units of sizeof(Tp)), or a pair of 0 values if
|
||||
* no storage can be obtained." Note that the capacity obtained
|
||||
* may be less than that requested if the memory is unavailable;
|
||||
* you should compare len with the .second return value.
|
||||
*
|
||||
* Provides the nothrow exception guarantee.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
inline pair<_Tp*, ptrdiff_t>
|
||||
get_temporary_buffer(ptrdiff_t __len)
|
||||
{ return std::__get_temporary_buffer(__len, static_cast<_Tp*>(0)); }
|
||||
|
||||
/**
|
||||
* @brief The companion to get_temporary_buffer().
|
||||
* @param p A buffer previously allocated by get_temporary_buffer.
|
||||
* @return None.
|
||||
*
|
||||
* Frees the memory pointed to by p.
|
||||
*/
|
||||
template<typename _Tp>
|
||||
void
|
||||
return_temporary_buffer(_Tp* __p)
|
||||
{ ::operator delete(__p, nothrow); }
|
||||
|
||||
/**
|
||||
* A wrapper class to provide auto_ptr with reference semantics.
|
||||
* For example, an auto_ptr can be assigned (or constructed from)
|
||||
* the result of a function which returns an auto_ptr by value.
|
||||
*
|
||||
* All the auto_ptr_ref stuff should happen behind the scenes.
|
||||
*/
|
||||
template<typename _Tp1>
|
||||
struct auto_ptr_ref
|
||||
{
|
||||
_Tp1* _M_ptr;
|
||||
|
||||
explicit
|
||||
auto_ptr_ref(_Tp1* __p): _M_ptr(__p) { }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief A simple smart pointer providing strict ownership semantics.
|
||||
*
|
||||
* The Standard says:
|
||||
* <pre>
|
||||
* An @c auto_ptr owns the object it holds a pointer to. Copying
|
||||
* an @c auto_ptr copies the pointer and transfers ownership to the
|
||||
* destination. If more than one @c auto_ptr owns the same object
|
||||
* at the same time the behavior of the program is undefined.
|
||||
*
|
||||
* The uses of @c auto_ptr include providing temporary
|
||||
* exception-safety for dynamically allocated memory, passing
|
||||
* ownership of dynamically allocated memory to a function, and
|
||||
* returning dynamically allocated memory from a function. @c
|
||||
* auto_ptr does not meet the CopyConstructible and Assignable
|
||||
* requirements for Standard Library <a
|
||||
* href="tables.html#65">container</a> elements and thus
|
||||
* instantiating a Standard Library container with an @c auto_ptr
|
||||
* results in undefined behavior.
|
||||
* </pre>
|
||||
* Quoted from [20.4.5]/3.
|
||||
*
|
||||
* Good examples of what can and cannot be done with auto_ptr can
|
||||
* be found in the libstdc++ testsuite.
|
||||
*
|
||||
* @if maint
|
||||
* _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
* 127. auto_ptr<> conversion issues
|
||||
* These resolutions have all been incorporated.
|
||||
* @endif
|
||||
*/
|
||||
template<typename _Tp>
|
||||
class auto_ptr
|
||||
{
|
||||
private:
|
||||
_Tp* _M_ptr;
|
||||
|
||||
public:
|
||||
/// The pointed-to type.
|
||||
typedef _Tp element_type;
|
||||
|
||||
/**
|
||||
* @brief An %auto_ptr is usually constructed from a raw pointer.
|
||||
* @param p A pointer (defaults to NULL).
|
||||
*
|
||||
* This object now @e owns the object pointed to by @a p.
|
||||
*/
|
||||
explicit
|
||||
auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
|
||||
|
||||
/**
|
||||
* @brief An %auto_ptr can be constructed from another %auto_ptr.
|
||||
* @param a Another %auto_ptr of the same type.
|
||||
*
|
||||
* This object now @e owns the object previously owned by @a a,
|
||||
* which has given up ownsership.
|
||||
*/
|
||||
auto_ptr(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }
|
||||
|
||||
/**
|
||||
* @brief An %auto_ptr can be constructed from another %auto_ptr.
|
||||
* @param a Another %auto_ptr of a different but related type.
|
||||
*
|
||||
* A pointer-to-Tp1 must be convertible to a
|
||||
* pointer-to-Tp/element_type.
|
||||
*
|
||||
* This object now @e owns the object previously owned by @a a,
|
||||
* which has given up ownsership.
|
||||
*/
|
||||
template<typename _Tp1>
|
||||
auto_ptr(auto_ptr<_Tp1>& __a) throw() : _M_ptr(__a.release()) { }
|
||||
|
||||
/**
|
||||
* @brief %auto_ptr assignment operator.
|
||||
* @param a Another %auto_ptr of the same type.
|
||||
*
|
||||
* This object now @e owns the object previously owned by @a a,
|
||||
* which has given up ownsership. The object that this one @e
|
||||
* used to own and track has been deleted.
|
||||
*/
|
||||
auto_ptr&
|
||||
operator=(auto_ptr& __a) throw()
|
||||
{
|
||||
reset(__a.release());
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief %auto_ptr assignment operator.
|
||||
* @param a Another %auto_ptr of a different but related type.
|
||||
*
|
||||
* A pointer-to-Tp1 must be convertible to a pointer-to-Tp/element_type.
|
||||
*
|
||||
* This object now @e owns the object previously owned by @a a,
|
||||
* which has given up ownsership. The object that this one @e
|
||||
* used to own and track has been deleted.
|
||||
*/
|
||||
template<typename _Tp1>
|
||||
auto_ptr&
|
||||
operator=(auto_ptr<_Tp1>& __a) throw()
|
||||
{
|
||||
reset(__a.release());
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* When the %auto_ptr goes out of scope, the object it owns is
|
||||
* deleted. If it no longer owns anything (i.e., @c get() is
|
||||
* @c NULL), then this has no effect.
|
||||
*
|
||||
* @if maint
|
||||
* The C++ standard says there is supposed to be an empty throw
|
||||
* specification here, but omitting it is standard conforming. Its
|
||||
* presence can be detected only if _Tp::~_Tp() throws, but this is
|
||||
* prohibited. [17.4.3.6]/2
|
||||
* @endif
|
||||
*/
|
||||
~auto_ptr() { delete _M_ptr; }
|
||||
|
||||
/**
|
||||
* @brief Smart pointer dereferencing.
|
||||
*
|
||||
* If this %auto_ptr no longer owns anything, then this
|
||||
* operation will crash. (For a smart pointer, "no longer owns
|
||||
* anything" is the same as being a null pointer, and you know
|
||||
* what happens when you dereference one of those...)
|
||||
*/
|
||||
element_type&
|
||||
operator*() const throw()
|
||||
{
|
||||
_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
|
||||
return *_M_ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Smart pointer dereferencing.
|
||||
*
|
||||
* This returns the pointer itself, which the language then will
|
||||
* automatically cause to be dereferenced.
|
||||
*/
|
||||
element_type*
|
||||
operator->() const throw()
|
||||
{
|
||||
_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
|
||||
return _M_ptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Bypassing the smart pointer.
|
||||
* @return The raw pointer being managed.
|
||||
*
|
||||
* You can get a copy of the pointer that this object owns, for
|
||||
* situations such as passing to a function which only accepts
|
||||
* a raw pointer.
|
||||
*
|
||||
* @note This %auto_ptr still owns the memory.
|
||||
*/
|
||||
element_type*
|
||||
get() const throw() { return _M_ptr; }
|
||||
|
||||
/**
|
||||
* @brief Bypassing the smart pointer.
|
||||
* @return The raw pointer being managed.
|
||||
*
|
||||
* You can get a copy of the pointer that this object owns, for
|
||||
* situations such as passing to a function which only accepts
|
||||
* a raw pointer.
|
||||
*
|
||||
* @note This %auto_ptr no longer owns the memory. When this object
|
||||
* goes out of scope, nothing will happen.
|
||||
*/
|
||||
element_type*
|
||||
release() throw()
|
||||
{
|
||||
element_type* __tmp = _M_ptr;
|
||||
_M_ptr = 0;
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Forcibly deletes the managed object.
|
||||
* @param p A pointer (defaults to NULL).
|
||||
*
|
||||
* This object now @e owns the object pointed to by @a p. The
|
||||
* previous object has been deleted.
|
||||
*/
|
||||
void
|
||||
reset(element_type* __p = 0) throw()
|
||||
{
|
||||
if (__p != _M_ptr)
|
||||
{
|
||||
delete _M_ptr;
|
||||
_M_ptr = __p;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Automatic conversions
|
||||
*
|
||||
* These operations convert an %auto_ptr into and from an auto_ptr_ref
|
||||
* automatically as needed. This allows constructs such as
|
||||
* @code
|
||||
* auto_ptr<Derived> func_returning_auto_ptr(.....);
|
||||
* ...
|
||||
* auto_ptr<Base> ptr = func_returning_auto_ptr(.....);
|
||||
* @endcode
|
||||
*/
|
||||
auto_ptr(auto_ptr_ref<element_type> __ref) throw()
|
||||
: _M_ptr(__ref._M_ptr) { }
|
||||
|
||||
auto_ptr&
|
||||
operator=(auto_ptr_ref<element_type> __ref) throw()
|
||||
{
|
||||
if (__ref._M_ptr != this->get())
|
||||
{
|
||||
delete _M_ptr;
|
||||
_M_ptr = __ref._M_ptr;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp1>
|
||||
operator auto_ptr_ref<_Tp1>() throw()
|
||||
{ return auto_ptr_ref<_Tp1>(this->release()); }
|
||||
|
||||
template<typename _Tp1>
|
||||
operator auto_ptr<_Tp1>() throw()
|
||||
{ return auto_ptr<_Tp1>(this->release()); }
|
||||
};
|
||||
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 541. shared_ptr template assignment and void
|
||||
template<>
|
||||
class auto_ptr<void>
|
||||
{
|
||||
public:
|
||||
typedef void element_type;
|
||||
};
|
||||
|
||||
_GLIBCXX_END_NAMESPACE
|
||||
#include <bits/c++config.h>
|
||||
#include <bits/stl_memory.h>
|
||||
|
||||
#ifdef __GXX_EXPERIMENTAL_CXX0X__
|
||||
# include <tr1/memory>
|
||||
|
|
|
@ -53,10 +53,10 @@
|
|||
#define _TR1_HASHTABLE 1
|
||||
|
||||
#include <utility> // For std::pair
|
||||
#include <memory>
|
||||
#include <iterator>
|
||||
#include <cstddef>
|
||||
#include <cmath>
|
||||
#include <bits/allocator.h>
|
||||
#include <bits/functexcept.h>
|
||||
#include <tr1/type_traits> // For true_type and false_type
|
||||
#include <tr1/hashtable_policy.h>
|
||||
|
|
|
@ -34,8 +34,8 @@
|
|||
#ifndef _TR1_HASHTABLE_POLICY_H
|
||||
#define _TR1_HASHTABLE_POLICY_H 1
|
||||
|
||||
#include <functional> // _Identity, _Select1st
|
||||
#include <algorithm> // lower_bound
|
||||
#include <bits/stl_function.h> // equal_to, _Identity, _Select1st
|
||||
#include <tr1/utility>
|
||||
#include <ext/type_traits.h>
|
||||
|
||||
|
|
|
@ -46,5 +46,5 @@ main()
|
|||
test01();
|
||||
return 0;
|
||||
}
|
||||
// { dg-error "candidates" "" { target *-*-* } 223 }
|
||||
// { dg-error "::auto_ptr" "" { target *-*-* } 353 }
|
||||
// { dg-error "candidates" "" { target *-*-* } 207 }
|
||||
// { dg-error "::auto_ptr" "" { target *-*-* } 337 }
|
||||
|
|
Loading…
Add table
Reference in a new issue