94 lines
2.5 KiB
C++
94 lines
2.5 KiB
C++
|
//
|
||
|
// 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
|