blob: 6b66b10f4f88b8999788ddb289c6ba538382d850 [file] [log] [blame]
//
// Copyright (c) 2010 Artyom Beilis (Tonkikh)
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#ifndef BOOST_LOCALE_HOLD_PTR_H
#define BOOST_LOCALE_HOLD_PTR_H
namespace boost {
namespace locale {
///
/// \brief a smart pointer similar to std::auto_ptr but it is non-copyable and the
/// underlying object has the same constness as the pointer itself (unlike an ordinary pointer).
///
template<typename T>
class hold_ptr {
hold_ptr(hold_ptr const &other); // non copyable
hold_ptr const &operator=(hold_ptr const &other); // non assignable
public:
///
/// Create new empty pointer
///
hold_ptr() : ptr_(0) {}
///
/// Create a pointer that holds \a v, ownership is transferred to smart pointer
///
explicit hold_ptr(T *v) : ptr_(v) {}
///
/// Destroy smart pointer and the object it owns.
///
~hold_ptr()
{
delete ptr_;
}
///
/// Get a const pointer to the object
///
T const *get() const { return ptr_; }
///
/// Get a mutable pointer to the object
///
T *get() { return ptr_; }
///
/// Get a const reference to the object
///
T const &operator *() const { return *ptr_; }
///
/// Get a mutable reference to the object
///
T &operator *() { return *ptr_; }
///
/// Get a const pointer to the object
///
T const *operator->() const { return ptr_; }
///
/// Get a mutable pointer to the object
///
T *operator->() { return ptr_; }
///
/// Transfer an ownership on the pointer to user
///
T *release() { T *tmp=ptr_; ptr_=0; return tmp; }
///
/// Set new value to pointer, previous object is destroyed, ownership on new object is transferred
///
void reset(T *p=0)
{
if(ptr_) delete ptr_;
ptr_=p;
}
/// Swap two pointers
void swap(hold_ptr &other)
{
T *tmp=other.ptr_;
other.ptr_=ptr_;
ptr_=tmp;
}
private:
T *ptr_;
};
} // locale
} // boost
#endif
// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4