Skip to content

Commit 0025daa

Browse files
committed
Fix bug in FindCommonParent
did not work when one of the states was parent itself
1 parent 3aa6fbb commit 0025daa

2 files changed

Lines changed: 32 additions & 23 deletions

File tree

include/cpp_event_framework/Statemachine.hxx

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff 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+
662686
private:
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

801803
template <typename Impl, typename Event, PolymorphicAllocatorProvider Allocator>

test/Statemachine_unittest.cxx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,13 @@ class StatemachineImpl
163163
public:
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);

0 commit comments

Comments
 (0)