16 #ifndef INCLUDE_NN_NLIB_UNIQUEPTR_H_ 17 #define INCLUDE_NN_NLIB_UNIQUEPTR_H_ 23 #include "nn/nlib/Swap.h" 24 #include "nn/nlib/Hash.h" 27 #if defined(NLIB_CXX11_UNIQUEPTR) && defined(__cpp_alias_templates) 30 template <
class T,
class DEL = std::default_delete<T> >
31 using UniquePtr = std::unique_ptr<T, DEL>;
33 using DefaultDelete = std::default_delete<T>;
42 struct DefaultDelete {
50 struct DefaultDelete<T[]> {
57 NLIB_STATIC_ASSERT(IsEmpty<DefaultDelete<int> >::value&& IsEmpty<DefaultDelete<
int[]> >::value);
61 template <
class T,
class DEL,
bool DEL_EMPTY>
64 UniquePtrBase() : ptr_(NULL), deleter_() {}
65 explicit UniquePtrBase(T* ptr) : ptr_(ptr), deleter_() {}
66 UniquePtrBase(T* ptr,
const DEL& del) : ptr_(ptr), deleter_(del) {}
69 DEL& get_deleter() {
return deleter_; }
70 const DEL& get_deleter()
const {
return deleter_; }
75 swap(this->ptr_, rhs.ptr_);
76 swap(this->deleter_, rhs.deleter_);
81 template <
class T,
class DEL>
82 class UniquePtrBase<T, DEL, true> :
public DEL {
84 UniquePtrBase() : ptr_(NULL) {}
85 explicit UniquePtrBase(T* ptr) : ptr_(ptr) {}
86 UniquePtrBase(T* ptr,
const DEL& del) : DEL(del), ptr_(ptr) {}
89 DEL& get_deleter() {
return *
this; }
90 const DEL& get_deleter()
const {
return *
this; }
94 swap(this->ptr_, rhs.ptr_);
100 struct IsCompleteType
101 :
public IntegralConstant<bool, (sizeof(S) != 0 || sizeof(S) == 0)> {};
104 struct IsCompleteType<void> :
public TrueType {};
108 template <
class T,
class DEL = DefaultDelete<T> >
110 typedef detail::UniquePtrBase<T, DEL, IsEmpty<DEL>::value> BaseType;
134 if (this->ptr_) get_deleter()(this->ptr_);
139 if (p != this->ptr_) {
142 if (old) get_deleter()(old);
146 NLIB_ASSERT(this->ptr_ != NULL);
150 NLIB_ASSERT(this->ptr_ != NULL);
163 size_t GetHash()
const {
return Hash<T*>()(this->
get()); }
164 DEL& get_deleter() {
return BaseType::get_deleter(); }
165 const DEL& get_deleter()
const {
return BaseType::get_deleter(); }
170 template <
class S,
class D>
172 template <
class S,
class D>
177 template <
class T,
class DEL>
178 class UniquePtr<T[], DEL> :
public detail::UniquePtrBase<T, DEL, IsEmpty<DEL>::value> {
179 typedef detail::UniquePtrBase<T, DEL, IsEmpty<DEL>::value> BaseType;
189 UniquePtr(T* p,
const DEL& del) : BaseType(p, del) {}
201 get_deleter()(this->ptr_);
206 if (p != this->ptr_) {
209 if (old) get_deleter()(old);
213 NLIB_ASSERT(this->ptr_ != NULL);
217 NLIB_ASSERT(this->ptr_ != NULL);
226 T& operator[](
size_t n) {
return get()[n]; }
227 const T& operator[](
size_t n)
const {
return get()[n]; }
228 size_t GetHash()
const {
return Hash<T*>()(this->
get()); }
229 DEL& get_deleter() {
return BaseType::get_deleter(); }
230 const DEL& get_deleter()
const {
return BaseType::get_deleter(); }
235 template <
class S,
class D>
237 template <
class S,
class D>
242 template <
class T1,
class D1,
class T2,
class D2>
244 return rhs.get() == lhs.get();
247 template <
class T1,
class D1>
252 template <
class T1,
class D1>
257 template <
class T1,
class D1,
class T2,
class D2>
259 return rhs.get() != lhs.get();
262 template <
class T1,
class D1>
264 return static_cast<bool>(lhs);
267 template <
class T1,
class D1>
269 return static_cast<bool>(rhs);
274 NLIB_DEFINE_STD_SWAP_T_BEGIN2(
nn, nlib)
275 NLIB_DEFINE_STD_SWAP_T2(T, DEL, NLIB_NS::UniquePtr)
276 NLIB_DEFINE_STD_SWAP_T_END2(
nn, nlib)
278 NLIB_DEFINE_STD_HASH_BEGIN2(
nn, nlib)
279 NLIB_DEFINE_STD_HASH_T2(T, DEL, NLIB_NS::UniquePtr)
280 NLIB_DEFINE_STD_HASH_END2(
nn, nlib)
299 template <
class T,
class ALLOC,
bool DEL_EMPTY>
300 class DefaultDeleteExBase {
302 DefaultDeleteExBase() : al() {}
303 explicit DefaultDeleteExBase(
const ALLOC& al_) : al(al_) {}
306 ALLOC& get_allocator() {
return al; }
313 template <
class T,
class ALLOC>
314 class DefaultDeleteExBase<T, ALLOC, true> :
public ALLOC {
316 DefaultDeleteExBase() {}
317 explicit DefaultDeleteExBase(
const ALLOC& al_) { NLIB_UNUSED(al_); }
320 ALLOC& get_allocator() {
return *
this; }
325 template <
class T,
class ALLOC = std::allocator<T> >
326 struct DefaultDeleteEx :
public detail::DefaultDeleteExBase<T, ALLOC, IsEmpty<ALLOC>::value> {
330 typedef detail::DefaultDeleteExBase<T, ALLOC, IsEmpty<ALLOC>::value> BaseType;
332 ALLOC& al = BaseType::get_allocator();
339 template <
class T,
class ALLOC>
340 struct DefaultDeleteEx<T[], ALLOC>
341 :
public detail::DefaultDeleteExBase<T, ALLOC, IsEmpty<ALLOC>::value> {
349 typedef detail::DefaultDeleteExBase<T, ALLOC, IsEmpty<ALLOC>::value> BaseType;
353 ALLOC& al = BaseType::get_allocator();
362 #ifdef NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS 363 template<
class T,
class DEL>
366 template<
class T,
class DEL>
370 #endif // INCLUDE_NN_NLIB_UNIQUEPTR_H_ ~UniquePtr() noexcept
デストラクタです。ポインタがNULLでなければデリータを実行して削除します。
UniquePtr(T *p) noexcept
ポインタを設定します。
C++11の標準ヘッダとなるtype_traitsの代用定義です。 コンパイラや標準ライブラリによってサポートされてい...
constexpr UniquePtr(nullptr_t) noexcept
引数にnullptrを与えた場合に呼び出されます。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
T element_type
Tがtypedefされています。
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
bool operator==(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価ならば、trueを返します。
bool operator!=(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価でなければ、trueを返します。
void reset(T *p=0) noexcept
ポインタを置き換えます。置き換えられたポインタは削除されます。
constexpr UniquePtr() noexcept
デフォルトコンストラクタです。
size_t GetHash() const
ポインタに対してハッシュ値の計算を行い、計算結果を返します。
UniquePtr & operator=(nullptr_t) noexcept
nullptrを代入します。
AddRef< T >::type operator*() const
ポインタの参照外しを行います。
空の構造体で、関数の引数をムーブすべきことを示すために利用されます。
void swap(UniquePtr &rhs) noexcept
格納されているポインタをスワップします。
T * operator->() const noexcept
ポインタを返します。
DefaultDelete< FutureTuple< R1, R2 > > deleter_type
DELがtypedefされています。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
TimeSpan operator*(int i, const TimeSpan &rhs) noexcept
rhs を i 倍します。
UniquePtr & assign(UniquePtr &rhs, move_tag) noexcept
ムーブにより代入します。
UniquePtr(UniquePtr &rhs, move_tag) noexcept
ムーブによりオブジェクトを構築します。
UniquePtr(T *p, const DEL &del)
ポインタとデリータを設定します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_STATIC_ASSERT(exp)
静的アサートが定義されます。利用可能であればstatic_assertを利用します。
T * pointer_type
T*がtypedefされています。
T * release() noexcept
ポインタの所有権を手放し、ポインタを返します。