9 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__AUTFILEDESCRIPTOR__HH__ 10 #define __DIADES__AUTOMATA__EXPERIMENTAL__AUTFILEDESCRIPTOR__HH__ 23 namespace Experimental
32 template<
typename EventType>
37 EventType & event)
const 40 return stream.good() || stream.eof();
55 std::string & evtLabel)
const 69 template<
typename EventType>
74 const EventType & event)
const 94 const std::string & event)
const 106 stream <<
"\"" <<
event <<
"\"";
108 return stream.good();
144 template<
typename _Event>
178 _source(source), _event(event), _target(target)
190 return _source = source;
211 return _event = event;
232 return _target = target;
252 return source() == transition.
source() && target() == transition.
target()
253 && event() == transition.
event();
265 auto result = source() < transition.
source();
268 if(source() == transition.
source())
270 result = target() < transition.
target();
273 if(target() == transition.
target())
275 result = event() < transition.
event();
380 State initialState = 0;
381 size_t nbTransitions = 0;
384 autFileHeader(stream, initialState, nbTransitions, _nbStates, ok);
387 std::cout <<
"autFileHeader pb\n";
392 while(numberOfTransitions() != nbTransitions)
397 autFileTransition(stream, source, label, target, ok);
400 std::cout <<
"reading transition pb\n";
404 if(source >= _nbStates)
406 std::cout <<
"source " << source <<
" >= " << _nbStates <<
" \n";
409 if(target >= _nbStates)
411 std::cout <<
"target " << target <<
" >= " << _nbStates <<
" \n";
414 addTransition(
Transition(source, label, target));
427 if(numberOfStates() == 0)
431 stream <<
"des(0," << numberOfTransitions() <<
"," << numberOfStates() <<
")\n";
432 std::for_each(transBegin(), transEnd(),
435 stream <<
"(" << t.source()
438 stream <<
"," << t.target()
468 return _nbStates = nbStates;
478 return _transitions.size();
488 return _transitions.begin();
498 return _transitions.end();
507 std::pair<AutFileDescriptor::TransitionIterator, bool>
510 return _transitions.emplace(transition);
523 auto it = _transitions.find(transition);
524 if(it == _transitions.end())
528 return _transitions.erase(it);
539 _transitions.clear();
550 return _initials.begin();
560 return _initials.end();
569 std::pair<InitialIterator, bool>
572 return _initials.insert(s);
582 return _initials.size();
607 std::stringstream sstreamLabel;
608 sstreamLabel << betweenFirstAndLastComma;
621 std::size_t index = 0;
622 while(std::isblank(beforeFirstComma.at(index)))
626 if(beforeFirstComma.at(index) !=
'(')
628 std::cout <<
"autFileSourceState: no '(' \n";
632 while(std::isblank(beforeFirstComma.at(index)))
636 std::string sourceState;
637 if(!std::isdigit(beforeFirstComma.at(index)))
639 std::cout <<
"autFileSourceState: found character " << beforeFirstComma.at(index) <<
"\n";
640 std::cout <<
"autFileSourceState: no digit after '( ' \n";
643 while(index < beforeFirstComma.size() && (std::isdigit(beforeFirstComma.at(index))))
645 sourceState += beforeFirstComma.at(index);
648 if(index < beforeFirstComma.size())
652 if(!std::isblank(beforeFirstComma.at(index)))
654 std::cout <<
"autFileSourceState: strange character after '( digits ' \n";
659 while(index < beforeFirstComma.size());
661 std::stringstream sstream;
662 sstream << sourceState;
677 std::string targetState;
679 while(std::isblank(afterLastComma.at(index)))
683 if(!std::isdigit(afterLastComma.at(index)))
685 std::cout <<
"autFileTargetState: no digit after blanks\n";
688 while(index < afterLastComma.size() && (std::isdigit(afterLastComma.at(index))))
690 targetState += afterLastComma.at(index);
693 while(std::isblank(afterLastComma.at(index)))
697 if(afterLastComma.at(index) !=
')')
699 std::cout <<
"autFileTargetState: no ')'\n";
702 while(std::isblank(afterLastComma.at(index)))
706 std::stringstream sstream;
707 sstream << targetState;
730 std::string transline;
731 ok = std::getline(stream, transline).good();
734 std::cout <<
"autFileTransition: readline pb\n";
737 std::size_t firstComma = transline.find_first_of(
",");
738 ok = firstComma != std::string::npos;
741 std::cout <<
"autFileTransition: no comma's\n";
744 std::size_t lastComma = transline.find_last_of(
",");
745 ok = firstComma != lastComma;
748 std::cout <<
"autFileTransition: only one comma \n";
752 ok = autFileSourceState(transline.substr(0, firstComma), source);
755 std::cout <<
"autFileTransition: reading source state\n";
760 ok = autFileTransitionEvent(transline.substr(firstComma + 1, lastComma - firstComma - 1), event);
763 std::cout <<
"autFileTransition: reading label\n";
767 ok = autFileTargetState(transline.substr(lastComma + 1), target);
770 std::cout <<
"autFileTransition: reading target state\n";
795 State & initialState,
796 size_t & numberOfTransitions,
797 size_t & numberOfStates,
808 std::string headerLine;
809 std::getline(stream, headerLine);
810 std::stringstream stream2;
811 stream2 << headerLine;
816 std::cout <<
"AutFileHeader: not reading ' character'\n";
820 ok = (stream2 >> c).good();
823 std::cout <<
"AutFileHeader: not reading ' d'\n";
829 std::cout <<
"AutFileHeader: not reading ' de'\n";
832 ok = (stream2 >> c).good();
840 std::cout <<
"AutFileHeader: not reading ' des'\n";
846 std::cout <<
"AutFileHeader: not reading ' des character'\n";
852 std::cout <<
"AutFileHeader: not reading ' des ('\n";
859 ok = (stream2 >> initialState).good();
862 std::cout <<
"AutFileHeader: not reading ' des ( digit'\n";
866 ok = (comma1 ==
',');
869 std::cout <<
"AutFileHeader: not reading ' des ( digit,'\n";
870 std::cout <<
"comma1 = " << comma1 <<
"\n";
874 ok = (stream2 >> numberOfTransitions).good();
877 std::cout <<
"AutFileHeader: not reading ' des ( digit,digit'\n";
881 ok = (comma2 ==
',');
884 std::cout <<
"AutFileHeader: not reading ' des ( digit,digit,'\n";
885 std::cout <<
"comma2 = " << comma2 <<
"\n";
888 ok = (stream2 >> numberOfStates).good();
891 std::cout <<
"AutFileHeader: not reading ' des ( digit,digit,digit'\n";
895 ok = (rightParen ==
')');
898 std::cout <<
"AutFileHeader: not reading ' des ( digit, digit, digit )'\n";
899 std::cout <<
"rightParen = " << rightParen <<
"\n";
905 std::cout <<
"AutFileHeader: not reading ' des ( digit, digit, digit ) '\n";
906 std::cout <<
"AutFileHeader: found character " << c <<
"\n";
909 ok = (initialState == 0) && (numberOfStates > 0);
912 std::cout <<
"AutFileHeader: initialstate = " 915 <<
"numberOfStates = " bool operator()(std::ostream &stream, const std::string &event) const
Diades::Graph::Edge Transition
size_t setNumberOfStates(size_t nbStates)
bool autFileSourceState(const std::string &beforeFirstComma, State &source)
typename std::set< State >::iterator InitialIterator
bool operator()(std::ostream &stream, const EventType &event) const
size_t numberOfStates() const
const Event & setEvent(const Event &event)
ConstTransitionIterator transBegin() const
std::istream & autFileTransition(std::istream &stream, State &source, Event &event, State &target, bool &ok)
size_t numberOfTransitions() const
std::set< State > _initials
bool operator<(const Transition &transition) const
ConstInitialIterator initialEnd() const
ConstTransitionIterator transEnd() const
TransitionIterator removeTransition(const Transition &transition)
Transition(State source, Event event, State target)
bool autFileTargetState(const std::string &afterLastComma, State &target)
std::pair< InitialIterator, bool > setInitial(State s)
bool readLabel(std::basic_istream< CharT > &stream, std::basic_string< CharT, Traits, Alloc > &label)
bool operator()(std::istream &stream, EventType &event) const
const Event & event() const
Namespace of the Diades project.
State setSource(State source)
bool operator==(const Transition &transition) const
virtual bool toStream(std::ostream &stream)
bool autFileTransitionEvent(const std::string &betweenFirstAndLastComma, Event &event)
std::istream & autFileHeader(std::istream &stream, State &initialState, size_t &numberOfTransitions, size_t &numberOfStates, bool &ok)
size_t numberOfInitialStates() const
virtual bool readStream(std::istream &stream)
typename std::set< State >::const_iterator ConstInitialIterator
std::pair< AutFileDescriptor::TransitionIterator, bool > addTransition(Transition &&transition)
bool readChars(std::basic_istream< CharT > &is, const std::unordered_set< CharT > &characters, CharT &next)
ConstInitialIterator initialBegin() const
bool operator()(std::istream &stream, std::string &evtLabel) const
std::set< Transition > _transitions
State setTarget(State target)
typename std::set< Transition >::const_iterator ConstTransitionIterator
typename std::set< Transition >::iterator TransitionIterator