1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker f2a1c4e389 Squashed 'software/mza/' content from commit f970a59b17
git-subtree-dir: software/mza
git-subtree-split: f970a59b177c13ca3dd8aaef8cc6681d83b7e813
2021-07-11 16:34:30 +10:00

175 lines
5.1 KiB
C++

/* -*- mode: C++; c-basic-offOptions::set: 2; indent-tabs-mode: nil -*- */
/*
* Main authors:
* Guido Tack <guido.tack@monash.edu>
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <minizinc/options.hh>
#include <unordered_map>
namespace MiniZinc {
Expression* Options::getParam(const std::string& name) const {
std::unordered_map<std::string, KeepAlive>::const_iterator it = _options.find(name);
if (it == _options.end()) {
std::stringstream ss;
ss << "Could not find option: \"" << name << "\"." << std::endl;
throw InternalError(ss.str());
}
return (it->second)();
}
void Options::setIntParam(const std::string& name, KeepAlive ka) {
Expression* e = ka();
if (e && e->type().ispar() && e->type().isint()) {
_options[name] = ka;
} else {
std::stringstream ss;
ss << "For option: " << name << " expected Par Int, received " << e->type().nonEnumToString()
<< std::endl;
throw InternalError(ss.str());
}
}
void Options::setFloatParam(const std::string& name, KeepAlive ka) {
Expression* e = ka();
if (e && e->type().ispar() && e->type().isfloat()) {
_options[name] = ka;
} else {
std::stringstream ss;
ss << "For option: " << name << " expected Par Float, received " << e->type().nonEnumToString()
<< std::endl;
throw InternalError(ss.str());
}
}
void Options::setBoolParam(const std::string& name, KeepAlive ka) {
Expression* e = ka();
if (e && e->type().ispar() && e->type().isbool()) {
_options[name] = ka;
} else {
std::stringstream ss;
ss << "For option: " << name << " expected Par Bool, received " << e->type().nonEnumToString()
<< std::endl;
throw InternalError(ss.str());
}
}
void Options::setStringParam(const std::string& name, KeepAlive ka) {
Expression* e = ka();
if (e && e->type().ispar() && e->type().isstring()) {
_options[name] = ka;
} else {
std::stringstream ss;
ss << "For option: " << name << " expected Par String, received " << e->type().nonEnumToString()
<< std::endl;
throw InternalError(ss.str());
}
}
void Options::setIntParam(const std::string& name, long long int e) {
GCLock lock;
IntLit* il = IntLit::a(e);
KeepAlive ka(il);
setIntParam(name, ka);
};
void Options::setFloatParam(const std::string& name, double e) {
GCLock lock;
FloatLit* fl = FloatLit::a(e);
KeepAlive ka(fl);
setFloatParam(name, ka);
}
void Options::setBoolParam(const std::string& name, bool e) {
KeepAlive ka(constants().boollit(e));
setBoolParam(name, ka);
}
void Options::setStringParam(const std::string& name, std::string e) {
GCLock lock;
StringLit* sl = new StringLit(Location(), e);
KeepAlive ka(sl);
setStringParam(name, ka);
}
long long int Options::getIntParam(const std::string& name) const {
if (IntLit* il = getParam(name)->dyn_cast<IntLit>()) {
return il->v().toInt();
} else {
std::stringstream ss;
ss << "Option: \"" << name << "\" is not Par Int" << std::endl;
throw InternalError(ss.str());
}
}
long long int Options::getIntParam(const std::string& name, long long int def) const {
if (hasParam(name)) {
if (IntLit* il = getParam(name)->dyn_cast<IntLit>()) {
return il->v().toInt();
}
}
return def;
}
double Options::getFloatParam(const std::string& name) const {
if (FloatLit* fl = getParam(name)->dyn_cast<FloatLit>()) {
return fl->v().toDouble();
} else {
std::stringstream ss;
ss << "Option: \"" << name << "\" is not Par Float" << std::endl;
throw InternalError(ss.str());
}
}
double Options::getFloatParam(const std::string& name, double def) const {
if (hasParam(name)) {
if (FloatLit* fl = getParam(name)->dyn_cast<FloatLit>()) {
return fl->v().toDouble();
}
}
return def;
}
bool Options::getBoolParam(const std::string& name) const {
if (BoolLit* bl = getParam(name)->dyn_cast<BoolLit>()) {
return bl->v();
} else {
std::stringstream ss;
ss << "Option: \"" << name << "\" is not Par Bool" << std::endl;
throw InternalError(ss.str());
}
}
bool Options::getBoolParam(const std::string& name, bool def) const {
if (hasParam(name)) {
if (BoolLit* bl = getParam(name)->dyn_cast<BoolLit>()) {
return bl->v();
}
}
return def;
}
std::string Options::getStringParam(const std::string& name) const {
if (StringLit* sl = getParam(name)->dyn_cast<StringLit>()) {
return sl->v().str();
} else {
std::stringstream ss;
ss << "Option: \"" << name << "\" is not Par String" << std::endl;
throw InternalError(ss.str());
}
}
std::string Options::getStringParam(const std::string& name, std::string def) const {
if (hasParam(name)) {
if (StringLit* sl = getParam(name)->dyn_cast<StringLit>()) {
return sl->v().str();
}
}
return def;
}
bool Options::hasParam(const std::string& name) const {
return _options.find(name) != _options.end();
}
std::ostream& Options::dump(std::ostream& os) {
for (auto& it : _options) os << it.first << ':' << it.second() << ' ';
return os;
}
} // namespace MiniZinc