11// FFSM2 (flat state machine for games and interactive applications)
2- // 2.1.0 (2022-08-13 )
2+ // 2.1.1 (2022-08-15 )
33//
44// Created by Andrew Gresyk
55//
3333
3434#define FFSM2_VERSION_MAJOR 2
3535#define FFSM2_VERSION_MINOR 1
36- #define FFSM2_VERSION_PATCH 0
36+ #define FFSM2_VERSION_PATCH 1
3737
3838#define FFSM2_VERSION (10000 * FFSM2_VERSION_MAJOR +100 * FFSM2_VERSION_MINOR + FFSM2_VERSION_PATCH)
3939
@@ -959,7 +959,7 @@ stateName(const std::type_index stateType)noexcept{
959959
960960#if defined(_MSC_VER)
961961
962- auto first =
962+ Short first =
963963raw[0 ] ==' s' ?7 :// Struct
964964raw[0 ] ==' c' ?6 :// Class
9659650 ;
@@ -1016,7 +1016,7 @@ namespace detail {
10161016#pragma warning(disable: 4324)// structure was padded due to alignment specifier
10171017#endif
10181018
1019- struct alignas ( 4 ) TransitionBase {
1019+ struct TransitionBase {
10201020FFSM2_CONSTEXPR (11 )
10211021TransitionBase ()noexcept =default ;
10221022
@@ -1070,11 +1070,11 @@ struct alignas(4) TransitionBase {
10701070#endif
10711071
10721072template <typename TPayload>
1073- struct alignas ( 4 ) TransitionTfinal
1073+ struct TransitionT final
10741074: TransitionBase
10751075{
10761076using Payload = TPayload;
1077- using Storage =typename std::aligned_storage< sizeof (Payload), 4 >::type ;
1077+ using Storage =uint8_t [ sizeof (Payload)] ;
10781078
10791079using TransitionBase::TransitionBase;
10801080
@@ -1125,12 +1125,22 @@ struct alignas(4) TransitionT final
11251125reinterpret_cast <const Payload*>(&storage) :nullptr ;
11261126}
11271127
1128+ #ifdef _MSC_VER
1129+ #pragma warning(push)
1130+ #pragma warning(disable: 4324)// structure was padded due to alignment specifier
1131+ #endif
1132+
1133+ alignas (Payload) Storage storage {};
1134+
1135+ #ifdef _MSC_VER
1136+ #pragma warning(pop)
1137+ #endif
1138+
11281139bool payloadSet =false ;
1129- Storage storage;
11301140};
11311141
11321142template <>
1133- struct alignas ( 4 ) TransitionT<void >final
1143+ struct TransitionT <void >final
11341144: TransitionBase
11351145{
11361146using TransitionBase::TransitionBase;
@@ -1596,7 +1606,7 @@ struct TaskT final
15961606: TaskBase
15971607{
15981608using Payload = TPayload;
1599- using Storage =typename std::aligned_storage< sizeof (Payload), 2 >::type ;
1609+ using Storage =uint8_t [ sizeof (Payload)] ;
16001610
16011611using TaskBase::TaskBase;
16021612
@@ -1613,7 +1623,17 @@ struct TaskT final
16131623new (&storage) Payload{payload};
16141624}
16151625
1616- Storage storage;
1626+ #ifdef _MSC_VER
1627+ #pragma warning(push)
1628+ #pragma warning(disable: 4324)// structure was padded due to alignment specifier
1629+ #endif
1630+
1631+ alignas (Payload) Storage storage {};
1632+
1633+ #ifdef _MSC_VER
1634+ #pragma warning(pop)
1635+ #endif
1636+
16171637bool payloadSet =false ;
16181638};
16191639
@@ -2106,7 +2126,7 @@ PlanDataT<ArgsT<TC, TG, TSL FFSM2_IF_SERIALIZATION(, NSB), NSL, NTC, TTP>>::veri
21062126if (bounds.first != INVALID_LONG) {
21072127FFSM2_ASSERT (bounds.last != INVALID_LONG);
21082128
2109- for (auto slow = bounds.first , fast = slow; ; ) {
2129+ for (Long slow = bounds.first , fast = slow; ; ) {
21102130++length;
21112131const TaskLink& task = taskLinks[slow];
21122132
@@ -2712,12 +2732,12 @@ PlanBaseT<TArgs>::linkTask(const Long index) noexcept{
27122732FFSM2_ASSERT (_bounds.first < TaskLinks::CAPACITY);
27132733FFSM2_ASSERT (_bounds.last < TaskLinks::CAPACITY);
27142734
2715- auto & lastLink = _planData.taskLinks [_bounds.last ];
2735+ TaskLink & lastLink = _planData.taskLinks [_bounds.last ];
27162736FFSM2_ASSERT (lastLink.next == INVALID_LONG);
27172737
27182738lastLink.next = index;
27192739
2720- auto & currLink = _planData.taskLinks [index];
2740+ TaskLink & currLink = _planData.taskLinks [index];
27212741FFSM2_ASSERT (currLink.prev == INVALID_LONG);
27222742
27232743currLink.prev = _bounds.last ;
@@ -2743,7 +2763,7 @@ PlanBaseT<TArgs>::clearTasks() noexcept{
27432763{
27442764FFSM2_ASSERT (index < TaskLinks::CAPACITY);
27452765
2746- const auto & link = _planData.taskLinks [index];
2766+ const TaskLink & link = _planData.taskLinks [index];
27472767FFSM2_ASSERT (index == _bounds.first ?
27482768 link.prev == INVALID_LONG :
27492769 link.prev < TaskLinks::CAPACITY);
@@ -4201,7 +4221,7 @@ template <StateID NStateId,
42014221struct S_
42024222: THead
42034223{
4204- static constexpr auto STATE_ID = NStateId;
4224+ static constexpr StateID STATE_ID = NStateId;
42054225
42064226using Context=typename TArgs::Context;
42074227
@@ -5339,6 +5359,10 @@ struct FFSM2_EMPTY_BASES C_
53395359using PlanControl= PlanControlT <Args>;
53405360using ScopedRegion=typename PlanControl::Region;
53415361
5362+ #if FFSM2_PLANS_AVAILABLE()
5363+ using Plan=typename PlanControl::Plan;
5364+ #endif
5365+
53425366using FullControl= FullControlT <Args>;
53435367using ControlLock=typename FullControl::Lock;
53445368
@@ -5663,7 +5687,7 @@ C_<TA, TH, TS...>::deepExit(PlanControl& control) noexcept {
56635687active = INVALID_SHORT;
56645688
56655689#if FFSM2_PLANS_AVAILABLE()
5666- auto plan = control.plan ();
5690+ Plan plan = control.plan ();
56675691plan.clear ();
56685692#endif
56695693}
@@ -5976,7 +6000,7 @@ class R_ {
59766000
59776001// / @brief Access plan
59786002// / @return Plan
5979- FFSM2_CONSTEXPR (14 ) Plan plan()noexcept {return Plan{_core.planData };}
6003+ FFSM2_CONSTEXPR (14 ) Plan plan()noexcept {return Plan{_core.planData };}
59806004
59816005// / @brief Access read-only plan
59826006// / @return Read-only plan