10static const std::regex
re(
"([-\\w.]+)(?:\\[x(\\d+)\\])?$" );
57 if(!std::regex_match(content, sm,
re)){
58 throw std::invalid_argument(
"LogicLeaf::setContent: Invalid content '" + content +
"'");
61 m_count = sm[2].length() > 0 ?
static_cast<unsigned int>(std::stoul(sm[2])) : 1;
67 auto stateForThisLeaf = elementsState.find(
m_content);
68 if( stateForThisLeaf == elementsState.end() ) {
71 return negate() ? !stateForThisLeaf->second : stateForThisLeaf->second;
81 bool pass = stateForThisLeaf->second >=
m_count;
82 return negate() ? !pass : pass;
85std::map<std::string, bool>
91std::map<std::string, unsigned int>
99 o << std::string(indSize*indLevel,
' ');
100 if(
negate() ) { o <<
"NOT "; }
112 m_subs.push_back(std::move(left));
118 m_subs.push_back(std::move(right));
121const std::vector<std::unique_ptr<TrigConf::Logic>> &
126std::vector<std::unique_ptr<TrigConf::Logic>>
128 auto tmp = std::move(
m_subs);
135 o << std::string(indSize*indLevel,
' ');
136 if(
negate() ) { o <<
"NOT "; }
138 for(
auto & subLogic :
m_subs ) {
139 subLogic->print(o,indSize, indLevel+1);
141 o << std::string(indSize*indLevel,
' ') <<
")" << std::endl;
158 if(! subLogic->evaluate(elementsState) ) {
159 return negate() ? true :
false;
162 return negate() ? false :
true;
169 return negate() ? true :
false;
172 return negate() ? false :
true;
175std::map<std::string, bool>
177 std::map<std::string, bool>
elements;
179 for (
const auto& el : subLogic->elements() ) {
186std::map<std::string, unsigned int>
190 for (
const auto& el : subLogic->elementsCount() ) {
208 if( subLogic->evaluate(elementsState) ) {
209 return negate() ? false :
true;
212 return negate() ? true :
false;
219 return negate() ? false :
true;
222 return negate() ? true :
false;
225std::map<std::string, bool>
227 std::map<std::string, bool>
elements;
229 for (
const auto& el : subLogic->elements() ) {
236std::map<std::string, unsigned int>
240 for (
const auto& el : subLogic->elementsCount() ) {
const boost::regex re(r_e)
static const std::regex re("([-\\w.]+)(?:\\[x(\\d+)\\])?$")
void print(char *figname, TCanvas *c1)
std::map< std::string, bool > elements() const override
bool evaluate(const std::map< std::string, bool > &elementsState) const override
std::map< std::string, unsigned int > elementsCount() const override
bool evaluate(const std::map< std::string, bool > &elements) const override
std::map< std::string, unsigned int > elementsCount() const override
virtual void print(std::ostream &, size_t indSize, size_t indLevel) const override
std::map< std::string, bool > elements() const override
void setContent(const std::string &content)
void addSubLogic(std::unique_ptr< Logic > &&right)
LogicOPS(NodeType nodeType)
std::vector< std::unique_ptr< Logic > > takeSubLogics()
virtual void print(std::ostream &, size_t indSize, size_t indLevel) const override
std::vector< std::unique_ptr< Logic > > m_subs
const std::vector< std::unique_ptr< Logic > > & subLogics() const
std::map< std::string, bool > elements() const override
std::map< std::string, unsigned int > elementsCount() const override
bool evaluate(const std::map< std::string, bool > &elementsState) const override
Class to hold the logic structure representing a logical expression and evaluate it for a given state...
NodeType nodeType() const
void setNegate(bool negate=true)
void setExpression(const std::string &)
const std::string & expression() const
void print(std::ostream &=std::cout) const