16 #include<boost/program_options.hpp> 23 #include"../AutomataInterface.hh" 32 namespace Poptions = boost::program_options;
40 const string program(
"dd-synchronize");
56 Poptions::options_description & desc,
57 Poptions::variables_map & vm)
60 (
"help,h",
"produce help message")
61 (
"file,f", Poptions::value< std::vector<string> >(),
"automaton files (.ddaut format)")
62 (
"output,o", Poptions::value< string >(),
"outfile name (.ddaut format)")
63 (
"rules,r", Poptions::value<string>(),
"synchronisation rule file (.ddsync)")
65 Poptions::positional_options_description p;
68 Poptions::store(Poptions::command_line_parser(argc, argv).
options(desc).positional(p).run(), vm);
87 synchroniseDdAut(
const std::vector<std::string> & fileNames,
const std::string & rulesName,
88 const std::string & output)
91 DdAutParamSynchro synchro;
92 std::vector<DdAutFA> automata;
93 std::vector<Ptr<DdAutFA>::ConstP> components;
94 std::vector<DdAutStateManager> stateManagers;
95 std::vector<Ptr<DdAutStateManager>::ConstP> pstateManagers;
96 std::vector<DdAutEventManager> eventManagers;
97 automata.reserve(fileNames.size());
98 stateManagers.reserve(fileNames.size());
99 eventManagers.reserve(fileNames.size());
100 auto it = fileNames.begin();
101 while(it != fileNames.end())
103 ifstream file(it->c_str());
106 automata.emplace_back();
107 stateManagers.emplace_back();
109 eventManagers.emplace_back();
115 stateManagers.back(),
116 eventManagers.back())))
120 automata.back().setId(automata.size());
131 ifstream rulefile(rulesName.c_str());
132 if(!rulefile.is_open())
137 std::string errorMsg;
138 if(!descriptor.
readStream(rulefile, errorMsg))
141 % rulesName % errorMsg);
144 if(!synchro.init(components))
146 return printCommandLineError(
Msg(
"Error when initialising the synchronisation rules with the set of loaded automata"));
150 return printCommandLineError(
Msg(
"Error when setting the synchronisation rules with respect to the set of loaded automata: \n errors are %1%")
168 std::vector<std::string> names;
169 std::for_each(automata.begin(), automata.end(), [&](
const DdAutFA & automaton)
171 names.push_back(automaton.name()); });
194 synchroniseFsm(
const std::vector<std::string> & fileNames,
const std::string & rulesName,
195 const std::string & output)
197 if(fileNames.empty())
199 return printCommandLineError(
Msg(
"Expecting a list of filenames but I did not get anything. Use dd-synchronize --help for documentation."));
202 std::for_each(fileNames.begin(), fileNames.end(),
203 [&](
const string & name)
210 return printCommandLineError(
Msg(
"Expecting a list of filenames with a name ending with .ddaut: check in the following list %1%")
211 %
toStream(fileNames.begin(), fileNames.end()));
213 if(rulesName.empty())
215 return printCommandLineError(
Msg(
"No file with synchronisation rules have been found. Use dd-synchronize --help for documentation."));
219 return printCommandLineError(
Msg(
"The synchronisation file does not have a 'ddsync' suffix. I read %1%. Use dd-synchronize --help for documentation.") % rulesName);
244 std::string rulesName, output;
245 std::vector<std::string> fileNames;
248 Poptions::options_description desc(
"Options");
249 Poptions::variables_map vm;
257 fileNames = vm[
"file"].as<std::vector < std::string >> ();
259 if(vm.count(
"output"))
261 output = vm[
"output"].as<std::string>();
263 if(vm.count(
"rules"))
265 rulesName = vm[
"rules"].as<std::string > ();
269 catch(Poptions::required_option & e)
273 catch(Poptions::error & e)
bool synchronize(const std::vector< typename Ptr< Fsm >::ConstP > &components, const SynchronisationRules< Fsm > &rules, Fsm &synchronisation, StateCreator &creator)
StatePropertyManager< DdAutStateLabel, DdAutStateId > DdAutStateManager
virtual bool readStream(std::istream &stream, std::string &error)
size_t writeFiniteAutomaton(const Diades::Automata::Experimental::ConstManagedDdAutFA &mfa, const std::string &output, const FileSuffixes &suffixes)
size_t synchroniseFsm(const std::vector< std::string > &fileNames, const std::string &rulesName, const std::string &output)
bool descriptorToRules(const DdSyncDescriptor &desc, ParametrizedSynchronisation< DdAutFsmType > &rules, std::string &errorMsg)
const size_t ERROR_UNHANDLED_EXCEPTION
size_t printCommandLineError(const string &msg)
void initialiseOptions(int argc, char *argv[], Poptions::options_description &desc, Poptions::variables_map &vm)
_NullStatePropertyId NullStatePropertyId
data structure that gathers an FA, a StateManager and a EventManager
bool faFromDdAutFile(std::istream &stream, const ManagedDdAutFA &mFa)
vector< string > options(numberOfOptions)
const string program("dd-synchronize")
bool generateSynchronisedDdAutEventLabels(const SynchronisationRules< DdAutFsmType > &synchro, const std::vector< DdAutEventManager > &eventManagers, DdAutEventManager &syncEventManager)
_StatePropertyId StatePropertyId
bool match(const std::string &fileName, const std::string &suffix) const
_InputSymbolId InputSymbolId
const string & setName(const string &name)
size_t synchroniseDdAut(const std::vector< std::string > &fileNames, const std::string &rulesName, const std::string &output)
Diades::Utils::ToStream< InputIterator, Diades::Utils::AlwaysTrue< typename InputIterator::reference > > toStream(InputIterator first, InputIterator last)
int main(int argc, char **argv)
FileSuffixes suffixes({"ddaut", "ddsync"})
EventManager< DdAutEventLabel, DdAutEventId > DdAutEventManager
Diades::Utils::Conjunction< DdAutEventLabel, DdAutAmpersand, Diades::Utils::NoDelimiter< char, std::char_traits< char >, std::allocator< char > >> DdAutSynchronisation
StateMachine< DdAutStateId, DdAutEventId > DdAutFsm
typename IM::Info StateProperty
_NullInputSymbolId NullInputSymbolId
void printUsage(const po::options_description &desc)