wibble  1.1
raii.h
Go to the documentation of this file.
1 // -*- C++ -*- (c) 2013 Vladimír Štill
2 
3 #if __cplusplus >= 201103L
4 
5 #include <utility>
6 #include <type_traits>
7 
8 #ifndef WIBBLE_RAII_H
9 #define WIBBLE_RAII_H
10 
11 namespace wibble {
12 namespace raii {
13 
14 template< typename Instance,
15  typename Delete = void(*)( typename std::remove_reference< Instance >::type & ) >
16 struct AutoDelete {
17  Instance value;
18  Delete deleter;
19 
20  AutoDelete( Instance &&instance, Delete deleter ) :
21  AutoDelete( true, std::forward< Instance >( instance ), deleter )
22  { }
23 
24  AutoDelete( bool runDeleter, Instance &&instance, Delete deleter ) :
25  value( std::forward< Instance >( instance ) ),
26  deleter( deleter ), runDeleter( runDeleter )
27  { }
28 
29  ~AutoDelete() {
30  if ( runDeleter )
31  deleter( value );
32  }
33 
34  private:
35  bool runDeleter;
36 };
37 
38 template< typename Creator, typename Delete >
39 auto autoDeleter( Creator creator, Delete deleter )
40  -> AutoDelete< typename std::result_of< Creator() >::type, Delete >
41 {
42  using Instance = typename std::result_of< Creator() >::type;
43  return AutoDelete< Instance, Delete >( true, creator(), deleter );
44 }
45 
46 template< typename Instance, typename Delete >
47 auto refDeleteIf( bool cond, Instance &ref, Delete deleter )
48  -> AutoDelete< Instance &, Delete >
49 {
50  return AutoDelete< Instance &, Delete >( cond, ref, deleter );
51 }
52 
53 template< typename Instance, typename Delete >
54 auto refDeleter( Instance &ref, Delete deleter )
55  -> AutoDelete< Instance &, Delete >
56 {
57  return refDeleteIf( true, ref, deleter );
58 }
59 
60 
61 }
62 }
63 
64 #endif // WIBBLE_RAII_H
65 
66 #endif