Skip to content

Commit

Permalink
2.3.1
Browse files Browse the repository at this point in the history
* fixed `FullControlT<>::updatePlan()`
* renamed `Status` to `TaskStatus`
  • Loading branch information
andrew-gresyk authored Sep 22, 2023
1 parent fcd48ad commit b488730
Show file tree
Hide file tree
Showing 16 changed files with 420 additions and 314 deletions.
8 changes: 8 additions & 0 deletions development/ffsm2/detail/containers/bit_array.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,13 @@ class BitArrayT final {
static constexpr Index CAPACITY = NCapacity;
static constexpr Index UNIT_COUNT = contain(CAPACITY, 8);

using BitArray = BitArrayT<CAPACITY>;

public:
FFSM2_CONSTEXPR(14) BitArrayT() noexcept { clear(); }

FFSM2_CONSTEXPR(14) void set() noexcept;

FFSM2_CONSTEXPR(14) void clear() noexcept;

FFSM2_CONSTEXPR(14) bool empty() const noexcept;
Expand All @@ -29,6 +33,10 @@ class BitArrayT final {
template <typename TIndex>
FFSM2_CONSTEXPR(14) void clear(const TIndex index) noexcept;

FFSM2_CONSTEXPR(14) bool operator & (const BitArray& other) const noexcept;

FFSM2_CONSTEXPR(14) void operator &= (const BitArray& other) noexcept;

private:
uint8_t _storage[UNIT_COUNT] {};
};
Expand Down
33 changes: 31 additions & 2 deletions development/ffsm2/detail/containers/bit_array.inl
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ namespace detail {
////////////////////////////////////////////////////////////////////////////////
// COMMON

template <unsigned NCapacity>
FFSM2_CONSTEXPR(14)
void
BitArrayT<NCapacity>::set() noexcept {
for (uint8_t& unit : _storage)
unit = UINT8_MAX;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

template <unsigned NCapacity>
Expand Down Expand Up @@ -59,7 +67,7 @@ BitArrayT<NCapacity>::get(const TIndex index) const noexcept {
return (_storage[unit] & mask) != 0;
}

//------------------------------------------------------------------------------
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

template <unsigned NCapacity>
template <typename TIndex>
Expand All @@ -75,7 +83,7 @@ BitArrayT<NCapacity>::set(const TIndex index) noexcept {
_storage[unit] |= mask;
}

//------------------------------------------------------------------------------
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

template <unsigned NCapacity>
template <typename TIndex>
Expand All @@ -92,7 +100,28 @@ BitArrayT<NCapacity>::clear(const TIndex index) noexcept {
}

//------------------------------------------------------------------------------

template <unsigned NCapacity>
FFSM2_CONSTEXPR(14)
bool
BitArrayT<NCapacity>::operator & (const BitArray& other) const noexcept {
for (Index i = 0; i < UNIT_COUNT; ++i)
if ((_storage[i] & other._storage[i]) == 0)
return false;

return true;
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

template <unsigned NCapacity>
FFSM2_CONSTEXPR(14)
void
BitArrayT<NCapacity>::operator &= (const BitArray& other) noexcept {
for (Index i = 0; i < UNIT_COUNT; ++i)
_storage[i] &= other._storage[i];
}

//------------------------------------------------------------------------------
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//------------------------------------------------------------------------------
Expand Down
4 changes: 3 additions & 1 deletion development/ffsm2/detail/containers/task_list.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ namespace detail {
#pragma pack(push, 1)

struct TaskBase {
static_assert(sizeof(Long) == sizeof(StateID), "");

FFSM2_CONSTEXPR(11) TaskBase() noexcept {}

FFSM2_CONSTEXPR(11) TaskBase(const StateID origin_,
Expand All @@ -16,7 +18,7 @@ struct TaskBase {
, destination{destination_}
{}

static_assert(sizeof(Long) == sizeof(StateID), "");
FFSM2_CONSTEXPR(11) bool cyclic() const noexcept { return origin == destination; }

union {
StateID origin = INVALID_STATE_ID;
Expand Down
12 changes: 6 additions & 6 deletions development/ffsm2/detail/root/control.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ class PlanControlT
using Control::_core;

const Transition& _currentTransition;
Status _status;
TaskStatus _taskStatus;
};

//------------------------------------------------------------------------------
Expand Down Expand Up @@ -442,7 +442,7 @@ class FullControlBaseT
using PlanControl::_core;

using PlanControl::_originId;
using PlanControl::_status;
using PlanControl::_taskStatus;

bool _locked = false;
};
Expand Down Expand Up @@ -514,7 +514,7 @@ class FullControlT<ArgsT<TContext

template <typename TState>
FFSM2_CONSTEXPR(14) void updatePlan(TState& headState,
const Status subStatus) noexcept;
const TaskStatus subStatus) noexcept;

#endif

Expand Down Expand Up @@ -553,7 +553,7 @@ class FullControlT<ArgsT<TContext
using FullControlBase::_core;

using FullControlBase::_originId;
using FullControlBase::_status;
using FullControlBase::_taskStatus;
using FullControlBase::_locked;
};

Expand Down Expand Up @@ -615,7 +615,7 @@ class FullControlT<ArgsT<TContext

template <typename TState>
FFSM2_CONSTEXPR(14) void updatePlan(TState& headState,
const Status subStatus) noexcept;
const TaskStatus subStatus) noexcept;

#endif

Expand All @@ -628,7 +628,7 @@ class FullControlT<ArgsT<TContext
protected:
FFSM2_IF_PLANS(using FullControlBase::_core);

using FullControlBase::_status;
using FullControlBase::_taskStatus;
};

//------------------------------------------------------------------------------
Expand Down
57 changes: 36 additions & 21 deletions development/ffsm2/detail/root/control.inl
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ FFSM2_CONSTEXPR(14)
void
PlanControlT<TArgs>::resetRegion() noexcept
{
_status.clear();
_taskStatus.clear();
}

////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -124,7 +124,7 @@ template <typename TArgs>
FFSM2_CONSTEXPR(14)
void
FullControlBaseT<TArgs>::succeed(const StateID stateId_) noexcept {
_status.result = Status::Result::SUCCESS;
_taskStatus.result = TaskStatus::SUCCESS;

_core.planData.tasksSuccesses.set(stateId_);

Expand All @@ -137,7 +137,7 @@ template <typename TArgs>
FFSM2_CONSTEXPR(14)
void
FullControlBaseT<TArgs>::fail(const StateID stateId_) noexcept {
_status.result = Status::Result::FAILURE;
_taskStatus.result = TaskStatus::FAILURE;

_core.planData.tasksFailures.set(stateId_);

Expand All @@ -155,37 +155,44 @@ template <typename TState>
FFSM2_CONSTEXPR(14)
void
FullControlT<ArgsT<TC, TG, TSL FFSM2_IF_SERIALIZATION(, NSB), NSL, NTC, TTP>>::updatePlan(TState& headState,
const Status subStatus) noexcept
const TaskStatus subStatus) noexcept
{
FFSM2_ASSERT(subStatus);

if (subStatus.result == Status::Result::FAILURE) {
_status.result = Status::Result::FAILURE;
if (subStatus.result == TaskStatus::FAILURE) {
_taskStatus.result = TaskStatus::FAILURE;
headState.wrapPlanFailed(*this);

plan().clear();
} else if (subStatus.result == Status::Result::SUCCESS) {
} else if (subStatus.result == TaskStatus::SUCCESS) {
if (Plan p = plan()) {
TasksBits successesToClear;
successesToClear.set();

for (auto it = p.first();
it && isActive(it->origin);
++it)
{
if (_core.planData.tasksSuccesses.get(it->origin)) {
Origin origin{*this, it->origin};
Origin origin{*this, it->origin}; // SPECIFIC

if (const Payload* const payload = it->payload())
changeWith(it->destination, *it->payload());
else
changeTo (it->destination);

_core.planData.tasksSuccesses.clear(it->origin);
it.remove();
if (it->cyclic())
_core.planData.tasksSuccesses.clear(it->origin); // SPECIFIC
else
successesToClear.clear(it->origin);

break;
it.remove();
}
}

_core.planData.tasksSuccesses &= successesToClear;
} else {
_status.result = Status::Result::SUCCESS;
_taskStatus.result = TaskStatus::SUCCESS;
headState.wrapPlanSucceeded(*this);

plan().clear();
Expand Down Expand Up @@ -225,33 +232,41 @@ template <typename TState>
FFSM2_CONSTEXPR(14)
void
FullControlT<ArgsT<TC, TG, TSL FFSM2_IF_SERIALIZATION(, NSB), NSL, NTC, void>>::updatePlan(TState& headState,
const Status subStatus) noexcept
const TaskStatus subStatus) noexcept
{
FFSM2_ASSERT(subStatus);

if (subStatus.result == Status::Result::FAILURE) {
_status.result = Status::Result::FAILURE;
if (subStatus.result == TaskStatus::FAILURE) {
_taskStatus.result = TaskStatus::FAILURE;
headState.wrapPlanFailed(*this);

plan().clear();
} else if (subStatus.result == Status::Result::SUCCESS) {
} else if (subStatus.result == TaskStatus::SUCCESS) {
if (Plan p = plan()) {
TasksBits successesToClear;
successesToClear.set();

for (auto it = p.first();
it && isActive(it->origin);
++it)
{
if (_core.planData.tasksSuccesses.get(it->origin)) {
Origin origin{*this, it->origin};
Origin origin{*this, it->origin}; // SPECIFIC

changeTo(it->destination);

_core.planData.tasksSuccesses.clear(it->origin);
it.remove();
if (it->cyclic())
_core.planData.tasksSuccesses.clear(it->origin); // SPECIFIC
else
successesToClear.clear(it->origin);

break;
it.remove();
}
}

_core.planData.tasksSuccesses &= successesToClear;
} else {
_status.result = Status::Result::SUCCESS;
_taskStatus.result = TaskStatus::SUCCESS;
headState.wrapPlanSucceeded(*this);

plan().clear();
Expand Down
18 changes: 9 additions & 9 deletions development/ffsm2/detail/root/plan_data.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ namespace detail {

#pragma pack(push, 1)

struct Status final {
enum class Result {
struct TaskStatus final {
enum Result {
NONE,
SUCCESS,
FAILURE
};

Result result = Result::NONE;

FFSM2_CONSTEXPR(11) Status(const Result result_ = Result::NONE) noexcept;
FFSM2_CONSTEXPR(11) TaskStatus(const Result result_ = Result::NONE) noexcept;

FFSM2_CONSTEXPR(11) explicit operator bool() const noexcept;

Expand All @@ -25,8 +25,8 @@ struct Status final {

//------------------------------------------------------------------------------

FFSM2_CONSTEXPR(14) Status operator | (Status& lhs, const Status rhs) noexcept;
FFSM2_CONSTEXPR(14) Status& operator |= (Status& lhs, const Status rhs) noexcept;
FFSM2_CONSTEXPR(14) TaskStatus operator | (TaskStatus& l, const TaskStatus r) noexcept;
FFSM2_CONSTEXPR(14) TaskStatus& operator |= (TaskStatus& l, const TaskStatus r) noexcept;

////////////////////////////////////////////////////////////////////////////////

Expand Down Expand Up @@ -103,8 +103,8 @@ struct PlanDataT<ArgsT<TContext
TasksBits tasksSuccesses;
TasksBits tasksFailures;
bool planExists;
Status headStatus;
Status subStatus;
TaskStatus headStatus;
TaskStatus subStatus;

FFSM2_CONSTEXPR(14) void clearTaskStatus (const StateID stateId) noexcept;
FFSM2_CONSTEXPR(14) void verifyEmptyStatus(const StateID stateId) const noexcept;
Expand Down Expand Up @@ -152,8 +152,8 @@ struct PlanDataT<ArgsT<TContext
TasksBits tasksSuccesses;
TasksBits tasksFailures;
bool planExists;
Status headStatus;
Status subStatus;
TaskStatus headStatus;
TaskStatus subStatus;

FFSM2_CONSTEXPR(14) void clearTaskStatus (const StateID stateId) noexcept;
FFSM2_CONSTEXPR(14) void verifyEmptyStatus(const StateID stateId) const noexcept;
Expand Down
Loading

0 comments on commit b488730

Please sign in to comment.