OSDN Git Service

deleter.hpp に ADL 対策を追加
[gintenlib/gintenlib.git] / gintenlib / deleter.hpp
1 #ifndef GINTENLIB_INCLUDED_DELETER_HPP_
2 #define GINTENLIB_INCLUDED_DELETER_HPP_
3
4 /*
5
6       <gintenlib/deleter.hpp>
7
8   deleter : 単純な delete 演算子と等価なファンクタ
9   typed_deleter : 型の指定された deleter
10   dummy_deleter : 何もしないファンクタ
11   typed_dummy_deleter : 型が指定されてるけど何もしないファンクタ
12
13   機能:
14     ポインタ delete 用の関数オブジェクトです。それ以外の何物でもありません。
15     deleter は boost::checked_delete を呼んでますが、この中では単に delete 演算子を呼んでいるだけ。
16     dummy_deleter は delete 演算子すら呼ばない、単なるプレースホルダーとして機能します。
17     それぞれ型付バージョンもあり、それらは unary_function の条件を満たしています。
18
19 */
20
21 #include <functional>
22 #include <boost/checked_delete.hpp>
23
24 namespace gintenlib
25 {
26  namespace deleters_  // ADL 対策
27  {
28   // ただ単に delete するだけのファンクタ
29   struct deleter
30   {
31     typedef void result_type;
32     
33     template<typename T>
34     result_type operator()( T* p ) const throw()
35     {
36       boost::checked_delete( p );
37     }
38     
39   };  // struct deleter
40   
41   // 型の束縛された deleter
42   template<typename T>
43   struct typed_deleter : std::unary_function<T*, void>
44   {
45     void operator()( T* p ) const throw()
46     {
47       boost::checked_delete( p );
48     }
49   
50   };  // struct typed_deleter<T>
51   
52   // 何もしない deleter
53   struct dummy_deleter
54   {
55     typedef void result_type;
56     
57     template<typename T>
58     result_type operator()( T* ) const throw() {}
59     
60   };  // struct dummy_deleter
61   
62   // 型束縛されてるけど何もしない deleter
63   template<typename T>
64   struct typed_dummy_deleter : std::unary_function<T*, void>
65   {
66     void operator()( T* ) const throw() {}
67   
68   };  // struct typed_dummy_deleter<T>
69   
70  }  // namespace deleters_
71  
72  // 名前を引き込む
73  using namespace deleters_;
74
75 }   // namespace gintenlib
76
77 #endif  // #ifndef GINTENLIB_INCLUDED_DELETER_HPP_