do not use non-standard anonymous structs

For #214, as observed by Thibaud Michaud.

* spot/twa/acc.hh: Name the anonymous struct.
* spot/twa/acc.hh, spot/twa/acc.cc, spot/parseaut/parseaut.yy,
spot/twaalgos/dtwasat.cc, spot/twaalgos/remfin.cc,
spot/twaalgos/sepsets.cc, spot/twaalgos/totgba.cc: Adjust all usages.
* NEWS: Mention the renaming.
This commit is contained in:
Alexandre Duret-Lutz 2017-02-01 14:09:18 +01:00
parent 954b9d2074
commit 70c70a63a3
8 changed files with 169 additions and 157 deletions

6
NEWS
View file

@ -14,6 +14,12 @@ New in spot 2.3.0.dev (not yet released)
- spot::ltsmin_model::kripke() forgot to register the "dead" - spot::ltsmin_model::kripke() forgot to register the "dead"
proposition. proposition.
- The spot::acc_word type (used to construct acceptance condition)
was using some non-standard anonymous struct. It is unlikely that
this type was actually used outside Spot, but if you do use it,
spot::acc_word::op and spot::acc_word::type had to be renamed as
spot::acc_word::sub.op and spot::acc_word::sub.type.
New in spot 2.3 (2017-01-19) New in spot 2.3 (2017-01-19)
Build: Build:

View file

@ -1,5 +1,5 @@
/* -*- coding: utf-8 -*- /* -*- coding: utf-8 -*-
** Copyright (C) 2014, 2015, 2016 Laboratoire de Recherche et ** Copyright (C) 2014, 2015, 2016, 2017 Laboratoire de Recherche et
** Développement de l'Epita (LRDE). ** Développement de l'Epita (LRDE).
** **
** This file is part of Spot, a model checking library. ** This file is part of Spot, a model checking library.
@ -2048,33 +2048,33 @@ fix_acceptance_aux(spot::acc_cond& acc,
unsigned base) unsigned base)
{ {
auto& w = in[pos]; auto& w = in[pos];
switch (w.op) switch (w.sub.op)
{ {
case spot::acc_cond::acc_op::And: case spot::acc_cond::acc_op::And:
{ {
unsigned sub = pos - w.size; unsigned sub = pos - w.sub.size;
--pos; --pos;
auto c = fix_acceptance_aux(acc, in, pos, onlyneg, both, base); auto c = fix_acceptance_aux(acc, in, pos, onlyneg, both, base);
pos -= in[pos].size; pos -= in[pos].sub.size;
while (sub < pos) while (sub < pos)
{ {
--pos; --pos;
c &= fix_acceptance_aux(acc, in, pos, onlyneg, both, base); c &= fix_acceptance_aux(acc, in, pos, onlyneg, both, base);
pos -= in[pos].size; pos -= in[pos].sub.size;
} }
return c; return c;
} }
case spot::acc_cond::acc_op::Or: case spot::acc_cond::acc_op::Or:
{ {
unsigned sub = pos - w.size; unsigned sub = pos - w.sub.size;
--pos; --pos;
auto c = fix_acceptance_aux(acc, in, pos, onlyneg, both, base); auto c = fix_acceptance_aux(acc, in, pos, onlyneg, both, base);
pos -= in[pos].size; pos -= in[pos].sub.size;
while (sub < pos) while (sub < pos)
{ {
--pos; --pos;
c |= fix_acceptance_aux(acc, in, pos, onlyneg, both, base); c |= fix_acceptance_aux(acc, in, pos, onlyneg, both, base);
pos -= in[pos].size; pos -= in[pos].sub.size;
} }
return c; return c;
} }

View file

@ -1,6 +1,6 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2015, 2016 Laboratoire de Recherche et Développement // Copyright (C) 2015, 2016, 2017 Laboratoire de Recherche et
// de l'Epita. // Développement de l'Epita.
// //
// This file is part of Spot, a model checking library. // This file is part of Spot, a model checking library.
// //
@ -73,14 +73,14 @@ namespace spot
auto& w = code[pos]; auto& w = code[pos];
const char* negated = ""; const char* negated = "";
bool top = pos == code.size() - 1; bool top = pos == code.size() - 1;
switch (w.op) switch (w.sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
op = html ? " &amp; " : " & "; op = html ? " &amp; " : " & ";
SPOT_FALLTHROUGH; SPOT_FALLTHROUGH;
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
{ {
unsigned sub = pos - w.size; unsigned sub = pos - w.sub.size;
if (!top) if (!top)
os << '('; os << '(';
bool first = true; bool first = true;
@ -92,7 +92,7 @@ namespace spot
else else
os << op; os << op;
print_code<html>(os, code, pos, set_printer); print_code<html>(os, code, pos, set_printer);
pos -= code[pos].size; pos -= code[pos].sub.size;
} }
if (!top) if (!top)
os << ')'; os << ')';
@ -177,29 +177,29 @@ namespace spot
static bool static bool
eval(acc_cond::mark_t inf, const acc_cond::acc_word* pos) eval(acc_cond::mark_t inf, const acc_cond::acc_word* pos)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
{ {
auto sub = pos - pos->size; auto sub = pos - pos->sub.size;
while (sub < pos) while (sub < pos)
{ {
--pos; --pos;
if (!eval(inf, pos)) if (!eval(inf, pos))
return false; return false;
pos -= pos->size; pos -= pos->sub.size;
} }
return true; return true;
} }
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
{ {
auto sub = pos - pos->size; auto sub = pos - pos->sub.size;
while (sub < pos) while (sub < pos)
{ {
--pos; --pos;
if (eval(inf, pos)) if (eval(inf, pos))
return true; return true;
pos -= pos->size; pos -= pos->sub.size;
} }
return false; return false;
} }
@ -218,29 +218,29 @@ namespace spot
static bool static bool
inf_eval(acc_cond::mark_t inf, const acc_cond::acc_word* pos) inf_eval(acc_cond::mark_t inf, const acc_cond::acc_word* pos)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
{ {
auto sub = pos - pos->size; auto sub = pos - pos->sub.size;
while (sub < pos) while (sub < pos)
{ {
--pos; --pos;
if (!inf_eval(inf, pos)) if (!inf_eval(inf, pos))
return false; return false;
pos -= pos->size; pos -= pos->sub.size;
} }
return true; return true;
} }
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
{ {
auto sub = pos - pos->size; auto sub = pos - pos->sub.size;
while (sub < pos) while (sub < pos)
{ {
--pos; --pos;
if (inf_eval(inf, pos)) if (inf_eval(inf, pos))
return true; return true;
pos -= pos->size; pos -= pos->sub.size;
} }
return false; return false;
} }
@ -259,11 +259,11 @@ namespace spot
static acc_cond::mark_t static acc_cond::mark_t
eval_sets(acc_cond::mark_t inf, const acc_cond::acc_word* pos) eval_sets(acc_cond::mark_t inf, const acc_cond::acc_word* pos)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
{ {
auto sub = pos - pos->size; auto sub = pos - pos->sub.size;
acc_cond::mark_t m = 0U; acc_cond::mark_t m = 0U;
while (sub < pos) while (sub < pos)
{ {
@ -272,19 +272,19 @@ namespace spot
m |= s; m |= s;
else else
return 0U; return 0U;
pos -= pos->size; pos -= pos->sub.size;
} }
return m; return m;
} }
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
{ {
auto sub = pos - pos->size; auto sub = pos - pos->sub.size;
while (sub < pos) while (sub < pos)
{ {
--pos; --pos;
if (auto s = eval_sets(inf, pos)) if (auto s = eval_sets(inf, pos))
return s; return s;
pos -= pos->size; pos -= pos->sub.size;
} }
return 0U; return 0U;
} }
@ -334,7 +334,7 @@ namespace spot
unsigned pos = code_.size(); unsigned pos = code_.size();
do do
{ {
switch (code_[pos - 1].op) switch (code_[pos - 1].sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
@ -369,8 +369,8 @@ namespace spot
acc_cond::acc_op lowop, acc_cond::acc_op lowop,
acc_cond::mark_t all_sets) acc_cond::mark_t all_sets)
{ {
unsigned s = code.back().size; unsigned s = code.back().sub.size;
auto mainop = code.back().op; auto mainop = code.back().sub.op;
if (mainop == highop) if (mainop == highop)
{ {
// The size must be a multiple of 5. // The size must be a multiple of 5.
@ -388,11 +388,11 @@ namespace spot
acc_cond::mark_t seen_inf = 0U; acc_cond::mark_t seen_inf = 0U;
while (s) while (s)
{ {
if (code[--s].op != lowop) if (code[--s].sub.op != lowop)
return false; return false;
auto o1 = code[--s].op; auto o1 = code[--s].sub.op;
auto m1 = code[--s].mark; auto m1 = code[--s].mark;
auto o2 = code[--s].op; auto o2 = code[--s].sub.op;
auto m2 = code[--s].mark; auto m2 = code[--s].mark;
// We assume // We assume
@ -454,10 +454,10 @@ namespace spot
return true; return true;
} }
if (code_.is_t() if (code_.is_t()
|| code_.back().op != acc_op::Or) || code_.back().sub.op != acc_op::Or)
return false; return false;
auto s = code_.back().size; auto s = code_.back().sub.size;
acc_cond::mark_t seen_fin = 0U; acc_cond::mark_t seen_fin = 0U;
acc_cond::mark_t seen_inf = 0U; acc_cond::mark_t seen_inf = 0U;
// Each pairs is the position of a Fin followed // Each pairs is the position of a Fin followed
@ -466,11 +466,11 @@ namespace spot
while (s) while (s)
{ {
--s; --s;
if (code_[s].op == acc_op::And) if (code_[s].sub.op == acc_op::And)
{ {
auto o1 = code_[--s].op; auto o1 = code_[--s].sub.op;
auto m1 = code_[--s].mark; auto m1 = code_[--s].mark;
auto o2 = code_[--s].op; auto o2 = code_[--s].sub.op;
auto m2 = code_[--s].mark; auto m2 = code_[--s].mark;
// We assume // We assume
@ -503,7 +503,7 @@ namespace spot
seen_fin |= m1; seen_fin |= m1;
seen_inf |= m2; seen_inf |= m2;
} }
else if (code_[s].op == acc_op::Fin) else if (code_[s].sub.op == acc_op::Fin)
{ {
auto m1 = code_[--s].mark; auto m1 = code_[--s].mark;
for (auto s: m1.sets()) for (auto s: m1.sets())
@ -597,9 +597,9 @@ namespace spot
{ {
bdd to_bdd_rec(const acc_cond::acc_word* c, const bdd* map) bdd to_bdd_rec(const acc_cond::acc_word* c, const bdd* map)
{ {
auto sz = c->size; auto sz = c->sub.size;
auto start = c - sz - 1; auto start = c - sz - 1;
auto op = c->op; auto op = c->sub.op;
switch (op) switch (op)
{ {
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
@ -609,7 +609,7 @@ namespace spot
do do
{ {
res |= to_bdd_rec(c, map); res |= to_bdd_rec(c, map);
c -= c->size + 1; c -= c->sub.size + 1;
} }
while (c > start); while (c > start);
return res; return res;
@ -621,7 +621,7 @@ namespace spot
do do
{ {
res &= to_bdd_rec(c, map); res &= to_bdd_rec(c, map);
c -= c->size + 1; c -= c->sub.size + 1;
} }
while (c > start); while (c > start);
return res; return res;
@ -1005,16 +1005,16 @@ namespace spot
auto pos = &back(); auto pos = &back();
auto start = &front(); auto start = &front();
auto and_scope = pos + 1; auto and_scope = pos + 1;
if (pos->op == acc_cond::acc_op::Or) if (pos->sub.op == acc_cond::acc_op::Or)
--pos; --pos;
while (pos > start) while (pos > start)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
return false; return false;
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
and_scope = std::min(and_scope, pos - pos->size); and_scope = std::min(and_scope, pos - pos->sub.size);
--pos; --pos;
break; break;
case acc_cond::acc_op::Fin: case acc_cond::acc_op::Fin:
@ -1038,16 +1038,16 @@ namespace spot
auto pos = &back(); auto pos = &back();
auto start = &front(); auto start = &front();
auto or_scope = pos + 1; auto or_scope = pos + 1;
if (pos->op == acc_cond::acc_op::And) if (pos->sub.op == acc_cond::acc_op::And)
--pos; --pos;
while (pos > start) while (pos > start)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
return false; return false;
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
or_scope = std::min(or_scope, pos - pos->size); or_scope = std::min(or_scope, pos - pos->sub.size);
--pos; --pos;
break; break;
case acc_cond::acc_op::Inf: case acc_cond::acc_op::Inf:
@ -1068,8 +1068,8 @@ namespace spot
{ {
acc_cond::acc_code complement_rec(const acc_cond::acc_word* pos) acc_cond::acc_code complement_rec(const acc_cond::acc_word* pos)
{ {
auto start = pos - pos->size; auto start = pos - pos->sub.size;
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
{ {
@ -1079,7 +1079,7 @@ namespace spot
{ {
auto tmp = complement_rec(pos) | std::move(res); auto tmp = complement_rec(pos) | std::move(res);
std::swap(tmp, res); std::swap(tmp, res);
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
while (pos > start); while (pos > start);
return res; return res;
@ -1092,7 +1092,7 @@ namespace spot
{ {
auto tmp = complement_rec(pos) & std::move(res); auto tmp = complement_rec(pos) & std::move(res);
std::swap(tmp, res); std::swap(tmp, res);
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
while (pos > start); while (pos > start);
return res; return res;
@ -1125,8 +1125,8 @@ namespace spot
static acc_cond::acc_code static acc_cond::acc_code
strip_rec(const acc_cond::acc_word* pos, acc_cond::mark_t rem, bool missing) strip_rec(const acc_cond::acc_word* pos, acc_cond::mark_t rem, bool missing)
{ {
auto start = pos - pos->size; auto start = pos - pos->sub.size;
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
{ {
@ -1136,7 +1136,7 @@ namespace spot
{ {
auto tmp = strip_rec(pos, rem, missing) & std::move(res); auto tmp = strip_rec(pos, rem, missing) & std::move(res);
std::swap(tmp, res); std::swap(tmp, res);
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
while (pos > start); while (pos > start);
return res; return res;
@ -1149,7 +1149,7 @@ namespace spot
{ {
auto tmp = strip_rec(pos, rem, missing) | std::move(res); auto tmp = strip_rec(pos, rem, missing) | std::move(res);
std::swap(tmp, res); std::swap(tmp, res);
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
while (pos > start); while (pos > start);
return res; return res;
@ -1190,7 +1190,7 @@ namespace spot
auto end = &front(); auto end = &front();
while (pos > end) while (pos > end)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
@ -1220,7 +1220,7 @@ namespace spot
auto end = &front(); auto end = &front();
while (pos > end) while (pos > end)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:

View file

@ -1,5 +1,5 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2014, 2015, 2016 Laboratoire de Recherche et // Copyright (C) 2014, 2015, 2016, 2017 Laboratoire de Recherche et
// Développement de l'Epita. // Développement de l'Epita.
// //
// This file is part of Spot, a model checking library. // This file is part of Spot, a model checking library.
@ -294,7 +294,7 @@ namespace spot
acc_op op; // Operator acc_op op; // Operator
unsigned short size; // Size of the subtree (number of acc_word), unsigned short size; // Size of the subtree (number of acc_word),
// not counting this node. // not counting this node.
}; } sub;
}; };
struct SPOT_API acc_code: public std::vector<acc_word> struct SPOT_API acc_code: public std::vector<acc_word>
@ -306,10 +306,10 @@ namespace spot
return false; return false;
while (pos > 0) while (pos > 0)
{ {
auto op = (*this)[pos - 1].op; auto op = (*this)[pos - 1].sub.op;
auto sz = (*this)[pos - 1].size; auto sz = (*this)[pos - 1].sub.size;
if (other[pos - 1].op != op || if (other[pos - 1].sub.op != op ||
other[pos - 1].size != sz) other[pos - 1].sub.size != sz)
return false; return false;
switch (op) switch (op)
{ {
@ -340,14 +340,14 @@ namespace spot
return false; return false;
while (pos > 0) while (pos > 0)
{ {
auto op = (*this)[pos - 1].op; auto op = (*this)[pos - 1].sub.op;
auto oop = other[pos - 1].op; auto oop = other[pos - 1].sub.op;
if (op < oop) if (op < oop)
return true; return true;
if (op > oop) if (op > oop)
return false; return false;
auto sz = (*this)[pos - 1].size; auto sz = (*this)[pos - 1].sub.size;
auto osz = other[pos - 1].size; auto osz = other[pos - 1].sub.size;
if (sz < osz) if (sz < osz)
return true; return true;
if (sz > osz) if (sz > osz)
@ -398,15 +398,15 @@ namespace spot
bool is_t() const bool is_t() const
{ {
unsigned s = size(); unsigned s = size();
return s == 0 return s == 0 || ((*this)[s - 1].sub.op == acc_op::Inf
|| ((*this)[s - 1].op == acc_op::Inf && (*this)[s - 2].mark == 0U); && (*this)[s - 2].mark == 0U);
} }
bool is_f() const bool is_f() const
{ {
unsigned s = size(); unsigned s = size();
return s > 1 return s > 1
&& (*this)[s - 1].op == acc_op::Fin && (*this)[s - 2].mark == 0U; && (*this)[s - 1].sub.op == acc_op::Fin && (*this)[s - 2].mark == 0U;
} }
static acc_code f() static acc_code f()
@ -414,8 +414,8 @@ namespace spot
acc_code res; acc_code res;
res.resize(2); res.resize(2);
res[0].mark = 0U; res[0].mark = 0U;
res[1].op = acc_op::Fin; res[1].sub.op = acc_op::Fin;
res[1].size = 1; res[1].sub.size = 1;
return res; return res;
} }
@ -429,8 +429,8 @@ namespace spot
acc_code res; acc_code res;
res.resize(2); res.resize(2);
res[0].mark = m; res[0].mark = m;
res[1].op = acc_op::Fin; res[1].sub.op = acc_op::Fin;
res[1].size = 1; res[1].sub.size = 1;
return res; return res;
} }
@ -444,8 +444,8 @@ namespace spot
acc_code res; acc_code res;
res.resize(2); res.resize(2);
res[0].mark = m; res[0].mark = m;
res[1].op = acc_op::FinNeg; res[1].sub.op = acc_op::FinNeg;
res[1].size = 1; res[1].sub.size = 1;
return res; return res;
} }
@ -459,8 +459,8 @@ namespace spot
acc_code res; acc_code res;
res.resize(2); res.resize(2);
res[0].mark = m; res[0].mark = m;
res[1].op = acc_op::Inf; res[1].sub.op = acc_op::Inf;
res[1].size = 1; res[1].sub.size = 1;
return res; return res;
} }
@ -474,8 +474,8 @@ namespace spot
acc_code res; acc_code res;
res.resize(2); res.resize(2);
res[0].mark = m; res[0].mark = m;
res[1].op = acc_op::InfNeg; res[1].sub.op = acc_op::InfNeg;
res[1].size = 1; res[1].sub.size = 1;
return res; return res;
} }
@ -572,8 +572,10 @@ namespace spot
unsigned rs = r.size() - 1; unsigned rs = r.size() - 1;
// We want to group all Inf(x) operators: // We want to group all Inf(x) operators:
// Inf(a) & Inf(b) = Inf(a & b) // Inf(a) & Inf(b) = Inf(a & b)
if (((*this)[s].op == acc_op::Inf && r[rs].op == acc_op::Inf) if (((*this)[s].sub.op == acc_op::Inf
|| ((*this)[s].op == acc_op::InfNeg && r[rs].op == acc_op::InfNeg)) && r[rs].sub.op == acc_op::Inf)
|| ((*this)[s].sub.op == acc_op::InfNeg
&& r[rs].sub.op == acc_op::InfNeg))
{ {
(*this)[s - 1].mark |= r[rs - 1].mark; (*this)[s - 1].mark |= r[rs - 1].mark;
return *this; return *this;
@ -585,43 +587,43 @@ namespace spot
// left_inf points to the left Inf mark if any. // left_inf points to the left Inf mark if any.
// right_inf points to the right Inf mark if any. // right_inf points to the right Inf mark if any.
acc_word* left_inf = nullptr; acc_word* left_inf = nullptr;
if ((*this)[s].op == acc_op::And) if ((*this)[s].sub.op == acc_op::And)
{ {
auto start = &(*this)[s] - (*this)[s].size; auto start = &(*this)[s] - (*this)[s].sub.size;
auto pos = &(*this)[s] - 1; auto pos = &(*this)[s] - 1;
pop_back(); pop_back();
while (pos > start) while (pos > start)
{ {
if (pos->op == acc_op::Inf) if (pos->sub.op == acc_op::Inf)
{ {
left_inf = pos - 1; left_inf = pos - 1;
break; break;
} }
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
} }
else if ((*this)[s].op == acc_op::Inf) else if ((*this)[s].sub.op == acc_op::Inf)
{ {
left_inf = &(*this)[s - 1]; left_inf = &(*this)[s - 1];
} }
acc_word* right_inf = nullptr; acc_word* right_inf = nullptr;
auto right_end = &r.back(); auto right_end = &r.back();
if (right_end->op == acc_op::And) if (right_end->sub.op == acc_op::And)
{ {
auto start = &r[0]; auto start = &r[0];
auto pos = --right_end; auto pos = --right_end;
while (pos > start) while (pos > start)
{ {
if (pos->op == acc_op::Inf) if (pos->sub.op == acc_op::Inf)
{ {
right_inf = pos - 1; right_inf = pos - 1;
break; break;
} }
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
} }
else if (right_end->op == acc_op::Inf) else if (right_end->sub.op == acc_op::Inf)
{ {
right_inf = right_end - 1; right_inf = right_end - 1;
} }
@ -645,8 +647,8 @@ namespace spot
} }
acc_word w; acc_word w;
w.op = acc_op::And; w.sub.op = acc_op::And;
w.size = size(); w.sub.size = size();
emplace_back(w); emplace_back(w);
return *this; return *this;
} }
@ -663,8 +665,10 @@ namespace spot
unsigned s = size() - 1; unsigned s = size() - 1;
unsigned rs = r.size() - 1; unsigned rs = r.size() - 1;
// Inf(a) & Inf(b) = Inf(a & b) // Inf(a) & Inf(b) = Inf(a & b)
if (((*this)[s].op == acc_op::Inf && r[rs].op == acc_op::Inf) if (((*this)[s].sub.op == acc_op::Inf
|| ((*this)[s].op == acc_op::InfNeg && r[rs].op == acc_op::InfNeg)) && r[rs].sub.op == acc_op::Inf)
|| ((*this)[s].sub.op == acc_op::InfNeg
&& r[rs].sub.op == acc_op::InfNeg))
{ {
(*this)[s - 1].mark |= r[rs - 1].mark; (*this)[s - 1].mark |= r[rs - 1].mark;
return *this; return *this;
@ -676,43 +680,43 @@ namespace spot
// left_inf points to the left Inf mark if any. // left_inf points to the left Inf mark if any.
// right_inf points to the right Inf mark if any. // right_inf points to the right Inf mark if any.
acc_word* left_inf = nullptr; acc_word* left_inf = nullptr;
if ((*this)[s].op == acc_op::And) if ((*this)[s].sub.op == acc_op::And)
{ {
auto start = &(*this)[s] - (*this)[s].size; auto start = &(*this)[s] - (*this)[s].sub.size;
auto pos = &(*this)[s] - 1; auto pos = &(*this)[s] - 1;
pop_back(); pop_back();
while (pos > start) while (pos > start)
{ {
if (pos->op == acc_op::Inf) if (pos->sub.op == acc_op::Inf)
{ {
left_inf = pos - 1; left_inf = pos - 1;
break; break;
} }
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
} }
else if ((*this)[s].op == acc_op::Inf) else if ((*this)[s].sub.op == acc_op::Inf)
{ {
left_inf = &(*this)[s - 1]; left_inf = &(*this)[s - 1];
} }
const acc_word* right_inf = nullptr; const acc_word* right_inf = nullptr;
auto right_end = &r.back(); auto right_end = &r.back();
if (right_end->op == acc_op::And) if (right_end->sub.op == acc_op::And)
{ {
auto start = &r[0]; auto start = &r[0];
auto pos = --right_end; auto pos = --right_end;
while (pos > start) while (pos > start)
{ {
if (pos->op == acc_op::Inf) if (pos->sub.op == acc_op::Inf)
{ {
right_inf = pos - 1; right_inf = pos - 1;
break; break;
} }
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
} }
else if (right_end->op == acc_op::Inf) else if (right_end->sub.op == acc_op::Inf)
{ {
right_inf = right_end - 1; right_inf = right_end - 1;
} }
@ -736,8 +740,8 @@ namespace spot
} }
acc_word w; acc_word w;
w.op = acc_op::And; w.sub.op = acc_op::And;
w.size = size(); w.sub.size = size();
emplace_back(w); emplace_back(w);
return *this; return *this;
} }
@ -768,20 +772,22 @@ namespace spot
unsigned s = size() - 1; unsigned s = size() - 1;
unsigned rs = r.size() - 1; unsigned rs = r.size() - 1;
// Fin(a) | Fin(b) = Fin(a | b) // Fin(a) | Fin(b) = Fin(a | b)
if (((*this)[s].op == acc_op::Fin && r[rs].op == acc_op::Fin) if (((*this)[s].sub.op == acc_op::Fin
|| ((*this)[s].op == acc_op::FinNeg && r[rs].op == acc_op::FinNeg)) && r[rs].sub.op == acc_op::Fin)
|| ((*this)[s].sub.op == acc_op::FinNeg
&& r[rs].sub.op == acc_op::FinNeg))
{ {
(*this)[s - 1].mark |= r[rs - 1].mark; (*this)[s - 1].mark |= r[rs - 1].mark;
return *this; return *this;
} }
if ((*this)[s].op == acc_op::Or) if ((*this)[s].sub.op == acc_op::Or)
pop_back(); pop_back();
if (r.back().op == acc_op::Or) if (r.back().sub.op == acc_op::Or)
r.pop_back(); r.pop_back();
insert(this->end(), r.begin(), r.end()); insert(this->end(), r.begin(), r.end());
acc_word w; acc_word w;
w.op = acc_op::Or; w.sub.op = acc_op::Or;
w.size = size(); w.sub.size = size();
emplace_back(w); emplace_back(w);
return *this; return *this;
} }
@ -812,7 +818,7 @@ namespace spot
unsigned pos = size(); unsigned pos = size();
do do
{ {
switch ((*this)[pos - 1].op) switch ((*this)[pos - 1].sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
@ -1008,7 +1014,7 @@ namespace spot
{ {
unsigned s = code_.size(); unsigned s = code_.size();
return num_ == 1 && return num_ == 1 &&
s == 2 && code_[1].op == acc_op::Inf && code_[0].mark == all_sets(); s == 2 && code_[1].sub.op == acc_op::Inf && code_[0].mark == all_sets();
} }
bool is_co_buchi() const bool is_co_buchi() const
@ -1024,15 +1030,15 @@ namespace spot
bool is_generalized_buchi() const bool is_generalized_buchi() const
{ {
unsigned s = code_.size(); unsigned s = code_.size();
return (s == 0 && num_ == 0) || return (s == 0 && num_ == 0) || (s == 2 && code_[1].sub.op == acc_op::Inf
(s == 2 && code_[1].op == acc_op::Inf && code_[0].mark == all_sets()); && code_[0].mark == all_sets());
} }
bool is_generalized_co_buchi() const bool is_generalized_co_buchi() const
{ {
unsigned s = code_.size(); unsigned s = code_.size();
return (s == 2 && return (s == 2 &&
code_[1].op == acc_op::Fin && code_[0].mark == all_sets()); code_[1].sub.op == acc_op::Fin && code_[0].mark == all_sets());
} }
// Returns a number of pairs (>=0) if Rabin, or -1 else. // Returns a number of pairs (>=0) if Rabin, or -1 else.

View file

@ -128,27 +128,27 @@ namespace spot
trimming_map res; trimming_map res;
auto acc = input_acc.to_dnf(); auto acc = input_acc.to_dnf();
auto pos = &acc.back(); auto pos = &acc.back();
if (pos->op == acc_cond::acc_op::Or) if (pos->sub.op == acc_cond::acc_op::Or)
--pos; --pos;
acc_cond::mark_t all_fin = 0U; acc_cond::mark_t all_fin = 0U;
auto start = &acc.front(); auto start = &acc.front();
while (pos > start) while (pos > start)
{ {
if (pos->op == acc_cond::acc_op::Fin) if (pos->sub.op == acc_cond::acc_op::Fin)
{ {
// We have only a Fin term, without Inf. // We have only a Fin term, without Inf.
// There is nothing to do about it. // There is nothing to do about it.
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
else else
{ {
// We have a conjunction of Fin and Inf sets. // We have a conjunction of Fin and Inf sets.
auto end = pos - pos->size - 1; auto end = pos - pos->sub.size - 1;
acc_cond::mark_t fin = 0U; acc_cond::mark_t fin = 0U;
acc_cond::mark_t inf = 0U; acc_cond::mark_t inf = 0U;
while (pos > end) while (pos > end)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
--pos; --pos;

View file

@ -318,12 +318,12 @@ namespace spot
{ {
std::map<acc_cond::mark_t, acc_cond::acc_code> res; std::map<acc_cond::mark_t, acc_cond::acc_code> res;
auto pos = &acc.back(); auto pos = &acc.back();
if (pos->op == acc_cond::acc_op::Or) if (pos->sub.op == acc_cond::acc_op::Or)
--pos; --pos;
auto start = &acc.front(); auto start = &acc.front();
while (pos > start) while (pos > start)
{ {
if (pos->op == acc_cond::acc_op::Fin) if (pos->sub.op == acc_cond::acc_op::Fin)
{ {
// We have only a Fin term, without Inf. In this case // We have only a Fin term, without Inf. In this case
// only, the Fin() may encode a disjunction of sets. // only, the Fin() may encode a disjunction of sets.
@ -333,17 +333,17 @@ namespace spot
fin.set(s); fin.set(s);
res[fin] = acc_cond::acc_code{}; res[fin] = acc_cond::acc_code{};
} }
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
else else
{ {
// We have a conjunction of Fin and Inf sets. // We have a conjunction of Fin and Inf sets.
auto end = pos - pos->size - 1; auto end = pos - pos->sub.size - 1;
acc_cond::mark_t fin = 0U; acc_cond::mark_t fin = 0U;
acc_cond::mark_t inf = 0U; acc_cond::mark_t inf = 0U;
while (pos > end) while (pos > end)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
--pos; --pos;
@ -367,8 +367,8 @@ namespace spot
assert(pos == end); assert(pos == end);
acc_cond::acc_word w[2]; acc_cond::acc_word w[2];
w[0].mark = inf; w[0].mark = inf;
w[1].op = acc_cond::acc_op::Inf; w[1].sub.op = acc_cond::acc_op::Inf;
w[1].size = 1; w[1].sub.size = 1;
acc_cond::acc_code c; acc_cond::acc_code c;
c.insert(c.end(), w, w + 2); c.insert(c.end(), w, w + 2);
auto p = res.emplace(fin, c); auto p = res.emplace(fin, c);
@ -428,27 +428,27 @@ namespace spot
acc_cond::mark_t inf_alone = 0U; acc_cond::mark_t inf_alone = 0U;
acc_cond::mark_t fin_alone = 0U; acc_cond::mark_t fin_alone = 0U;
auto s = code.back().size; auto s = code.back().sub.size;
// Rabin 1 // Rabin 1
if (code.back().op == acc_cond::acc_op::And && s == 4) if (code.back().sub.op == acc_cond::acc_op::And && s == 4)
goto start_and; goto start_and;
// Co-Büchi // Co-Büchi
else if (code.back().op == acc_cond::acc_op::Fin && s == 1) else if (code.back().sub.op == acc_cond::acc_op::Fin && s == 1)
goto start_fin; goto start_fin;
// Rabin >1 // Rabin >1
else if (code.back().op != acc_cond::acc_op::Or) else if (code.back().sub.op != acc_cond::acc_op::Or)
return nullptr; return nullptr;
while (s) while (s)
{ {
--s; --s;
if (code[s].op == acc_cond::acc_op::And) if (code[s].sub.op == acc_cond::acc_op::And)
{ {
start_and: start_and:
auto o1 = code[--s].op; auto o1 = code[--s].sub.op;
auto m1 = code[--s].mark; auto m1 = code[--s].mark;
auto o2 = code[--s].op; auto o2 = code[--s].sub.op;
auto m2 = code[--s].mark; auto m2 = code[--s].mark;
// We expect // We expect
// Fin({n}) & Inf({n+1}) // Fin({n}) & Inf({n+1})
@ -460,12 +460,12 @@ namespace spot
return nullptr; return nullptr;
inf_pairs |= m2; inf_pairs |= m2;
} }
else if (code[s].op == acc_cond::acc_op::Fin) else if (code[s].sub.op == acc_cond::acc_op::Fin)
{ {
start_fin: start_fin:
fin_alone |= code[--s].mark; fin_alone |= code[--s].mark;
} }
else if (code[s].op == acc_cond::acc_op::Inf) else if (code[s].sub.op == acc_cond::acc_op::Inf)
{ {
auto m1 = code[--s].mark; auto m1 = code[--s].mark;
if (m1.count() != 1) if (m1.count() != 1)
@ -551,7 +551,7 @@ namespace spot
auto end = &p.second.front(); auto end = &p.second.front();
while (pos > end) while (pos > end)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:

View file

@ -1,6 +1,6 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2015, 2016 Laboratoire de Recherche et Développement // Copyright (C) 2015, 2016, 2017 Laboratoire de Recherche et
// de l'Epita. // Développement de l'Epita.
// //
// This file is part of Spot, a model checking library. // This file is part of Spot, a model checking library.
// //
@ -60,7 +60,7 @@ namespace spot
acc_cond::acc_word* start = &code.front(); acc_cond::acc_word* start = &code.front();
while (pos > start) while (pos > start)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::Or: case acc_cond::acc_op::Or:
case acc_cond::acc_op::And: case acc_cond::acc_op::And:

View file

@ -1,6 +1,6 @@
// -*- coding: utf-8 -*- // -*- coding: utf-8 -*-
// Copyright (C) 2015, 2016 Laboratoire de Recherche et Développement // Copyright (C) 2015, 2016, 2017 Laboratoire de Recherche et
// de l'Epita. // Développement de l'Epita.
// //
// This file is part of Spot, a model checking library. // This file is part of Spot, a model checking library.
// //
@ -70,17 +70,17 @@ namespace spot
terms_t res; terms_t res;
auto pos = &code.back(); auto pos = &code.back();
auto end = &code.front(); auto end = &code.front();
if (pos->op == acc_cond::acc_op::And) if (pos->sub.op == acc_cond::acc_op::And)
--pos; --pos;
while (pos >= end) while (pos >= end)
{ {
auto term_end = pos - 1 - pos->size; auto term_end = pos - 1 - pos->sub.size;
if (pos->op == acc_cond::acc_op::Or) if (pos->sub.op == acc_cond::acc_op::Or)
--pos; --pos;
acc_cond::mark_t m = 0U; acc_cond::mark_t m = 0U;
while (pos > term_end) while (pos > term_end)
{ {
assert(pos->op == acc_cond::acc_op::Inf); assert(pos->sub.op == acc_cond::acc_op::Inf);
m |= pos[-1].mark; m |= pos[-1].mark;
pos -= 2; pos -= 2;
} }
@ -319,7 +319,7 @@ namespace spot
auto cnf = res->get_acceptance().to_cnf(); auto cnf = res->get_acceptance().to_cnf();
// If we are very lucky, building a CNF actually gave us a GBA... // If we are very lucky, building a CNF actually gave us a GBA...
if (cnf.empty() || if (cnf.empty() ||
(cnf.size() == 2 && cnf.back().op == acc_cond::acc_op::Inf)) (cnf.size() == 2 && cnf.back().sub.op == acc_cond::acc_op::Inf))
{ {
res->set_acceptance(res->num_sets(), cnf); res->set_acceptance(res->num_sets(), cnf);
cleanup_acceptance_here(res); cleanup_acceptance_here(res);
@ -379,28 +379,28 @@ namespace spot
return res; return res;
} }
auto pos = &acc.back(); auto pos = &acc.back();
if (pos->op == acc_cond::acc_op::Or) if (pos->sub.op == acc_cond::acc_op::Or)
--pos; --pos;
auto start = &acc.front(); auto start = &acc.front();
while (pos > start) while (pos > start)
{ {
if (pos->op == acc_cond::acc_op::Fin) if (pos->sub.op == acc_cond::acc_op::Fin)
{ {
// We have only a Fin term, without Inf. In this case // We have only a Fin term, without Inf. In this case
// only, the Fin() may encode a disjunction of sets. // only, the Fin() may encode a disjunction of sets.
for (auto s: pos[-1].mark.sets()) for (auto s: pos[-1].mark.sets())
res.emplace_back(acc_cond::mark_t({s}), 0U); res.emplace_back(acc_cond::mark_t({s}), 0U);
pos -= pos->size + 1; pos -= pos->sub.size + 1;
} }
else else
{ {
// We have a conjunction of Fin and Inf sets. // We have a conjunction of Fin and Inf sets.
auto end = pos - pos->size - 1; auto end = pos - pos->sub.size - 1;
acc_cond::mark_t fin = 0U; acc_cond::mark_t fin = 0U;
acc_cond::mark_t inf = 0U; acc_cond::mark_t inf = 0U;
while (pos > end) while (pos > end)
{ {
switch (pos->op) switch (pos->sub.op)
{ {
case acc_cond::acc_op::And: case acc_cond::acc_op::And:
--pos; --pos;