ENH: Adding auto_ptr to KWSys to provide a conforming version everywhere.

This commit is contained in:
Brad King 2006-03-16 16:04:05 -05:00
parent 779851f213
commit 68ad66444b
2 changed files with 82 additions and 1 deletions

View File

@ -412,7 +412,10 @@ ENDFOREACH(header)
# selected components. Initialize with required components.
SET(KWSYS_CLASSES)
SET(KWSYS_H_FILES Configure SharedForward)
SET(KWSYS_HXX_FILES Configure String hashtable hash_fun hash_map hash_set)
SET(KWSYS_HXX_FILES Configure String
hashtable hash_fun hash_map hash_set
auto_ptr
)
# Enforce component dependencies.
IF(KWSYS_USE_SystemTools)

View File

@ -0,0 +1,78 @@
/*=========================================================================
Program: KWSys - Kitware System Library
Module: $RCSfile$
Copyright (c) Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef @KWSYS_NAMESPACE@_auto_ptr_hxx
#define @KWSYS_NAMESPACE@_auto_ptr_hxx
#if !((defined(_MSC_VER) && _MSC_VER < 1300) || defined(__BORLANDC__))
// Use the conforming implementation provided by the compiler.
#include <@KWSYS_NAMESPACE@/stl/memory>
namespace @KWSYS_NAMESPACE@
{
using @KWSYS_NAMESPACE@_stl::auto_ptr;
}
#else
// This compiler does not have a conforming implementation. Use our
// own.
namespace @KWSYS_NAMESPACE@
{
// C++98 Standard Section 20.4.5 - Template class auto_ptr.
template <class X>
class auto_ptr
{
template <class Y> struct auto_ptr_ref
{
auto_ptr<Y>& p_;
explicit auto_ptr_ref(auto_ptr<Y>& p): p_(p) {}
};
X* x_;
public:
typedef X element_type;
template <class Y>
auto_ptr(auto_ptr<Y>& a) throw(): x_(a.release()) {}
template <class Y>
auto_ptr& operator=(auto_ptr<Y>& a) throw()
{ reset(a.release()); return *this; }
explicit auto_ptr(X* p=0) throw(): x_(p) {}
auto_ptr(auto_ptr& a) throw(): x_(a.release()) {}
auto_ptr& operator=(auto_ptr& a) throw() { reset(a.release()); return *this; }
~auto_ptr() throw() { delete get(); }
X& operator*() const throw() { return *get(); }
X* operator->() const throw() { return get(); }
X* get() const throw() { return x_; }
X* release() throw() { X* x = x_; x_ = 0; return x; }
void reset(X* p=0) throw() { if(get() != p) { delete get(); x_ = p; } }
auto_ptr(auto_ptr_ref<X> r) throw(): x_(r.p_.release()) {}
template <class Y> operator auto_ptr_ref<Y>() throw() { return *this; }
template <class Y> operator auto_ptr<Y>() throw() { return release(); }
auto_ptr& operator=(auto_ptr_ref<X> r) throw() { x_ = r.p_.release(); return *this; }
};
} // namespace @KWSYS_NAMESPACE@
#endif
#endif