Mercurial > octave
annotate liboctave/util/action-container.h @ 19697:4197fc428c7d
maint: Update copyright notices for 2015.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 11 Feb 2015 14:19:08 -0500 |
parents | 49a5a4be04a1 |
children | f7084eae3318 |
rev | line source |
---|---|
15396 | 1 /* |
2 | |
19697
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
17769
diff
changeset
|
3 Copyright (C) 1993-2015 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 | |
9 under the terms of the GNU General Public License as published by the | |
10 Free Software Foundation; either version 3 of the License, or (at your | |
11 option) any later version. | |
12 | |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
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 | |
24 #if !defined (octave_action_container_h) | |
25 #define octave_action_container_h 1 | |
26 | |
27 // This class allows registering actions in a list for later | |
28 // execution, either explicitly or when the container goes out of | |
29 // scope. | |
30 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
31 // FIXME: is there a better name for this class? |
15396 | 32 |
33 class | |
34 action_container | |
35 { | |
36 public: | |
37 | |
38 // A generic unwind_protect element. Knows how to run itself and | |
39 // discard itself. Also, contains a pointer to the next element. | |
40 class elem | |
41 { | |
42 public: | |
43 elem (void) { } | |
44 | |
45 virtual void run (void) { } | |
46 | |
47 virtual ~elem (void) { } | |
48 | |
49 friend class action_container; | |
50 | |
51 private: | |
52 | |
53 // No copying! | |
54 | |
55 elem (const elem&); | |
56 | |
57 elem& operator = (const elem&); | |
58 }; | |
59 | |
60 // An element that merely runs a void (*)(void) function. | |
61 | |
62 class fcn_elem : public elem | |
63 { | |
64 public: | |
65 fcn_elem (void (*fptr) (void)) | |
66 : e_fptr (fptr) { } | |
67 | |
68 void run (void) { e_fptr (); } | |
69 | |
70 private: | |
71 void (*e_fptr) (void); | |
72 }; | |
73 | |
74 // An element that stores a variable of type T along with a void (*) (T) | |
75 // function pointer, and calls the function with the parameter. | |
76 | |
77 template <class T> | |
78 class fcn_arg_elem : public elem | |
79 { | |
80 public: | |
81 fcn_arg_elem (void (*fcn) (T), T arg) | |
82 : e_fcn (fcn), e_arg (arg) { } | |
83 | |
84 void run (void) { e_fcn (e_arg); } | |
85 | |
86 private: | |
87 | |
88 // No copying! | |
89 | |
90 fcn_arg_elem (const fcn_arg_elem&); | |
91 | |
92 fcn_arg_elem& operator = (const fcn_arg_elem&); | |
93 | |
94 void (*e_fcn) (T); | |
95 T e_arg; | |
96 }; | |
97 | |
98 // An element that stores a variable of type T along with a | |
99 // void (*) (const T&) function pointer, and calls the function with | |
100 // the parameter. | |
101 | |
102 template <class T> | |
103 class fcn_crefarg_elem : public elem | |
104 { | |
105 public: | |
106 fcn_crefarg_elem (void (*fcn) (const T&), const T& arg) | |
107 : e_fcn (fcn), e_arg (arg) { } | |
108 | |
109 void run (void) { e_fcn (e_arg); } | |
110 | |
111 private: | |
112 void (*e_fcn) (const T&); | |
113 T e_arg; | |
114 }; | |
115 | |
116 // An element for calling a member function. | |
117 | |
118 template <class T> | |
119 class method_elem : public elem | |
120 { | |
121 public: | |
122 method_elem (T *obj, void (T::*method) (void)) | |
123 : e_obj (obj), e_method (method) { } | |
124 | |
125 void run (void) { (e_obj->*e_method) (); } | |
126 | |
127 private: | |
128 | |
129 T *e_obj; | |
130 void (T::*e_method) (void); | |
131 | |
132 // No copying! | |
133 | |
134 method_elem (const method_elem&); | |
135 | |
136 method_elem operator = (const method_elem&); | |
137 }; | |
138 | |
139 // An element for calling a member function with a single argument | |
140 | |
141 template <class T, class A> | |
142 class method_arg_elem : public elem | |
143 { | |
144 public: | |
145 method_arg_elem (T *obj, void (T::*method) (A), A arg) | |
146 : e_obj (obj), e_method (method), e_arg (arg) { } | |
147 | |
148 void run (void) { (e_obj->*e_method) (e_arg); } | |
149 | |
150 private: | |
151 | |
152 T *e_obj; | |
153 void (T::*e_method) (A); | |
154 A e_arg; | |
155 | |
156 // No copying! | |
157 | |
158 method_arg_elem (const method_arg_elem&); | |
159 | |
160 method_arg_elem operator = (const method_arg_elem&); | |
161 }; | |
162 | |
163 // An element for calling a member function with a single argument | |
164 | |
165 template <class T, class A> | |
166 class method_crefarg_elem : public elem | |
167 { | |
168 public: | |
169 method_crefarg_elem (T *obj, void (T::*method) (const A&), const A& arg) | |
170 : e_obj (obj), e_method (method), e_arg (arg) { } | |
171 | |
172 void run (void) { (e_obj->*e_method) (e_arg); } | |
173 | |
174 private: | |
175 | |
176 T *e_obj; | |
177 void (T::*e_method) (const A&); | |
178 A e_arg; | |
179 | |
180 // No copying! | |
181 | |
182 method_crefarg_elem (const method_crefarg_elem&); | |
183 | |
184 method_crefarg_elem operator = (const method_crefarg_elem&); | |
185 }; | |
186 | |
187 // An element that stores arbitrary variable, and restores it. | |
188 | |
189 template <class T> | |
190 class restore_var_elem : public elem | |
191 { | |
192 public: | |
193 restore_var_elem (T& ref, const T& val) | |
194 : e_ptr (&ref), e_val (val) { } | |
195 | |
196 void run (void) { *e_ptr = e_val; } | |
197 | |
198 private: | |
199 | |
200 // No copying! | |
201 | |
202 restore_var_elem (const restore_var_elem&); | |
203 | |
204 restore_var_elem& operator = (const restore_var_elem&); | |
205 | |
206 T *e_ptr, e_val; | |
207 }; | |
208 | |
209 // Deletes a class allocated using new. | |
210 | |
211 template <class T> | |
212 class delete_ptr_elem : public elem | |
213 { | |
214 public: | |
215 delete_ptr_elem (T *ptr) | |
216 : e_ptr (ptr) { } | |
217 | |
218 void run (void) { delete e_ptr; } | |
219 | |
220 private: | |
221 | |
222 T *e_ptr; | |
223 | |
224 // No copying! | |
225 | |
226 delete_ptr_elem (const delete_ptr_elem&); | |
227 | |
228 delete_ptr_elem operator = (const delete_ptr_elem&); | |
229 }; | |
230 | |
231 action_container (void) { } | |
232 | |
233 virtual ~action_container (void) { } | |
234 | |
235 virtual void add (elem *new_elem) = 0; | |
236 | |
237 // Call to void func (void). | |
238 void add_fcn (void (*fcn) (void)) | |
239 { | |
240 add (new fcn_elem (fcn)); | |
241 } | |
242 | |
243 // Call to void func (T). | |
244 template <class T> | |
245 void add_fcn (void (*action) (T), T val) | |
246 { | |
247 add (new fcn_arg_elem<T> (action, val)); | |
248 } | |
249 | |
250 // Call to void func (const T&). | |
251 template <class T> | |
252 void add_fcn (void (*action) (const T&), const T& val) | |
253 { | |
254 add (new fcn_crefarg_elem<T> (action, val)); | |
255 } | |
256 | |
257 // Call to T::method (void). | |
258 template <class T> | |
259 void add_method (T *obj, void (T::*method) (void)) | |
260 { | |
261 add (new method_elem<T> (obj, method)); | |
262 } | |
263 | |
264 // Call to T::method (A). | |
265 template <class T, class A> | |
266 void add_method (T *obj, void (T::*method) (A), A arg) | |
267 { | |
268 add (new method_arg_elem<T, A> (obj, method, arg)); | |
269 } | |
270 | |
271 // Call to T::method (const A&). | |
272 template <class T, class A> | |
273 void add_method (T *obj, void (T::*method) (const A&), const A& arg) | |
274 { | |
275 add (new method_crefarg_elem<T, A> (obj, method, arg)); | |
276 } | |
277 | |
278 // Call to delete (T*). | |
279 | |
280 template <class T> | |
281 void add_delete (T *obj) | |
282 { | |
283 add (new delete_ptr_elem<T> (obj)); | |
284 } | |
285 | |
286 // Protect any variable. | |
287 template <class T> | |
288 void protect_var (T& var) | |
289 { | |
290 add (new restore_var_elem<T> (var, var)); | |
291 } | |
292 | |
293 // Protect any variable, value given. | |
294 template <class T> | |
295 void protect_var (T& var, const T& val) | |
296 { | |
297 add (new restore_var_elem<T> (var, val)); | |
298 } | |
299 | |
300 operator bool (void) const { return ! empty (); } | |
301 | |
302 virtual void run_first (void) = 0; | |
303 | |
304 void run (size_t num) | |
305 { | |
306 if (num > size ()) | |
307 num = size (); | |
308 | |
309 for (size_t i = 0; i < num; i++) | |
310 run_first (); | |
311 } | |
312 | |
313 void run (void) { run (size ()); } | |
314 | |
315 virtual void discard_first (void) = 0; | |
316 | |
317 void discard (size_t num) | |
318 { | |
319 if (num > size ()) | |
320 num = size (); | |
321 | |
322 for (size_t i = 0; i < num; i++) | |
323 discard_first (); | |
324 } | |
325 | |
326 void discard (void) { discard (size ()); } | |
327 | |
328 virtual size_t size (void) const = 0; | |
329 | |
330 bool empty (void) const { return size () == 0; } | |
331 | |
332 private: | |
333 | |
334 // No copying! | |
335 | |
336 action_container (const action_container&); | |
337 | |
338 action_container& operator = (const action_container&); | |
339 }; | |
340 | |
341 #endif |