Mercurial > octave
annotate liboctave/util/action-container.h @ 23442:53f5f8231c37
allow most header files to be compiled separately
* build-aux/mk-opts.pl: Include <limits> in generated header files.
* file-io.h, ls-hdf5.h, ls-mat-ascii.h, ls-mat4.h, ls-mat5.h,
ls-oct-binary.h, ls-oct-text.h, ls-utils.h, mxarray.in.h,
octave-link.h, octave-preserve-stream-state.h, pt-check.h,
pt-tm-const.h, DAERTFunc.h, aepbalance.h, eigs-base.h,
Sparse-diag-op-defs.h, Sparse-op-defs.h, Sparse-perm-op-defs.h,
action-container.h, oct-rl-edit.h, url-transfer.h:
Include additional headers or use forward declarations to allow
successful compilation of the file by itself.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 26 Apr 2017 01:20:50 -0400 |
parents | 442fe5b5afb5 |
children | 0b4d1575a2e2 |
rev | line source |
---|---|
15396 | 1 /* |
2 | |
23219
3ac9f9ecfae5
maint: Update copyright dates.
John W. Eaton <jwe@octave.org>
parents:
23083
diff
changeset
|
3 Copyright (C) 1993-2017 John W. Eaton |
15396 | 4 Copyright (C) 2009-2010 VZLU Prague |
5 | |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
9 under the terms of the GNU General Public License as published by |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
10 the Free Software Foundation; either version 3 of the License, or |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
11 (at your option) any later version. |
15396 | 12 |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
13 Octave is distributed in the hope that it will be useful, but |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
14 WITHOUT ANY WARRANTY; without even the implied warranty of |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
16 GNU General Public License for more details. |
15396 | 17 |
18 You should have received a copy of the GNU General Public License | |
19 along with Octave; see the file COPYING. If not, see | |
20 <http://www.gnu.org/licenses/>. | |
21 | |
22 */ | |
23 | |
20791
f7084eae3318
maint: Use Octave coding conventions for #if statements.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
24 #if ! defined (octave_action_container_h) |
15396 | 25 #define octave_action_container_h 1 |
26 | |
21244
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21139
diff
changeset
|
27 #include "octave-config.h" |
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21139
diff
changeset
|
28 |
23442
53f5f8231c37
allow most header files to be compiled separately
John W. Eaton <jwe@octave.org>
parents:
23437
diff
changeset
|
29 #include <cstddef> |
53f5f8231c37
allow most header files to be compiled separately
John W. Eaton <jwe@octave.org>
parents:
23437
diff
changeset
|
30 |
15396 | 31 // This class allows registering actions in a list for later |
32 // execution, either explicitly or when the container goes out of | |
33 // scope. | |
34 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
35 // FIXME: is there a better name for this class? |
15396 | 36 |
37 class | |
38 action_container | |
39 { | |
40 public: | |
41 | |
21751
b571fc85953f
maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents:
21244
diff
changeset
|
42 // A generic unwind_protect element. Knows how to run itself and |
15396 | 43 // discard itself. Also, contains a pointer to the next element. |
44 class elem | |
45 { | |
46 public: | |
47 | |
48 friend class action_container; | |
49 | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
50 elem (void) { } |
15396 | 51 |
52 // No copying! | |
53 | |
22865
89756f2f085b
use c++11 style for deleting default copy constructor and assignment operator
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
54 elem (const elem&) = delete; |
15396 | 55 |
22865
89756f2f085b
use c++11 style for deleting default copy constructor and assignment operator
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
56 elem& operator = (const elem&) = delete; |
15396 | 57 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
58 virtual ~elem (void) = default; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
59 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
60 virtual void run (void) { } |
15396 | 61 }; |
62 | |
63 // An element that merely runs a void (*)(void) function. | |
64 | |
65 class fcn_elem : public elem | |
66 { | |
67 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
68 |
15396 | 69 fcn_elem (void (*fptr) (void)) |
70 : e_fptr (fptr) { } | |
71 | |
72 void run (void) { e_fptr (); } | |
73 | |
74 private: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
75 |
15396 | 76 void (*e_fptr) (void); |
77 }; | |
78 | |
79 // An element that stores a variable of type T along with a void (*) (T) | |
80 // function pointer, and calls the function with the parameter. | |
81 | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
82 template <typename T> |
15396 | 83 class fcn_arg_elem : public elem |
84 { | |
85 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
86 |
15396 | 87 fcn_arg_elem (void (*fcn) (T), T arg) |
88 : e_fcn (fcn), e_arg (arg) { } | |
89 | |
90 // No copying! | |
91 | |
22865
89756f2f085b
use c++11 style for deleting default copy constructor and assignment operator
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
92 fcn_arg_elem (const fcn_arg_elem&) = delete; |
15396 | 93 |
22865
89756f2f085b
use c++11 style for deleting default copy constructor and assignment operator
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
94 fcn_arg_elem& operator = (const fcn_arg_elem&) = delete; |
15396 | 95 |
96 void run (void) { e_fcn (e_arg); } | |
97 | |
98 private: | |
99 | |
100 void (*e_fcn) (T); | |
101 | |
102 T e_arg; | |
103 }; | |
104 | |
105 // An element that stores a variable of type T along with a | |
106 // void (*) (const T&) function pointer, and calls the function with | |
107 // the parameter. | |
108 | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
109 template <typename T> |
15396 | 110 class fcn_crefarg_elem : public elem |
111 { | |
112 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
113 |
15396 | 114 fcn_crefarg_elem (void (*fcn) (const T&), const T& arg) |
115 : e_fcn (fcn), e_arg (arg) { } | |
116 | |
117 void run (void) { e_fcn (e_arg); } | |
118 | |
119 private: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
120 |
15396 | 121 void (*e_fcn) (const T&); |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
122 |
15396 | 123 T e_arg; |
124 }; | |
125 | |
126 // An element for calling a member function. | |
127 | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
128 template <typename T> |
15396 | 129 class method_elem : public elem |
130 { | |
131 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
132 |
15396 | 133 method_elem (T *obj, void (T::*method) (void)) |
134 : e_obj (obj), e_method (method) { } | |
135 | |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
136 method_elem (T& obj, void (T::*method) (void)) |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
137 : e_obj (&obj), e_method (method) { } |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
138 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
139 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
140 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
141 method_elem (const method_elem&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
142 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
143 method_elem operator = (const method_elem&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
144 |
15396 | 145 void run (void) { (e_obj->*e_method) (); } |
146 | |
147 private: | |
148 | |
149 T *e_obj; | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
150 |
15396 | 151 void (T::*e_method) (void); |
152 }; | |
153 | |
154 // An element for calling a member function with a single argument | |
155 | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
156 template <typename T, typename A> |
15396 | 157 class method_arg_elem : public elem |
158 { | |
159 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
160 |
15396 | 161 method_arg_elem (T *obj, void (T::*method) (A), A arg) |
162 : e_obj (obj), e_method (method), e_arg (arg) { } | |
163 | |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
164 method_arg_elem (T& obj, void (T::*method) (A), A arg) |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
165 : e_obj (&obj), e_method (method), e_arg (arg) { } |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
166 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
167 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
168 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
169 method_arg_elem (const method_arg_elem&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
170 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
171 method_arg_elem operator = (const method_arg_elem&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
172 |
15396 | 173 void run (void) { (e_obj->*e_method) (e_arg); } |
174 | |
175 private: | |
176 | |
177 T *e_obj; | |
178 | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
179 void (T::*e_method) (A); |
15396 | 180 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
181 A e_arg; |
15396 | 182 }; |
183 | |
184 // An element for calling a member function with a single argument | |
185 | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
186 template <typename T, typename A> |
15396 | 187 class method_crefarg_elem : public elem |
188 { | |
189 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
190 |
15396 | 191 method_crefarg_elem (T *obj, void (T::*method) (const A&), const A& arg) |
192 : e_obj (obj), e_method (method), e_arg (arg) { } | |
193 | |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
194 method_crefarg_elem (T& obj, void (T::*method) (const A&), const A& arg) |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
195 : e_obj (&obj), e_method (method), e_arg (arg) { } |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
196 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
197 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
198 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
199 method_crefarg_elem (const method_crefarg_elem&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
200 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
201 method_crefarg_elem operator = (const method_crefarg_elem&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
202 |
15396 | 203 void run (void) { (e_obj->*e_method) (e_arg); } |
204 | |
205 private: | |
206 | |
207 T *e_obj; | |
208 | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
209 void (T::*e_method) (const A&); |
15396 | 210 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
211 A e_arg; |
15396 | 212 }; |
213 | |
214 // An element that stores arbitrary variable, and restores it. | |
215 | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
216 template <typename T> |
15396 | 217 class restore_var_elem : public elem |
218 { | |
219 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
220 |
15396 | 221 restore_var_elem (T& ref, const T& val) |
222 : e_ptr (&ref), e_val (val) { } | |
223 | |
224 // No copying! | |
225 | |
22865
89756f2f085b
use c++11 style for deleting default copy constructor and assignment operator
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
226 restore_var_elem (const restore_var_elem&) = delete; |
15396 | 227 |
22865
89756f2f085b
use c++11 style for deleting default copy constructor and assignment operator
John W. Eaton <jwe@octave.org>
parents:
22755
diff
changeset
|
228 restore_var_elem& operator = (const restore_var_elem&) = delete; |
15396 | 229 |
230 void run (void) { *e_ptr = e_val; } | |
231 | |
232 private: | |
233 | |
234 T *e_ptr, e_val; | |
235 }; | |
236 | |
237 // Deletes a class allocated using new. | |
238 | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
239 template <typename T> |
15396 | 240 class delete_ptr_elem : public elem |
241 { | |
242 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
243 |
15396 | 244 delete_ptr_elem (T *ptr) |
245 : e_ptr (ptr) { } | |
246 | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
247 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
248 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
249 delete_ptr_elem (const delete_ptr_elem&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
250 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
251 delete_ptr_elem operator = (const delete_ptr_elem&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
252 |
15396 | 253 void run (void) { delete e_ptr; } |
254 | |
255 private: | |
256 | |
257 T *e_ptr; | |
258 }; | |
259 | |
260 action_container (void) { } | |
261 | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
262 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
263 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
264 action_container (const action_container&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
265 |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
266 action_container& operator = (const action_container&) = delete; |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
267 |
22868
87e3163f6c87
use c++11 "= default" syntax for declaration of trivial destructors
John W. Eaton <jwe@octave.org>
parents:
22865
diff
changeset
|
268 virtual ~action_container (void) = default; |
15396 | 269 |
270 virtual void add (elem *new_elem) = 0; | |
271 | |
272 // Call to void func (void). | |
273 void add_fcn (void (*fcn) (void)) | |
274 { | |
275 add (new fcn_elem (fcn)); | |
276 } | |
277 | |
278 // Call to void func (T). | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
279 template <typename T> |
15396 | 280 void add_fcn (void (*action) (T), T val) |
281 { | |
282 add (new fcn_arg_elem<T> (action, val)); | |
283 } | |
284 | |
285 // Call to void func (const T&). | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
286 template <typename T> |
15396 | 287 void add_fcn (void (*action) (const T&), const T& val) |
288 { | |
289 add (new fcn_crefarg_elem<T> (action, val)); | |
290 } | |
291 | |
292 // Call to T::method (void). | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
293 template <typename T> |
15396 | 294 void add_method (T *obj, void (T::*method) (void)) |
295 { | |
296 add (new method_elem<T> (obj, method)); | |
297 } | |
298 | |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
299 template <typename T> |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
300 void add_method (T& obj, void (T::*method) (void)) |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
301 { |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
302 add (new method_elem<T> (obj, method)); |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
303 } |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
304 |
15396 | 305 // Call to T::method (A). |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
306 template <typename T, typename A> |
15396 | 307 void add_method (T *obj, void (T::*method) (A), A arg) |
308 { | |
309 add (new method_arg_elem<T, A> (obj, method, arg)); | |
310 } | |
311 | |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
312 template <typename T, typename A> |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
313 void add_method (T& obj, void (T::*method) (A), A arg) |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
314 { |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
315 add (new method_arg_elem<T, A> (obj, method, arg)); |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
316 } |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
317 |
15396 | 318 // Call to T::method (const A&). |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
319 template <typename T, typename A> |
15396 | 320 void add_method (T *obj, void (T::*method) (const A&), const A& arg) |
321 { | |
322 add (new method_crefarg_elem<T, A> (obj, method, arg)); | |
323 } | |
324 | |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
325 template <typename T, typename A> |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
326 void add_method (T& obj, void (T::*method) (const A&), const A& arg) |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
327 { |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
328 add (new method_crefarg_elem<T, A> (obj, method, arg)); |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
329 } |
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
330 |
15396 | 331 // Call to delete (T*). |
332 | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
333 template <typename T> |
15396 | 334 void add_delete (T *obj) |
335 { | |
336 add (new delete_ptr_elem<T> (obj)); | |
337 } | |
338 | |
339 // Protect any variable. | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
340 template <typename T> |
15396 | 341 void protect_var (T& var) |
342 { | |
343 add (new restore_var_elem<T> (var, var)); | |
344 } | |
345 | |
346 // Protect any variable, value given. | |
21139
538b57866b90
consistently use "typename" intead of "class" in template declarations
John W. Eaton <jwe@octave.org>
parents:
20791
diff
changeset
|
347 template <typename T> |
15396 | 348 void protect_var (T& var, const T& val) |
349 { | |
350 add (new restore_var_elem<T> (var, val)); | |
351 } | |
352 | |
353 operator bool (void) const { return ! empty (); } | |
354 | |
355 virtual void run_first (void) = 0; | |
356 | |
357 void run (size_t num) | |
358 { | |
359 if (num > size ()) | |
360 num = size (); | |
361 | |
362 for (size_t i = 0; i < num; i++) | |
363 run_first (); | |
364 } | |
365 | |
366 void run (void) { run (size ()); } | |
367 | |
368 virtual void discard_first (void) = 0; | |
369 | |
370 void discard (size_t num) | |
371 { | |
372 if (num > size ()) | |
373 num = size (); | |
374 | |
375 for (size_t i = 0; i < num; i++) | |
376 discard_first (); | |
377 } | |
378 | |
379 void discard (void) { discard (size ()); } | |
380 | |
381 virtual size_t size (void) const = 0; | |
382 | |
383 bool empty (void) const { return size () == 0; } | |
384 }; | |
385 | |
386 #endif |