Mercurial > octave
annotate liboctave/util/action-container.h @ 27919:1891570abac8
update Octave Project Developers copyright for the new year
In files that have the "Octave Project Developers" copyright notice,
update for 2020.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 06 Jan 2020 22:29:51 -0500 |
parents | b442ec6dda5c |
children | bd51beb6205e |
rev | line source |
---|---|
15396 | 1 /* |
2 | |
27919
1891570abac8
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
27918
diff
changeset
|
3 Copyright (C) 1993-2020 The Octave Project Developers |
27918
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27338
diff
changeset
|
4 |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27338
diff
changeset
|
5 See the file COPYRIGHT.md in the top-level directory of this distribution |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27338
diff
changeset
|
6 or <https://octave.org/COPYRIGHT.html/>. |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
27338
diff
changeset
|
7 |
15396 | 8 |
9 This file is part of Octave. | |
10 | |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24397
diff
changeset
|
11 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
|
12 under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24397
diff
changeset
|
13 the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
14 (at your option) any later version. |
15396 | 15 |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
16 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
|
17 WITHOUT ANY WARRANTY; without even the implied warranty of |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22402
diff
changeset
|
19 GNU General Public License for more details. |
15396 | 20 |
21 You should have received a copy of the GNU General Public License | |
22 along with Octave; see the file COPYING. If not, see | |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24397
diff
changeset
|
23 <https://www.gnu.org/licenses/>. |
15396 | 24 |
25 */ | |
26 | |
20791
f7084eae3318
maint: Use Octave coding conventions for #if statements.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
27 #if ! defined (octave_action_container_h) |
15396 | 28 #define octave_action_container_h 1 |
29 | |
21244
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21139
diff
changeset
|
30 #include "octave-config.h" |
1473547f50f5
include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents:
21139
diff
changeset
|
31 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
32 #include <functional> |
23442
53f5f8231c37
allow most header files to be compiled separately
John W. Eaton <jwe@octave.org>
parents:
23437
diff
changeset
|
33 |
15396 | 34 // This class allows registering actions in a list for later |
35 // execution, either explicitly or when the container goes out of | |
36 // scope. | |
37 | |
17769
49a5a4be04a1
maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
38 // FIXME: is there a better name for this class? |
15396 | 39 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
40 namespace octave |
15396 | 41 { |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
42 class |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
43 action_container |
15396 | 44 { |
45 public: | |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
46 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
47 // A generic unwind_protect element. Knows how to run itself and |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
48 // discard itself. Also, contains a pointer to the next element. |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
49 class elem |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
50 { |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
51 public: |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
52 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
53 friend class action_container; |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
54 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
55 elem (void) { } |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
56 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
57 // No copying! |
15396 | 58 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
59 elem (const elem&) = delete; |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
60 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
61 elem& operator = (const elem&) = delete; |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
62 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
63 virtual ~elem (void) = default; |
15396 | 64 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
65 virtual void run (void) { } |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
66 }; |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
67 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
68 // An element that merely runs a void (*)(void) function. |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
69 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
70 class fcn_elem : public elem |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
71 { |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
72 public: |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
73 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
74 template <typename F, typename... Args> |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
75 fcn_elem (F&& fcn, Args&&... args) |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
76 : m_fcn (std::bind (fcn, args...)) |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
77 { } |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
78 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
79 void run (void) { m_fcn (); } |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
80 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
81 private: |
15396 | 82 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
83 std::function<void (void)> m_fcn; |
23927
e3a36f84d01d
provide variable-editor widget for the GUI
Michael Barnes <mjbcode@runbox.com>
parents:
23747
diff
changeset
|
84 }; |
e3a36f84d01d
provide variable-editor widget for the GUI
Michael Barnes <mjbcode@runbox.com>
parents:
23747
diff
changeset
|
85 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
86 // An element that stores arbitrary variable, and restores it. |
15396 | 87 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
88 template <typename T> |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
89 class restore_var_elem : public elem |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
90 { |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
91 public: |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
92 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
93 restore_var_elem (T& ref, const T& val) |
27177 | 94 : m_ptr (&ref), m_val (val) { } |
15396 | 95 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
96 // No copying! |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
97 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
98 restore_var_elem (const restore_var_elem&) = delete; |
15396 | 99 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
100 restore_var_elem& operator = (const restore_var_elem&) = delete; |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
101 |
27177 | 102 void run (void) { *m_ptr = m_val; } |
15396 | 103 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
104 private: |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
105 |
27177 | 106 T *m_ptr, m_val; |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
107 }; |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
108 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
109 // Deletes a class allocated using new. |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
110 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
111 template <typename T> |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
112 class delete_ptr_elem : public elem |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
113 { |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
114 public: |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
115 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
116 delete_ptr_elem (T *ptr) |
27177 | 117 : m_ptr (ptr) { } |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
118 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
119 // No copying! |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
120 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
121 delete_ptr_elem (const delete_ptr_elem&) = delete; |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
122 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
123 delete_ptr_elem operator = (const delete_ptr_elem&) = delete; |
15396 | 124 |
27177 | 125 void run (void) { delete m_ptr; } |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
126 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
127 private: |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
128 |
27177 | 129 T *m_ptr; |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
130 }; |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
131 |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
132 action_container (void) { } |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
133 |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
134 // No copying! |
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
135 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
136 action_container (const action_container&) = delete; |
22869
f75d289645ec
make deleted functions public
John W. Eaton <jwe@octave.org>
parents:
22868
diff
changeset
|
137 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
138 action_container& operator = (const action_container&) = delete; |
15396 | 139 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
140 virtual ~action_container (void) = default; |
15396 | 141 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
142 template <typename F, typename... Args> |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
143 void add (F&& fcn, Args&&... args) |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
144 { |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
145 add_action (new fcn_elem (std::forward<F> (fcn), |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
146 std::forward<Args> (args)...)); |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
147 } |
15396 | 148 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
149 // Use separate template types for function pointer parameter |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
150 // declarations and captured arguments so that differences in |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
151 // const are handled properly. |
15396 | 152 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
153 template <typename... Params, typename... Args> |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
154 void add_fcn (void (*fcn) (Params...), Args&&... args) |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
155 { |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
156 add_action (new fcn_elem (fcn, std::forward<Args> (args)...)); |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
157 } |
15396 | 158 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
159 template <typename T, typename... Params, typename... Args> |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
160 void add_method (T *obj, void (T::*method) (Params...), Args&&... args) |
23927
e3a36f84d01d
provide variable-editor widget for the GUI
Michael Barnes <mjbcode@runbox.com>
parents:
23747
diff
changeset
|
161 { |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
162 add_action (new fcn_elem (method, obj, std::forward<Args> (args)...)); |
23927
e3a36f84d01d
provide variable-editor widget for the GUI
Michael Barnes <mjbcode@runbox.com>
parents:
23747
diff
changeset
|
163 } |
e3a36f84d01d
provide variable-editor widget for the GUI
Michael Barnes <mjbcode@runbox.com>
parents:
23747
diff
changeset
|
164 |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
165 template <typename T, typename... Params, typename... Args> |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
166 void add_method (T& obj, void (T::*method) (Params...), Args&&... args) |
23927
e3a36f84d01d
provide variable-editor widget for the GUI
Michael Barnes <mjbcode@runbox.com>
parents:
23747
diff
changeset
|
167 { |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
168 add_action (new fcn_elem (method, &obj, std::forward<Args> (args)...)); |
23927
e3a36f84d01d
provide variable-editor widget for the GUI
Michael Barnes <mjbcode@runbox.com>
parents:
23747
diff
changeset
|
169 } |
e3a36f84d01d
provide variable-editor widget for the GUI
Michael Barnes <mjbcode@runbox.com>
parents:
23747
diff
changeset
|
170 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
171 // Call to delete (T*). |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
172 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
173 template <typename T> |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
174 void add_delete (T *obj) |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
175 { |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
176 add_action (new delete_ptr_elem<T> (obj)); |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
177 } |
15396 | 178 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
179 // Protect any variable. |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
180 template <typename T> |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
181 void protect_var (T& var) |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
182 { |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
183 add_action (new restore_var_elem<T> (var, var)); |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
184 } |
15396 | 185 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
186 // Protect any variable, value given. |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
187 template <typename T> |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
188 void protect_var (T& var, const T& val) |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
189 { |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
190 add_action (new restore_var_elem<T> (var, val)); |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
191 } |
23437
442fe5b5afb5
new action_container constructors for unwind_protect
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
192 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
193 operator bool (void) const { return ! empty (); } |
15396 | 194 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
195 virtual void run_first (void) = 0; |
15396 | 196 |
27338
829d9efb7730
allow gui events to interrupt readline event processing (bug #56738)
John W. Eaton <jwe@octave.org>
parents:
27177
diff
changeset
|
197 void run (size_t num); |
15396 | 198 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
199 void run (void) { run (size ()); } |
15396 | 200 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
201 virtual void discard_first (void) = 0; |
15396 | 202 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
203 void discard (size_t num) |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
204 { |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
205 if (num > size ()) |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
206 num = size (); |
15396 | 207 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
208 for (size_t i = 0; i < num; i++) |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
209 discard_first (); |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
210 } |
15396 | 211 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
212 void discard (void) { discard (size ()); } |
15396 | 213 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
214 virtual size_t size (void) const = 0; |
15396 | 215 |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
216 bool empty (void) const { return size () == 0; } |
25653
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
217 |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
218 protected: |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
219 |
b3d357990b52
better use of templates for action_container and derived classes
John W. Eaton <jwe@octave.org>
parents:
25103
diff
changeset
|
220 virtual void add_action (elem *new_elem) = 0; |
23747
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
221 }; |
0b4d1575a2e2
move action_container and event_queue classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
23442
diff
changeset
|
222 } |
15396 | 223 |
224 #endif |