25 #ifndef FAUDES_TRANSSET_H
26 #define FAUDES_TRANSSET_H
74 X1(x1), Ev(ev), X2(x2) {}
77 inline bool operator < (
const Transition& othertrans)
const {
78 if (X1 < othertrans.
X1)
return true;
79 if (X1 > othertrans.
X1)
return false;
80 if (Ev < othertrans.
Ev)
return true;
81 if (Ev > othertrans.
Ev)
return false;
82 if (X2 < othertrans.
X2)
return true;
87 inline bool operator == (
const Transition& othertrans)
const {
88 return ((X1 == othertrans.
X1) && (Ev == othertrans.
Ev) && (X2 == othertrans.
X2));
92 inline bool operator != (
const Transition& othertrans)
const {
93 return ((X1 != othertrans.
X1) || (Ev != othertrans.
Ev) || (X2 != othertrans.
X2));
98 return (X1!=0) && (Ev!=0) && (X2!=0);
111 std::string
Str(
void)
const {
130 if (left.
Ev < right.
Ev)
return true;
131 if (left.
Ev > right.
Ev)
return false;
132 if (left.
X1 < right.
X1)
return true;
133 if (left.
X1 > right.
X1)
return false;
134 if (left.
X2 < right.
X2)
return true;
142 if (left.
Ev < right.
Ev)
return true;
143 if (left.
Ev > right.
Ev)
return false;
144 if (left.
X2 < right.
X2)
return true;
145 if (left.
X2 > right.
X2)
return false;
146 if (left.
X1 < right.
X1)
return true;
154 if (left.
X2 < right.
X2)
return true;
155 if (left.
X2 > right.
X2)
return false;
156 if (left.
Ev < right.
Ev)
return true;
157 if (left.
Ev > right.
Ev)
return false;
158 if (left.
X1 < right.
X1)
return true;
166 if (left.
X2 < right.
X2)
return true;
167 if (left.
X2 > right.
X2)
return false;
168 if (left.
X1 < right.
X1)
return true;
169 if (left.
X1 > right.
X1)
return false;
170 if (left.
Ev < right.
Ev)
return true;
178 if (left.
X1 < right.
X1)
return true;
179 if (left.
X1 > right.
X1)
return false;
180 if (left.
X2 < right.
X2)
return true;
181 if (left.
X2 > right.
X2)
return false;
182 if (left.
Ev < right.
Ev)
return true;
190 if (left.
X1 < right.
X1)
return true;
191 if (left.
X1 > right.
X1)
return false;
192 if (left.
Ev < right.
Ev)
return true;
193 if (left.
Ev > right.
Ev)
return false;
194 if (left.
X2 < right.
X2)
return true;
241 template <
class Cmp=TransSort::X1EvX2>
269 template<
class OtherCmp>
833 template<
class OtherCmp>
992 template <
class Attr>
999 using TransSet::operator=;
1000 using TransSet::operator==;
1001 using TransSet::operator!=;
1092 bool Insert(
const Transition& rTransition,
const Attr& rAttr);
1104 virtual void InsertSet(
const TransSet& rOtherSet);
1151 virtual void EraseSet(
const TransSet& rOtherSet);
1176 void RestrictSet(
const TransSet& rOtherSet);
1229 #define THIS TTransSet<Cmp>
1230 #define TEMP template<class Cmp>
1231 #define BASE TBaseSet<Transition,Cmp>
1239 FD_DC(
"TTransSet(" <<
this <<
")::TTransSet()");
1247 FD_DC(
"TTransSet(" <<
this <<
")::TTransSet(rOtherSet "<< &rOtherSet <<
")");
1252 TEMP template<
class OtherCmp>
1256 FD_DC(
"TTransSet(" <<
this <<
")::TTransSet(rOtherSet/ReSort "<< &rOtherSet <<
")");
1262 FD_DC(
"TTransSet(" <<
this <<
")::DoAssign(..)");
1264 BASE::DoAssign(rSourceSet);
1268 TEMP typename THIS::Iterator THIS::Begin(
void)
const {
1269 return BASE::Begin();
1273 TEMP typename THIS::Iterator THIS::End(
void)
const {
1279 #define SORT_EXCEPTION { std::stringstream errstr; \
1280 errstr << "Transition set order mismatch " << std::endl; \
1281 throw Exception("TransSet::Iterator()", errstr.str(), 68); }
1285 TEMP typename THIS::Iterator THIS::Begin(
Idx x1)
const {
1286 #ifdef FAUDES_CHECKED
1292 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1296 TEMP typename THIS::Iterator THIS::End(
Idx x1)
const {
1297 #ifdef FAUDES_CHECKED
1303 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1308 #ifdef FAUDES_CHECKED
1313 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1318 #ifdef FAUDES_CHECKED
1323 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1327 TEMP typename THIS::Iterator THIS::BeginByEv(
Idx ev)
const {
1328 #ifdef FAUDES_CHECKED
1334 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1338 TEMP typename THIS::Iterator THIS::EndByEv(
Idx ev)
const {
1339 #ifdef FAUDES_CHECKED
1345 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1349 TEMP typename THIS::Iterator THIS::BeginByEvX1(
Idx ev,
Idx x1)
const {
1350 #ifdef FAUDES_CHECKED
1355 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1359 TEMP typename THIS::Iterator THIS::EndByEvX1(
Idx ev,
Idx x1)
const {
1360 #ifdef FAUDES_CHECKED
1365 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1369 TEMP typename THIS::Iterator THIS::BeginByEvX2(
Idx ev,
Idx x2)
const {
1370 #ifdef FAUDES_CHECKED
1375 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1379 TEMP typename THIS::Iterator THIS::EndByEvX2(
Idx ev,
Idx x2)
const {
1380 #ifdef FAUDES_CHECKED
1385 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1389 TEMP typename THIS::Iterator THIS::BeginByX2(
Idx x2)
const {
1390 #ifdef FAUDES_CHECKED
1396 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1400 TEMP typename THIS::Iterator THIS::EndByX2(
Idx x2)
const {
1401 #ifdef FAUDES_CHECKED
1407 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1411 TEMP typename THIS::Iterator THIS::BeginByX2Ev(
Idx x2,
Idx ev)
const {
1412 #ifdef FAUDES_CHECKED
1417 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1421 TEMP typename THIS::Iterator THIS::EndByX2Ev(
Idx x2,
Idx ev)
const {
1422 #ifdef FAUDES_CHECKED
1427 return THIS::ThisIterator(BASE::pSet->lower_bound(tlx));
1457 std::string label=rLabel;
1458 if(label==
"") label=BASE::Name();
1460 int oldcolumns = rTw.
Columns();
1464 for (tit = Begin(); tit != End(); ++tit) {
1465 rTw << tit->X1; rTw << tit->Ev; rTw << tit->X2;
1475 return BASE::Insert(t);
1480 FD_DC(
"TTransSet(" <<
this <<
")::Insert(" << x1 <<
"-" << ev <<
"-" << x2 <<
")");
1486 return BASE::Inject(pos,t);
1497 FD_DC(
"TTransSet(" <<
this <<
")::Erase(" << t.
Str() <<
" [t])");
1498 return BASE::Erase(t);
1503 FD_DC(
"TTransSet(" <<
this <<
")::Erase(" << x1 <<
"-" << ev <<
"-" << x2 <<
")");
1509 FD_DC(
"TTransSet(" <<
this <<
")::Erase(" << this->Str(*it) <<
" [it])");
1510 return BASE::Erase(it);
1515 FD_DC(
"TTransSet(" <<
this <<
")::EraseByX1(" << x1 <<
")");
1516 #ifdef FAUDES_CHECKED
1522 typename BASE::iterator lower, upper, it;
1525 lower = BASE::pSet->lower_bound(tl);
1526 upper = BASE::pSet->upper_bound(tu);
1527 if(this->AttributesSize()!=0)
1528 for(it=lower; it!=upper; ++it)
1529 BASE::ClrAttribute(*it);
1530 BASE::pSet->erase(lower, upper);
1535 FD_DC(
"TTransSet(" <<
this <<
")::EraseByX1Ev(" << x1 <<
"," << ev <<
")");
1536 #ifdef FAUDES_CHECKED
1541 typename BASE::iterator lower, upper, it;
1544 lower = BASE::pSet->lower_bound(tl);
1545 upper = BASE::pSet->upper_bound(tu);
1546 if(this->AttributesSize()!=0)
1547 for(it=lower; it!=upper; ++it)
1548 BASE::ClrAttribute(*it);
1549 BASE::pSet->erase(lower, upper);
1554 FD_DC(
"TTransSet(" <<
this <<
")::EraseByX2(" << x2 <<
")");
1556 bool doattr = (this->AttributesSize()!=0);
1557 typename BASE::iterator it;
1558 for(it = BASE::pSet->begin(); it != BASE::pSet->end();) {
1560 if(doattr) BASE::ClrAttribute(*it);
1561 BASE::pSet->erase(it++);
1570 FD_DC(
"TTransSet(" <<
this <<
")::EraseByEv(" << ev <<
")");
1572 bool doattr = (this->AttributesSize()!=0);
1573 typename BASE::iterator it;
1574 for(it = BASE::pSet->begin(); it != BASE::pSet->end();) {
1576 if(doattr) BASE::ClrAttribute(*it);
1577 BASE::pSet->erase(it++);
1587 FD_DC(
"TTransSet(" <<
this <<
")::EraseByX1OrX2(" << x <<
")");
1589 bool doattr = (this->AttributesSize()!=0);
1590 typename BASE::iterator it;
1591 for(it = BASE::pSet->begin(); it != BASE::pSet->end();) {
1592 if ((it->X1 == x) || (it->X2 == x)) {
1593 if(doattr) BASE::ClrAttribute(*it);
1594 BASE::pSet->erase(it++);
1599 FD_DC(
"TTransSet(" <<
this <<
")::EraseByX1OrX2(" << x <<
"): done");
1605 FD_DC(
"TTransSet(" <<
this <<
")::EraseByX1OrX2(#" << rStates.
Size() <<
")");
1607 bool doattr = (this->AttributesSize()!=0);
1608 typename BASE::iterator it=BASE::pSet->begin();
1609 while(it != BASE::pSet->end()) {
1610 if(!rStates.
Exists(it->X1) && !rStates.
Exists(it->X2)) { ++it;
continue;}
1611 if(doattr) BASE::ClrAttribute(*it);
1612 BASE::pSet->erase(it++);
1614 FD_DC(
"TTransSet(" <<
this <<
")::EraseByX1OrX2(): done");
1620 FD_DC(
"TTransSet(" <<
this <<
")::RestrictByX1AndX2(#" << rStates.
Size() <<
")");
1622 bool doattr = (this->AttributesSize()!=0);
1623 typename BASE::iterator it;
1624 it = BASE::pSet->begin();
1625 while(it != BASE::pSet->end()) {
1626 if(rStates.
Exists(it->X1) && rStates.
Exists(it->X2)) { ++it;
continue;}
1627 if(doattr) BASE::ClrAttribute(*it);
1628 BASE::pSet->erase(it++);
1630 FD_DC(
"TTransSet(" <<
this <<
")::EraseByX1OrX2(): done");
1636 FD_DC(
"TTransSet(" <<
this <<
")::RestrictEvents(#" << rEvents.
Size() <<
")");
1638 bool doattr = (this->AttributesSize()!=0);
1639 typename BASE::iterator it;
1640 it = BASE::pSet->begin();
1641 while(it != BASE::pSet->end()) {
1642 if(rEvents.
Exists(it->Ev)) { ++it;
continue;}
1643 if(doattr) BASE::ClrAttribute(*it);
1644 BASE::pSet->erase(it++);
1646 FD_DC(
"TTransSet(" <<
this <<
")::RestrictEvents(): done");
1658 return BASE::Find(t);
1663 return BASE::Exists(t);
1673 typename BASE::iterator it;
1674 for(it = BASE::pSet->begin(); it != BASE::pSet->end(); ++it) {
1675 if ((it->X1 == x) || (it->X2 == x)) {
1684 FD_DC(
"TTransSet(" <<
this <<
")::ExistsByX1Ev(" << x1 <<
"," << ev <<
")");
1685 #ifdef FAUDES_CHECKED
1690 typename BASE::iterator lower, upper, it;
1693 lower = BASE::pSet->lower_bound(tl);
1694 upper = BASE::pSet->upper_bound(tu);
1695 return lower != upper;
1700 FD_DC(
"TTransSet(" <<
this <<
")::ExistsByX1(" << x1 <<
")");
1701 #ifdef FAUDES_CHECKED
1707 typename BASE::iterator lower, upper, it;
1710 lower = BASE::pSet->lower_bound(tl);
1711 upper = BASE::pSet->upper_bound(tu);
1712 return lower != upper;
1717 TEMP template<
class OtherCmp>
1721 for (it = Begin(); it != End(); ++it) {
1730 for (it=Begin(); it!=End(); ++it) {
1739 #ifdef FAUDES_CHECKED
1747 while (it != it_end) {
1756 #ifdef FAUDES_CHECKED
1762 StateSet::Iterator sit= rX1Set.
Begin();
1763 StateSet::Iterator sit_end= rX1Set.
End();
1764 for(;sit!=sit_end; ++sit) {
1767 while(tit!=tit_end) {
1777 #ifdef FAUDES_CHECKED
1784 while (it != it_end) {
1793 #ifdef FAUDES_CHECKED
1798 if(rEvSet.
Empty())
return states;
1799 StateSet::Iterator sit= rX1Set.
Begin();
1800 StateSet::Iterator sit_end= rX1Set.
End();
1801 for(;sit!=sit_end; ++sit) {
1802 EventSet::Iterator eit= rEvSet.
Begin();
1803 EventSet::Iterator eit_end= rEvSet.
End();
1806 while(tit!=tit_end) {
1808 if(tit->Ev == *eit) {
1814 if(tit->Ev < *eit) {
1820 if(eit==eit_end)
break;
1832 for (; it != it_end; ++it) {
1840 return rTrans.
Str();
1859 #define THIS TaTransSet<Attr>
1860 #define TEMP template <class Attr>
1861 #define BASE TTransSet<TransSort::X1EvX2>
1862 #define ABASE TAttrMap<Transition,Attr,TransSort::X1EvX2>
1872 FD_DC(
"TaTransSet(" <<
this <<
")::TaTransSet()");
1880 FD_DC(
"TaTransSet(" <<
this <<
")::TaTransSet(rOtherSet "<< &rOtherSet <<
")");
1890 FD_DC(
"TaTransSet(" <<
this <<
")::TaTransSet(rOtherSet "<< &rOtherSet <<
")");
1898 BASE::DoAssign(rSourceSet);
1903 FD_DC(
"TaTransSet(" <<
this <<
")::Assign([v] " << &rSourceSet<<
")");
1904 #ifdef FAUDES_CHECKED
1905 FD_DC(
"TaTransSet(" <<
this <<
")::Assign(): src at " << &rSourceSet);
1906 FD_DC(
"TaTransSet(" <<
this <<
")::Assign(): src type " <<
typeid(rSourceSet).name());
1907 FD_DC(
"TaTransSet(" <<
this <<
")::Assign(): dst type " <<
typeid(*this).name());
1910 std::stringstream errstr;
1911 errstr <<
"cannot cast " <<
typeid(rSourceSet).name() <<
" to TransSet" << std::endl;
1912 throw Exception(
"TaTransSet::Assign", errstr.str(), 67);
1916 ABASE::AssignWithAttributes(rSourceSet);
1924 FD_DC(
"TaTransSet(" <<
this <<
")::Insert(" << t.
Str() <<
")");
1925 return ABASE::Insert(t);
1930 FD_DC(
"TaTransSet(" <<
this <<
")::Insert(" << x1 <<
"-" << ev <<
"-" << x2 <<
")");
1932 return ABASE::Insert(t);
1937 return ABASE::Insert(t,attr);
1943 FD_DC(
"TaTransSet(" <<
this <<
")::InsertSet( [a] " << &rOtherSet <<
")");
1944 ABASE::InsertSet(rOtherSet);
1949 #ifdef FAUDES_CHECKED
1950 FD_DC(
"TaTransSet(" <<
this <<
")::InsertSet(" << rOtherSet.
ToString() <<
")");
1953 std::stringstream errstr;
1954 errstr <<
"cannot cast " <<
typeid(rOtherSet).name() <<
" to TransSet" << std::endl;
1955 throw Exception(
"TaTransSet::InsertSet", errstr.str(), 67);
1958 ABASE::InsertSet(rOtherSet);
1964 return ABASE::Erase(t);
1969 FD_DC(
"TaTransSet(" <<
this <<
")::Erase(" << x1 <<
"-" << ev <<
"-" << x2 <<
")");
1971 return ABASE::Erase(t);
1976 #ifdef FAUDES_CHECKED
1978 std::stringstream errstr;
1979 errstr <<
"iterator out of range " << std::endl;
1980 throw Exception(
"TTransSet::Erase", errstr.str(), 69);
1983 return ABASE::Erase(it);
1988 FD_DC(
"TaTransSet(" <<
this <<
")::RestrictSet( [a] " << &rOtherSet <<
")");
1989 ABASE::EraseSet(rOtherSet);
1994 #ifdef FAUDES_CHECKED
1995 FD_DC(
"TaTransSet(" <<
this <<
")::EraseSet(" << rOtherSet.
ToString() <<
")");
1998 std::stringstream errstr;
1999 errstr <<
"cannot cast " <<
typeid(rOtherSet).name() <<
" to TransSet" << std::endl;
2000 throw Exception(
"TaTransSet::EraseSet", errstr.str(), 67);
2003 ABASE::EraseSet(rOtherSet);
2008 FD_DC(
"TaTransSet(" <<
this <<
")::RestrictSet( [a] " << &rOtherSet <<
")");
2009 ABASE::RestrictSet(rOtherSet);
2015 #ifdef FAUDES_CHECKED
2016 FD_DC(
"TaTransSet(" <<
this <<
")::RestrictSet(" << rOtherSet.
ToString() <<
")");
2019 std::stringstream errstr;
2020 errstr <<
"cannot cast " <<
typeid(rOtherSet).name() <<
" to TransSet" << std::endl;
2021 throw Exception(
"TaTransSet::RestrictSet", errstr.str(), 67);
2024 ABASE::RestrictSet(rOtherSet);
2034 #undef SORT_EXECPTION
Classes IndexSet, TaIndexSet.
Classes NameSet, TaNameSet.
#define FAUDES_TYPE_DECLARATION(ftype, ctype, cbase)
#define FAUDES_TYPE_TIMPLEMENTATION(ftype, ctype, cbase, ctemp)
bool Exists(const Idx &rIndex) const
SymbolTable * SymbolTablep(void) const
bool Insert(const Idx &rIndex)
const Attr & Attribute(const T &rElem) const
Attr * Attributep(const T &rElem)
void AttributeTry(const T &rElem, const Type &attr)
const Attr * AttributeType(void) const
Iterator EndByEvX2(Idx ev, Idx x2) const
Iterator Begin(void) const
bool ExistsByX1OrX2(Idx x) const
bool Insert(Idx x1, Idx ev, Idx x2)
Iterator Find(Idx x1, Idx ev, Idx x2) const
bool Erase(Idx x1, Idx ev, Idx x2)
Iterator Find(const Transition &t) const
Iterator BeginByX2Ev(Idx x2, Idx ev) const
Iterator Begin(Idx x1) const
virtual void DoWrite(TokenWriter &rTw, const std::string &rLabel="", const Type *pContext=0) const
EventSet ActiveEvents(Idx x1, SymbolTable *pSymTab=NULL) const
Iterator Begin(Idx x1, Idx ev) const
StateSet SuccessorStates(const StateSet &rX1Set) const
TTransSet(const TTransSet< Cmp > &rOtherSet)
bool Exists(const Transition &t) const
Iterator BeginByEvX1(Idx ev, Idx x1) const
Iterator End(Idx x1, Idx ev) const
StateSet SuccessorStates(Idx x1, Idx ev) const
void RestrictStates(const StateSet &rStateSet)
Iterator EndByEv(Idx ev) const
Iterator EndByEvX1(Idx ev, Idx x1) const
Iterator EndByX2Ev(Idx x2, Idx ev) const
StateSet States(void) const
Iterator BeginByX2(Idx x2) const
TTransSet(const TTransSet< OtherCmp > &res)
void EraseByX1Ev(Idx x1, Idx ev)
Iterator BeginByEv(Idx ev) const
bool Insert(const Transition &rTransition)
Iterator EndByX2(Idx x2) const
bool ExistsByX1Ev(Idx x1, Idx ev) const
Iterator Inject(const Iterator &pos, const Transition &rTransition)
bool Exists(Idx x1, Idx ev, Idx x2) const
Iterator Erase(const Iterator &it)
void DoAssign(const TTransSet &rSource)
void Inject(const Transition &rTransition)
bool Erase(const Transition &t)
StateSet SuccessorStates(Idx x1) const
void EraseByX1OrX2(const StateSet &rStates)
void RestrictEvents(const EventSet &rEventSet)
void EraseByX1OrX2(Idx x)
TBaseSet< Transition, Cmp >::Iterator Iterator
Iterator End(Idx x1) const
StateSet SuccessorStates(const StateSet &rX1Set, const EventSet &rEvSet) const
std::string Str(const Transition &rTrans) const
void ReSort(TTransSet< OtherCmp > &res) const
bool ExistsByX1(Idx x1) const
Iterator BeginByEvX2(Idx ev, Idx x2) const
virtual TaTransSet & Assign(const TBaseSet< Transition, TransSort::X1EvX2 > &rSrc)
virtual TaTransSet & operator=(const TransSet &rSrc)
Attr * Attributep(const Transition &rElem)
TTransSet< TransSort::X1EvX2 >::Iterator Iterator
void DoAssign(const TaTransSet &rSource)
void AttributeTry(const Transition &rElem, const Type &rAttr)
void Attribute(const Transition &rElem, const Attr &rAttr)
const Attr * AttributeType(void) const
void Attribute(const Transition &rElem, const Type &rAttr)
const Attr & Attribute(const Transition &rElem) const
void WriteEnd(const std::string &rLabel)
void WriteBegin(const std::string &rLabel)
Transition(Idx x1, Idx ev, Idx x2)
std::string Str(void) const
std::string ToString(const std::string &rLabel="", const Type *pContext=0) const
virtual Type & Assign(const Type &rSrc)
TTransSet< TransSort::EvX2X1 > TransSetEvX2X1
TTransSet< TransSort::X1EvX2 > TransSetX1EvX2
bool Exists(const T &rElem) const
TTransSet< TransSort::X1EvX2 > TransSet
TTransSet< TransSort::X2EvX1 > TransSetX2EvX1
TTransSet< TransSort::X1X2Ev > TransSetX1X2Ev
virtual void RestrictSet(const TBaseSet &rOtherSet)
virtual void InsertSet(const TBaseSet &rOtherSet)
Iterator Begin(void) const
TTransSet< TransSort::EvX1X2 > TransSetEvX1X2
TTransSet< TransSort::X2X1Ev > TransSetX2X1Ev
virtual void EraseSet(const TBaseSet &rOtherSet)
std::string ToStringInteger(Int number)