0
0
mirror of https://github.com/OpenVPN/openvpn3.git synced 2024-09-20 20:13:05 +02:00
openvpn3/openvpn/common/scoped_ptr.hpp
James Yonan d6be1cf2ee Android 4 client:
* Added OpenVPN log file page view in advanced preferences.

* Added OpenSSL verify_callback.

* Support ns-cert-type

* Sanitize logged data to remove Session ID.
2012-03-08 10:30:43 +00:00

99 lines
1.6 KiB
C++

#ifndef OPENVPN_COMMON_SCOPED_PTR_H
#define OPENVPN_COMMON_SCOPED_PTR_H
#include <algorithm>
#include <boost/assert.hpp>
#include <boost/noncopyable.hpp>
#include <openvpn/common/types.hpp>
namespace openvpn {
// default delete method for ScopedPtr
template <typename T>
class PtrFree {
public:
static void del(T* p)
{
delete p;
}
};
// array delete method for ScopedPtr
template <typename T>
class PtrArrayFree {
public:
static void del(T* p)
{
delete [] p;
}
};
// Similar to boost::scoped_ptr but has release, reset methods,
// and default constructor usage. Also allows definition of
// alternative delete methods via second argument.
template <typename T, template <typename T> class F = PtrFree>
class ScopedPtr : boost::noncopyable
{
public:
explicit ScopedPtr(T* p = 0)
: px(p) {}
bool defined() const { return px != 0; }
void reset(T* p = 0)
{
if (px)
del(px);
px = p;
}
T* release()
{
T* ret = px;
px = NULL;
return ret;
}
void swap(ScopedPtr& other)
{
std::swap(px, other.px);
}
T& operator*() const
{
BOOST_ASSERT( px != 0 );
return *px;
}
T* operator->() const
{
BOOST_ASSERT( px != 0 );
return px;
}
T* get() const
{
return px;
}
~ScopedPtr()
{
if (px)
del(px);
}
static void del(T* p)
{
F<T>::del(p);
}
protected:
T* px;
};
} // namespace openvpn
#endif // OPENVPN_COMMON_SCOPED_PTR_H