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
11namespace wibble {
12namespace raii {
13
14template< typename Instance,
15 typename Delete = void(*)( typename std::remove_reference< Instance >::type & ) >
16struct 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
38template< typename Creator, typename Delete >
39auto 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
46template< typename Instance, typename Delete >
47auto refDeleteIf( bool cond, Instance &ref, Delete deleter )
48 -> AutoDelete< Instance &, Delete >
49{
50 return AutoDelete< Instance &, Delete >( cond, ref, deleter );
51}
52
53template< typename Instance, typename Delete >
54auto 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
Definition amorph.h:17