From 355bd3cf0029d632c4985b5729796054f86b0025 Mon Sep 17 00:00:00 2001 From: Franck Dary <franck.dary@lis-lab.fr> Date: Thu, 2 Jan 2020 17:13:44 +0100 Subject: [PATCH] Added classes ReadingMachine and Classifier, and started to implement their constructors --- common/include/util.hpp | 3 +++ common/src/util.cpp | 12 +++++++++ dev/src/dev.cpp | 9 ++++--- reading_machine/include/Classifier.hpp | 19 +++++++++++++ reading_machine/include/ReadingMachine.hpp | 19 +++++++++++++ reading_machine/src/Classifier.cpp | 8 ++++++ reading_machine/src/ReadingMachine.cpp | 31 ++++++++++++++++++++++ reading_machine/src/Transition.cpp | 14 +--------- reading_machine/src/TransitionSet.cpp | 2 ++ 9 files changed, 100 insertions(+), 17 deletions(-) create mode 100644 reading_machine/include/Classifier.hpp create mode 100644 reading_machine/include/ReadingMachine.hpp create mode 100644 reading_machine/src/Classifier.cpp create mode 100644 reading_machine/src/ReadingMachine.cpp diff --git a/common/include/util.hpp b/common/include/util.hpp index 694316c..4afb1c6 100644 --- a/common/include/util.hpp +++ b/common/include/util.hpp @@ -18,6 +18,7 @@ #include <vector> #include <array> #include <unordered_map> +#include <regex> #include <experimental/source_location> #include <boost/flyweight.hpp> #include "fmt/core.h" @@ -76,6 +77,8 @@ bool isEmpty(const boost::flyweight<T> & s) return isEmpty(s.get()); } +bool doIfNameMatch(const std::regex & reg, const std::string & name, const std::function<void(const std::smatch &)> & f); + }; template <> diff --git a/common/src/util.cpp b/common/src/util.cpp index 8214980..5c02379 100644 --- a/common/src/util.cpp +++ b/common/src/util.cpp @@ -114,5 +114,17 @@ std::string int2HumanStr(int number) return result; } +bool doIfNameMatch(const std::regex & reg, const std::string & name, const std::function<void(const std::smatch &)> & f) +{ + std::smatch sm; + std::regex_match(name, sm, reg); + if (sm.empty()) + return false; + + f(sm); + + return true; +}; + }; diff --git a/dev/src/dev.cpp b/dev/src/dev.cpp index 7888809..d33d370 100644 --- a/dev/src/dev.cpp +++ b/dev/src/dev.cpp @@ -4,13 +4,11 @@ #include "BaseConfig.hpp" #include "SubConfig.hpp" #include "TransitionSet.hpp" +#include "ReadingMachine.hpp" int main(int argc, char * argv[]) { - TransitionSet ts(argv[1]); - - return 0; - + /* BaseConfig goldConfig(argv[3], argv[1], argv[2]); SubConfig config(goldConfig); @@ -24,6 +22,9 @@ int main(int argc, char * argv[]) fmt::print(stderr, "ok\n"); std::scanf("%*c"); + */ + + ReadingMachine machine(argv[1]); return 0; } diff --git a/reading_machine/include/Classifier.hpp b/reading_machine/include/Classifier.hpp new file mode 100644 index 0000000..24cc9aa --- /dev/null +++ b/reading_machine/include/Classifier.hpp @@ -0,0 +1,19 @@ +#ifndef CLASSIFIER__H +#define CLASSIFIER__H + +#include <string> +#include "TransitionSet.hpp" + +class Classifier +{ + private : + + std::string name; + std::unique_ptr<TransitionSet> transitionSet; + + public : + + Classifier(const std::string & name, const std::string & topology, const std::string & tsFile); +}; + +#endif diff --git a/reading_machine/include/ReadingMachine.hpp b/reading_machine/include/ReadingMachine.hpp new file mode 100644 index 0000000..7a37a0c --- /dev/null +++ b/reading_machine/include/ReadingMachine.hpp @@ -0,0 +1,19 @@ +#ifndef READING_MACHINE__H +#define READING_MACHINE__H + +#include <memory> +#include "Classifier.hpp" + +class ReadingMachine +{ + private : + + std::string name; + std::unique_ptr<Classifier> classifier; + + public : + + ReadingMachine(const std::string & filename); +}; + +#endif diff --git a/reading_machine/src/Classifier.cpp b/reading_machine/src/Classifier.cpp new file mode 100644 index 0000000..29791a5 --- /dev/null +++ b/reading_machine/src/Classifier.cpp @@ -0,0 +1,8 @@ +#include "Classifier.hpp" + +Classifier::Classifier(const std::string & name, const std::string & topology, const std::string & tsFile) +{ + this->name = name; + this->transitionSet.reset(new TransitionSet(tsFile)); +} + diff --git a/reading_machine/src/ReadingMachine.cpp b/reading_machine/src/ReadingMachine.cpp new file mode 100644 index 0000000..9160a89 --- /dev/null +++ b/reading_machine/src/ReadingMachine.cpp @@ -0,0 +1,31 @@ +#include "ReadingMachine.hpp" +#include "util.hpp" + +ReadingMachine::ReadingMachine(const std::string & filename) +{ + std::regex nameRegex("Name : (.+)[\n]"); + std::regex classifierRegex("Classifier : (.+) (.+) (.+)[\n]"); + + std::FILE * file = std::fopen(filename.c_str(), "r"); + + char buffer[1024]; + while (!std::feof(file)) + { + if (buffer != std::fgets(buffer, 1024, file)) + break; + + try + { + if (util::doIfNameMatch(nameRegex, buffer, [this](auto sm){name = sm[1];})) + continue; + if (util::doIfNameMatch(classifierRegex, buffer, [this](auto sm) + { + classifier.reset(new Classifier(sm[1], sm[2], sm[3])); + })) + continue; + } catch(std::exception & e) {util::myThrow(fmt::format("during reading of '{}' : {}", filename, e.what()));} + } + + std::fclose(file); +} + diff --git a/reading_machine/src/Transition.cpp b/reading_machine/src/Transition.cpp index e646605..b0ced36 100644 --- a/reading_machine/src/Transition.cpp +++ b/reading_machine/src/Transition.cpp @@ -7,22 +7,10 @@ Transition::Transition(const std::string & name) std::regex writeRegex("WRITE ([bs])\\.(.+) (.+) (.+)"); - auto doIfNameMatch = [name](auto & reg, auto init) - { - std::smatch sm; - std::regex_match(name, sm, reg); - if (sm.empty()) - return false; - - init(sm); - - return true; - }; - try { - if (doIfNameMatch(writeRegex, [this](auto sm){initWrite(sm[3], sm[1], sm[2], sm[4]);})) + if (util::doIfNameMatch(writeRegex, name, [this](auto sm){initWrite(sm[3], sm[1], sm[2], sm[4]);})) return; throw std::invalid_argument("no match"); diff --git a/reading_machine/src/TransitionSet.cpp b/reading_machine/src/TransitionSet.cpp index fbee4f5..1bf42b1 100644 --- a/reading_machine/src/TransitionSet.cpp +++ b/reading_machine/src/TransitionSet.cpp @@ -3,6 +3,8 @@ TransitionSet::TransitionSet(const std::string & filename) { FILE * file = std::fopen(filename.c_str(), "r"); + if (!file) + util::myThrow(fmt::format("cannot open file '{}'", filename)); char readBuffer[1024]; -- GitLab