Skip to content
Snippets Groups Projects
Commit e6517f79 authored by Martin Hanzik's avatar Martin Hanzik Committed by Jan Trávníček
Browse files

Better overload validation

parent 83501254
No related branches found
No related tags found
No related merge requests found
...@@ -15,6 +15,10 @@ Algorithm::Algorithm(std::string fullName) ...@@ -15,6 +15,10 @@ Algorithm::Algorithm(std::string fullName)
} }
   
uint8_t Algorithm::getInputCount() const { uint8_t Algorithm::getInputCount() const {
if (this->overloads.empty()) {
throw std::runtime_error { std::string("Input count has not yet been determined for algorithm ") + this->fullName };
}
return static_cast<uint8_t>(this->overloads[0].parameterTypes.size()); return static_cast<uint8_t>(this->overloads[0].parameterTypes.size());
} }
   
...@@ -26,6 +30,24 @@ void Algorithm::addOverload(Algorithm::Overload overload) { ...@@ -26,6 +30,24 @@ void Algorithm::addOverload(Algorithm::Overload overload) {
this->overloads.push_back(overload); this->overloads.push_back(overload);
} }
   
bool Algorithm::canAddOverload(const Algorithm::Overload& overload) {
for (const auto& paramType: overload.parameterTypes) {
if (paramType != "automaton::NFA<object::Object, object::Object>" && paramType != "automaton::DFA<object::Object, object::Object>") {
return false;
}
}
if (overload.returnType != "automaton::NFA<object::Object, object::Object>" && overload.returnType != "automaton::DFA<object::Object, object::Object>") {
return false;
}
if (this->overloads.empty()) {
return true;
}
return this->overloads.back().parameterTypes.size() == overload.parameterTypes.size();
}
std::string Algorithm::getPrettyName() const { std::string Algorithm::getPrettyName() const {
std::string eps = u8"\u03B5"; std::string eps = u8"\u03B5";
static std::map<std::string, std::string> prettyNames = { static std::map<std::string, std::string> prettyNames = {
......
...@@ -22,6 +22,7 @@ public: ...@@ -22,6 +22,7 @@ public:
   
private: private:
void addOverload(Overload overload); void addOverload(Overload overload);
bool canAddOverload(const Overload& overload);
   
std::string name; std::string name;
std::string fullName; std::string fullName;
......
...@@ -18,9 +18,18 @@ void Registry::initialize() { ...@@ -18,9 +18,18 @@ void Registry::initialize() {
paramNames.push_back(std::get<0>(param)); paramNames.push_back(std::get<0>(param));
} }
   
algorithm->addOverload({ resultType, paramNames }); Algorithm::Overload _overload { resultType, paramNames };
if (!algorithm->canAddOverload(_overload)) {
continue;
}
algorithm->addOverload(_overload);
} }
   
if (algorithm->overloads.empty())
continue;
in.algorithms[name] = std::move(algorithm); in.algorithms[name] = std::move(algorithm);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment