File tree Expand file tree Collapse file tree
include/cpp_event_framework Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -659,6 +659,30 @@ public:
659659 return os << sm.Name ();
660660 }
661661
662+ static StatePtr FindCommonParent (StatePtr state1, StatePtr state2)
663+ {
664+ auto * state = state1;
665+
666+ while (state != nullptr )
667+ {
668+ auto * parent = state2;
669+
670+ while (parent != nullptr )
671+ {
672+ if (parent == state)
673+ {
674+ return parent;
675+ }
676+
677+ parent = parent->parent_ ;
678+ }
679+
680+ state = state->parent_ ;
681+ }
682+
683+ return nullptr ;
684+ }
685+
662686private:
663687 StatePtr current_state_ = nullptr ;
664688 bool working_ = false ;
@@ -749,6 +773,7 @@ private:
749773 EnterState (*target);
750774 }
751775 }
776+
752777 void EnterStatesFromDownTo (StatePtr top, StatePtr target)
753778 {
754779 EnterStatesFromDownToRecursive (top, target->parent_ );
@@ -773,29 +798,6 @@ private:
773798 current_state_ = target;
774799 }
775800 }
776- static StatePtr FindCommonParent (StatePtr state1, StatePtr state2)
777- {
778- auto * state = state1->parent_ ;
779-
780- while (state != nullptr )
781- {
782- auto * parent = state2->parent_ ;
783-
784- while (parent != nullptr )
785- {
786- if (parent == state)
787- {
788- return parent;
789- }
790-
791- parent = parent->parent_ ;
792- }
793-
794- state = state->parent_ ;
795- }
796-
797- return nullptr ;
798- }
799801};
800802
801803template <typename Impl, typename Event, PolymorphicAllocatorProvider Allocator>
Original file line number Diff line number Diff line change @@ -163,6 +163,13 @@ class StatemachineImpl
163163public:
164164 void Main ()
165165 {
166+ assert (Fsm::FindCommonParent (&Fsm::kGreen , &Fsm::kOn ) == &Fsm::kOn );
167+ assert (Fsm::FindCommonParent (&Fsm::kOn , &Fsm::kGreen ) == &Fsm::kOn );
168+ assert (Fsm::FindCommonParent (&Fsm::kOn , &Fsm::kOff ) == nullptr );
169+ assert (Fsm::FindCommonParent (&Fsm::kOff , &Fsm::kOn ) == nullptr );
170+ assert (Fsm::FindCommonParent (&Fsm::kGreen , &Fsm::kRed ) == &Fsm::kOn );
171+ assert (Fsm::FindCommonParent (&Fsm::kRed , &Fsm::kGreen ) == &Fsm::kOn );
172+
166173 CheckAllFalse ();
167174 fsm_.Start (&Fsm::kOff );
168175 assert (fsm_.CurrentState () == &Fsm::kOff );
You can’t perform that action at this time.
0 commit comments