You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
93 lines
2.4 KiB
93 lines
2.4 KiB
// |
|
// 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
|
|
|