acme
Foundational cross-platform layer of the ca2 framework
Toggle main menu visibility
Loading...
Searching...
No Matches
scoped_restore.h
1
#pragma once
2
3
4
template
<
class
TYPE>
5
struct
scoped_restore_struct
6
{
7
8
9
TYPE * m_pKept;
10
TYPE m_valueRestore;
11
12
scoped_restore_struct(TYPE * pKept);
13
scoped_restore_struct(TYPE * pKept,
const
TYPE & set);
14
~scoped_restore_struct();
15
16
void
Restore();
17
18
};
19
20
21
template
<
class
TYPE>
22
scoped_restore_struct<TYPE>::scoped_restore_struct(TYPE * pKept):
23
m_pKept(pKept),
24
m_valueRestore(*m_pKept)
25
{
26
27
}
28
29
30
template
<
class
TYPE>
31
scoped_restore_struct<TYPE>::scoped_restore_struct(TYPE * pKept,
const
TYPE & set) :
32
m_pKept(pKept),
33
m_valueRestore(*m_pKept)
34
{
35
36
*m_pKept = set;
37
}
38
39
40
41
template
<
class
TYPE>
42
scoped_restore_struct<TYPE>::~scoped_restore_struct()
43
{
44
45
Restore();
46
47
}
48
49
50
template
<
class
TYPE>
51
void
scoped_restore_struct<TYPE>::Restore()
52
{
53
54
*m_pKept = m_valueRestore;
55
56
}
57
58
59
template
<
typename
TYPE >
60
inline ::scoped_restore_struct < TYPE > create_scoped_restore(TYPE & t)
61
{
62
63
return
{&t};
64
65
}
66
67
#define __counter_name__(name) TOKEN_CONCATENATE(name, TOKEN_CONCATENATE(__, __COUNTER__))
68
69
70
71
72
#define scoped_restore(payload) auto __counter_name__(scoped_restore) = create_scoped_restore(payload)
73
74
75
//#define __set_restore(payload, set) ::scoped_restore < decltype(payload) > TOKEN_CONCATENATE(scopedrestore, __COUNTER__) (&payload); ::payload = set
76
77
78
79
80
81
template
<
class
PREDICATE>
82
struct
run_at_destructor_struct
83
{
84
85
PREDICATE m_predicate;
86
87
run_at_destructor_struct(PREDICATE predicate) : m_predicate(predicate) {}
88
~run_at_destructor_struct() { m_predicate(); }
89
90
};
91
92
93
#define at_end_of_scope run_at_destructor_struct __counter_name__(run_at_destructor) = [&]()
94
95
96
platform
scoped_restore.h
Generated by
1.17.0