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 {
140140public:
141141 // ports
142142 Input<void > torque{" torque" , this }; // NOLINT
143-
143+ Multiport< int > control_input;
144144private:
145145 // reactions_
146146 Reaction r1{" 1" , 1 , this , [this ]() { reaction_1 (); }};
@@ -180,3 +180,12 @@ auto main() -> int {
180180
181181 return 0 ;
182182}
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:
4343 explicit MutableScope (reactor::Reactor* reactor) : Scope(reactor), self_(reactor), env_(reactor->environment ()) {}
4444 ~MutableScope () = default ;
4545
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);
4948
5049};
5150
Original file line number Diff line number Diff line change @@ -24,21 +24,24 @@ enum MutationResult {
2424
2525class Mutation {
2626public:
27+ virtual ~Mutation () = default ;
2728 virtual auto run () -> MutationResult = 0 ;
28-
29+ virtual auto rollback () -> MutationResult = 0;
2930};
3031
3132template <class T >
3233class MutationChangeMultiportSize : public Mutation {
3334private:
3435 Multiport<T>* multiport_ = nullptr ;
3536 std::size_t desired_size_ = 0 ;
37+ std::size_t size_before_application_ = 0 ;
3638public:
3739 MutationChangeMultiportSize (Multiport<T>* multiport, std::size_t size);
38- ~MutationChangeMultiportSize () = default ;
39- void run () override ;
40- };
40+ ~MutationChangeMultiportSize () override = default ;
4141
42+ auto run () -> MutationResult override ;
43+ auto rollback () -> MutationResult override ;
44+ };
4245
4346class Transaction {
4447private:
@@ -47,9 +50,8 @@ private:
4750 std::vector<Mutation*> mutations_{};
4851
4952public:
50- void reset ( );
53+ void push_back (Mutation* mutation );
5154 auto execute () -> MutationResult;
52-
5355};
5456}
5557#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
88}
99
1010template <class T >
11- void reactor::MutationChangeMultiportSize<T>::run() {
11+ auto reactor::MutationChangeMultiportSize<T>::run() -> MutationResult {
1212 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;
1320}
1421
22+
1523auto reactor::Transaction::execute () -> MutationResult {
1624 for (auto *mutation : mutations_) {
1725 mutation->run ();
@@ -20,6 +28,6 @@ auto reactor::Transaction::execute() -> MutationResult {
2028 return Success;
2129}
2230
23- void reactor::Transaction::reset ( ) {
24- mutations_.clear ( );
31+ void reactor::Transaction::push_back (reactor::Mutation* mutation ) {
32+ mutations_.push_back (mutation );
2533}
You can’t perform that action at this time.
0 commit comments