179 lines
4.0 KiB
C++
179 lines
4.0 KiB
C++
/*
|
|
* StatusLogic.hpp
|
|
*
|
|
* Created on: 29 ñåíò. 2019 ã.
|
|
* Author: user
|
|
*/
|
|
|
|
#ifndef SOURCE_SCHEMATIC_STATUSLOGIC_HPP_
|
|
#define SOURCE_SCHEMATIC_STATUSLOGIC_HPP_
|
|
|
|
#include "../systemic/IStatus.hh"
|
|
|
|
#include <utility>
|
|
|
|
namespace systemic { namespace detail {
|
|
|
|
class StatusNot : public IStatus {
|
|
|
|
IStatus & status;
|
|
|
|
public:
|
|
StatusNot(IStatus & status) : status(status) {}
|
|
|
|
virtual operator bool() const {
|
|
return not status;
|
|
}
|
|
|
|
virtual ~StatusNot() = default;
|
|
};
|
|
|
|
template <int N>
|
|
class StatusAnd : public IStatus {
|
|
public:
|
|
template<int M>
|
|
StatusAnd( IStatus* (&pStatusArray)[M] ) : n(M > N ? N : M) {
|
|
for(int i = 0; i < n; i++)
|
|
pStatuses[i] = pStatusArray[i];
|
|
}
|
|
|
|
StatusAnd( IStatus * pStatusArray[], int array_size ) : n(array_size > N ? N : array_size) {
|
|
for(int i = 0; i < n; i++)
|
|
pStatuses[i] = pStatusArray[i];
|
|
}
|
|
|
|
#if __cplusplus >= 201103L
|
|
StatusAnd(std::initializer_list<systemic::IStatus *> statusList) : n(statusList.size()) {
|
|
int i = 0;
|
|
for(auto & status : statusList) {
|
|
pStatuses[i++] = status;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
virtual operator bool() const {
|
|
bool result = true;
|
|
for(int i = 0; i < n; i++) {
|
|
result = result && (bool)(*pStatuses[i]);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
virtual ~StatusAnd() = default;
|
|
|
|
private:
|
|
IStatus * pStatuses[N];
|
|
const int n;
|
|
|
|
};
|
|
|
|
template <int N>
|
|
class StatusNAnd : public StatusNot {
|
|
private:
|
|
StatusAnd<N> statuses;
|
|
|
|
public:
|
|
template<int M>
|
|
StatusNAnd( IStatus* (&pStatusArray)[M] ) : statuses(pStatusArray), StatusNot(statuses) {}
|
|
|
|
StatusNAnd( IStatus * pStatusArray[], int array_size ) : statuses(pStatusArray, array_size), StatusNot(statuses) {}
|
|
|
|
virtual ~StatusNAnd() = default;
|
|
|
|
};
|
|
|
|
template <int N>
|
|
class StatusOr : public IStatus {
|
|
public:
|
|
template<int M>
|
|
StatusOr( IStatus* (&pStatusArray)[M] ) : n(M > N ? N : M) {
|
|
for(int i = 0; i < n; i++)
|
|
pStatuses[i] = pStatusArray[i];
|
|
}
|
|
|
|
StatusOr( IStatus * pStatusArray[], int array_size ) : n(array_size > N ? N : array_size) {
|
|
for(int i = 0; i < n; i++)
|
|
pStatuses[i] = pStatusArray[i];
|
|
}
|
|
|
|
#if __cplusplus >= 201103L
|
|
StatusOr(std::initializer_list<systemic::IStatus *> statusList) : n(statusList.size()) {
|
|
int i = 0;
|
|
for(auto & status : statusList) {
|
|
pStatuses[i++] = status;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
virtual operator bool() const {
|
|
bool result = false;
|
|
for(int i = 0; i < n; i++) {
|
|
result = result || (bool)(*pStatuses[i]);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
virtual ~StatusOr() = default;
|
|
|
|
private:
|
|
IStatus * pStatuses[N];
|
|
const int n;
|
|
|
|
};
|
|
|
|
template <int N>
|
|
class StatusNOr : public StatusNot {
|
|
private:
|
|
StatusOr<N> statuses;
|
|
|
|
public:
|
|
template<int M>
|
|
StatusNOr(IStatus * (&pStatusArray)[M]) : statuses(pStatusArray), StatusNot(statuses) {}
|
|
|
|
StatusNOr( IStatus * pStatusArray[], int array_size ) : statuses(pStatusArray, array_size), StatusNot(statuses) {}
|
|
|
|
virtual ~StatusNOr() = default;
|
|
|
|
};
|
|
|
|
//âîçìîæíà èíäèâèäóàëüíàÿ èíâåðñèÿ ïî êàæäîìó âõîäó
|
|
template <int N>
|
|
class StatusVarAnd : public IStatus {
|
|
public:
|
|
|
|
template<int M>
|
|
StatusVarAnd( std::pair<IStatus *, bool> (&m)[M] ) : n(M > N ? N : M) {
|
|
for(int i = 0; i < n; i++) {
|
|
pStatuses[i] = m[i].first;
|
|
invert[i] = m[i].second;
|
|
}
|
|
}
|
|
|
|
StatusVarAnd( std::pair<IStatus *, bool> m[], int array_size ) : n(array_size > N ? N : array_size) {
|
|
for(int i = 0; i < n; i++) {
|
|
pStatuses[i] = m[i].first;
|
|
invert[i] = m[i].second;
|
|
}
|
|
}
|
|
|
|
virtual operator bool() const {
|
|
bool result = true;
|
|
for(int i = 0; i < n; i++) {
|
|
result = result && ( invert[i] != ( *pStatuses[i] ) );
|
|
}
|
|
return result;
|
|
}
|
|
|
|
virtual ~StatusVarAnd() = default;
|
|
|
|
private:
|
|
IStatus * pStatuses[N];
|
|
bool invert[N];
|
|
const int n;
|
|
|
|
};
|
|
|
|
}}
|
|
|
|
#endif /* SOURCE_SCHEMATIC_STATUSLOGIC_HPP_ */
|