File tree Expand file tree Collapse file tree 4 files changed +31
-13
lines changed Expand file tree Collapse file tree 4 files changed +31
-13
lines changed Original file line number Diff line number Diff line change @@ -140,7 +140,7 @@ class Engine : public Reactor {
140
140
public:
141
141
// ports
142
142
Input<void > torque{" torque" , this }; // NOLINT
143
-
143
+ Multiport< int > control_input;
144
144
private:
145
145
// reactions_
146
146
Reaction r1{" 1" , 1 , this , [this ]() { reaction_1 (); }};
@@ -180,3 +180,12 @@ auto main() -> int {
180
180
181
181
return 0 ;
182
182
}
183
+
184
+ class ReactionScope : public MutableScope <Engine> {
185
+ void reaction_0 () {
186
+ MutationChangeMultiportSize<int > change_multiport_width{&this ->self_ ->control_input , 6 };
187
+ this ->add_to_transaction (&change_multiport_width);
188
+
189
+ this ->commit_transaction ();
190
+ }
191
+ };
Original file line number Diff line number Diff line change @@ -43,9 +43,8 @@ public:
43
43
explicit MutableScope (reactor::Reactor* reactor) : Scope(reactor), self_(reactor), env_(reactor->environment ()) {}
44
44
~MutableScope () = default ;
45
45
46
- void begin_transaction ();
47
- void end_transaction ();
48
- void mutate (const std::unique_ptr<Mutation>&& mutation);
46
+ void commit_transaction ();
47
+ void add_to_transaction (Mutation* mutation);
49
48
50
49
};
51
50
Original file line number Diff line number Diff line change @@ -24,21 +24,24 @@ enum MutationResult {
24
24
25
25
class Mutation {
26
26
public:
27
+ virtual ~Mutation () = default ;
27
28
virtual auto run () -> MutationResult = 0 ;
28
-
29
+ virtual auto rollback () -> MutationResult = 0;
29
30
};
30
31
31
32
template <class T >
32
33
class MutationChangeMultiportSize : public Mutation {
33
34
private:
34
35
Multiport<T>* multiport_ = nullptr ;
35
36
std::size_t desired_size_ = 0 ;
37
+ std::size_t size_before_application_ = 0 ;
36
38
public:
37
39
MutationChangeMultiportSize (Multiport<T>* multiport, std::size_t size);
38
- ~MutationChangeMultiportSize () = default ;
39
- void run () override ;
40
- };
40
+ ~MutationChangeMultiportSize () override = default ;
41
41
42
+ auto run () -> MutationResult override ;
43
+ auto rollback () -> MutationResult override ;
44
+ };
42
45
43
46
class Transaction {
44
47
private:
@@ -47,9 +50,8 @@ private:
47
50
std::vector<Mutation*> mutations_{};
48
51
49
52
public:
50
- void reset ( );
53
+ void push_back (Mutation* mutation );
51
54
auto execute () -> MutationResult;
52
-
53
55
};
54
56
}
55
57
#endif // REACTOR_CPP_TRANSACTION_HH
Original file line number Diff line number Diff line change @@ -8,10 +8,18 @@ reactor::MutationChangeMultiportSize<T>::MutationChangeMultiportSize(Multiport<T
8
8
}
9
9
10
10
template <class T >
11
- void reactor::MutationChangeMultiportSize<T>::run() {
11
+ auto reactor::MutationChangeMultiportSize<T>::run() -> MutationResult {
12
12
multiport_->ports_ .resize (desired_size_);
13
+
14
+ return Success;
15
+ }
16
+
17
+ template <class T >
18
+ auto reactor::MutationChangeMultiportSize<T>::rollback() -> MutationResult {
19
+ return Success;
13
20
}
14
21
22
+
15
23
auto reactor::Transaction::execute () -> MutationResult {
16
24
for (auto *mutation : mutations_) {
17
25
mutation->run ();
@@ -20,6 +28,6 @@ auto reactor::Transaction::execute() -> MutationResult {
20
28
return Success;
21
29
}
22
30
23
- void reactor::Transaction::reset ( ) {
24
- mutations_.clear ( );
31
+ void reactor::Transaction::push_back (reactor::Mutation* mutation ) {
32
+ mutations_.push_back (mutation );
25
33
}
You can’t perform that action at this time.
0 commit comments